Sdílet prostřednictvím


Vyvolání synchronního dotazu

Synchronní dotaz je dotaz, který udržuje kontrolu nad procesem aplikace po dobu trvání dotazu. Synchronní dotaz vyžaduje jedno volání rozhraní, a proto je jednodušší než asynchronní volání. Synchronní dotaz má ale potenciál uzamknout aplikaci pro velké dotazy nebo dotazy v síti.

Následující postup popisuje, jak pomocí PowerShellu vydat synchronní dotaz na data.

Zadání synchronního dotazu na data v PowerShellu

  • Popište dotaz rozhraní WMI pomocí rutiny Get-WmiObject Get-WmiObject a parametru -query. Cmdlet vrátí buď jeden objekt, nebo kolekci objektů v závislosti na tom, kolik objektů odpovídá dotazu.

    Get-WmiObject -query "SELECT * FROM Win32_logicalDisk WHERE DeviceID = 'C:'"
    

Následující postup popisuje, jak vydat synchronní datový dotaz pomocí jazyka C#.

Vydání synchronního dotazu na data v jazyce C# (Microsoft.Management.Infrastructure)

  1. Popište dotaz rozhraní WMI pomocí instance CimSession.QueryInstances. Tato metoda vrátí kolekci objektů CimInstance.

    using Microsoft.Management.Infrastructure;
    ...
    string Namespace = @"root\cimv2";
    string diskDriveQuery = "SELECT * FROM Win32_LogicalDisk";
    CimSession mySession = CimSession.Create("localhost");
    IEnumerable<CimInstance> queryInstances = mySession.QueryInstances(Namespace, "WQL", diskDriveQuery);
    
  2. Pro přístup k jednotlivým vrácených objektům použijte standardní techniky shromažďování jazyka C#.

    foreach (CimInstance drive in queryInstances)
    {
       Console.WriteLine(drive.CimInstanceProperties["DeviceID"]);
    }
    

Následující postup popisuje, jak vydat synchronní datový dotaz pomocí jazyka C#.

Provedení synchronního datového dotazu v jazyce C# (System.Management)

  1. Vytvořte dotaz pomocí objektu ManagementObjectSearcher a načtěte informace voláním metody ManagementObjectSearcher.Get.

    Tato metoda vrátí ManagementObjectCollection objektu.

    using System.Management;
    ...
    ManagementObjectSearcher mgmtObjSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk");
    ManagementObjectCollection objCol = mgmtObjSearcher.Get();
    
  2. Pro přístup k jednotlivým vrácených objektům použijte standardní techniky shromažďování jazyka C#.

    foreach (ManagementObject drive in objCol)
    {
       Console.WriteLine(drive["DeviceID"]);
    }
    

Následující postup popisuje, jak vydat synchronní datový dotaz pomocí jazyka VBScript.

Vydání synchronního dotazu na data v VBScriptu

  1. Popište dotaz rozhraní WMI pomocí SWbemServices.ExecQuery. Tato metoda vrátí SWbemObjectSet.

    GetObject("winmgmts:").ExecQuery _
            ("Select * from Win32_Service where State='Stopped'")
    
  2. Pro přístup ke každému vrácenému objektu použijte techniky kolekce spojené se standardním skriptovacím jazykem .

    for each Service in _ 
        GetObject("winmgmts:").ExecQuery _
            ("Select * from Win32_Service where State='Stopped'")
        WScript.Echo "  "& Service.DisplayName & " [", Service.Name, "]"
    next
    

Následující postup popisuje, jak vydat synchronní datový dotaz pomocí jazyka C++.

Vydání synchronního dotazu v jazyka C++

  1. Popište svůj dotaz na WMI prostřednictvím volání IWbemServices::ExecQuery.

    Metoda ExecQuery přebírá hledaný řetězec WQL jako parametr, který popisuje váš dotaz. WMI provede dotaz a vrátí ukazatel rozhraní IEnumWbemClassObject. Prostřednictvím rozhraní IEnumWbemClassObject můžete přistupovat ke třídám nebo instancím, které tvoří sadu výsledků.

  2. Po přijetí dotazu můžete vytvořit výčet dotazu voláním IEnumWbemClassObject::Next. Další informace naleznete v oddílu Výčet WMI.

    Následující příklad kódu vyžaduje, aby byly správně kompilovány následující odkazy a příkazy #include.

    #include <wbemidl.h>
    #include <iostream>
    using namespace std;
    

    Následující příklad kódu popisuje, jak dotazovat na objekty, které představují uživatele a skupiny ve službě WMI.

    void ExecQuerySync(IWbemServices *pSvc)
    {
        // Query for all users and groups.
    
        BSTR Language = SysAllocString(L"WQL");
        BSTR Query = SysAllocString(L"SELECT * FROM __Namespace");
    
        // Initialize the IEnumWbemClassObject pointer.
        IEnumWbemClassObject *pEnum = 0;
    
        // Issue the query.
        HRESULT hRes = pSvc->ExecQuery(
            Language,
            Query,
            WBEM_FLAG_FORWARD_ONLY,         // Flags
            0,                              // Context
            &pEnum
            );
    
        SysFreeString(Query);
        SysFreeString(Language);
    
        if (hRes != 0)
        {
            printf("Error\n");
            return;
        }
    
        ULONG uTotal = 0;
    
        // Retrieve the objects in the result set.
        for (;;)
        {
            IWbemClassObject *pObj = 0;
            ULONG uReturned = 0;
    
            hRes = pEnum->Next(
                0,                  // Time out
                1,                  // One object
                &pObj,
                &uReturned
                );
    
            uTotal += uReturned;
    
            if (uReturned == 0)
                break;
    
            // Use the object.
    
            // ...
    
            // Release it.
            // ===========
    
            pObj->Release();    // Release objects not owned.            
        }
    
        // All done.
        pEnum->Release();
    }