Udostępnij za pośrednictwem


Wywoływanie zapytania synchronicznego

Zapytanie synchroniczne to zapytanie, które utrzymuje kontrolę nad procesem aplikacji na czas trwania zapytania. Zapytanie synchroniczne wymaga pojedynczego wywołania interfejsu i dlatego jest prostsze niż wywołanie asynchroniczne. Jednak zapytanie synchroniczne może zablokować aplikację w przypadku dużych zapytań lub zapytań za pośrednictwem sieci.

Poniższa procedura opisuje sposób wystawiania synchronicznego zapytania danych przy użyciu programu PowerShell.

Aby wydać synchroniczne zapytanie o dane w programie PowerShell

  • Opisz zapytanie w usłudze WMI przy użyciu polecenia cmdlet get-WmiObject get-WmiObject i parametru -query. Polecenie cmdlet zwraca pojedynczy obiekt lub kolekcję obiektów w zależności od tego, ile obiektów pasuje do zapytania.

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

Poniższa procedura opisuje sposób wystawiania synchronicznego zapytania danych przy użyciu języka C#.

Aby wysłać synchroniczne zapytanie danych w języku C# (Microsoft.Management.Infrastructure)

  1. Opisz zapytanie w usłudze WMI przy użyciu klasy CimSession.QueryInstances. Ta metoda zwraca kolekcję obiektów 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. Użyj standardowych technik kolekcji w języku C#, aby uzyskać dostęp do każdego zwróconego obiektu.

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

Poniższa procedura opisuje sposób wystawiania synchronicznego zapytania danych przy użyciu języka C#.

Aby wysłać synchroniczne zapytanie danych w języku C# (System.Management)

  1. Utwórz zapytanie za pomocą obiektu ManagementObjectSearcher i pobierz informacje za pomocą wywołania ManagementObjectSearcher.Get.

    Ta metoda zwraca obiekt ManagementObjectCollection.

    using System.Management;
    ...
    ManagementObjectSearcher mgmtObjSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk");
    ManagementObjectCollection objCol = mgmtObjSearcher.Get();
    
  2. Użyj standardowych technik obsługi kolekcji w języku C#, aby uzyskać dostęp do każdego zwróconego obiektu.

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

Poniższa procedura opisuje sposób wystawiania synchronicznego zapytania danych przy użyciu języka VBScript.

Aby wykonać synchroniczne zapytanie o dane w VBScript

  1. Opisz zapytanie w usłudze WMI przy użyciu SWbemServices.ExecQuery. Ta metoda zwraca SWbemObjectSet.

    GetObject("winmgmts:").ExecQuery _
            ("Select * from Win32_Service where State='Stopped'")
    
  2. Użyj standardowego języka skryptów kolekcji technik uzyskiwania dostępu do każdego zwróconego obiektu.

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

Poniższa procedura opisuje sposób wystawiania synchronicznego zapytania danych przy użyciu języka C++.

Aby wydać zapytanie synchroniczne w języku C++

  1. Opisz zapytanie w usłudze WMI za pomocą wywołania metody IWbemServices::ExecQuery.

    Metoda ExecQuery przyjmuje ciąg wyszukiwania WQL jako parametr opisujący zapytanie. Usługa WMI wykonuje zapytanie i zwraca wskaźnik interfejsu IEnumWbemClassObject. Za pomocą interfejsu IEnumWbemClassObject można uzyskać dostęp do klas lub wystąpień tworzących zestaw wyników.

  2. Po otrzymaniu zapytania możesz wyliczyć zapytanie za pomocą wywołania metody IEnumWbemClassObject::Next. Aby uzyskać więcej informacji, zobacz Wyliczanie WMI.

    Poniższy przykład kodu wymaga następujących odwołań i instrukcji #include w celu poprawnego skompilowania.

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

    W poniższym przykładzie kodu opisano sposób wykonywania zapytań dotyczących obiektów reprezentujących użytkowników i grupy w usłudze 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();
    }