Share via


Aufrufen einer synchronen Abfrage

Eine synchrone Abfrage ist eine Abfrage, die für die Dauer der Abfrage die Kontrolle über den Prozess Ihrer Anwendung behält. Eine synchrone Abfrage erfordert einen einzelnen Schnittstellenaufruf und ist daher einfacher als ein asynchroner Aufruf. Eine synchrone Abfrage bringt jedoch die Gefahr mit sich, Ihre Anwendung bei großen Abfragen oder Abfragen über ein Netzwerk zu sperren.

Im folgenden Verfahren wird beschrieben, wie Sie eine synchrone Datenabfrage mithilfe von PowerShell ausgeben.

So geben Sie eine synchrone Datenabfrage in PowerShell aus

  • Beschreiben Sie Ihre Abfrage für WMI mithilfe des WMI-Cmdlets Get-WmiObject und des Parameters -query. Das Cmdlet gibt entweder ein einzelnes Objekt oder eine Auflistung von Objekten zurück, je nachdem, wie viele Objekte der Abfrage entsprechen.

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

Im folgenden Verfahren wird beschrieben, wie Sie eine synchrone Datenabfrage mithilfe von C# ausgeben.

So geben Sie eine synchrone Datenabfrage in C# (Microsoft.Management.Infrastructure) aus

  1. Beschreiben Sie Ihre Abfrage für WMI mithilfe von CimSession.QueryInstances. Diese Methode gibt eine Auflistung von CimInstance-Objekten zurück.

    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. Verwenden Sie Standardsammlungstechniken der Sprache C#, um auf die einzelnen zurückgegebenen Objekte zuzugreifen.

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

Im folgenden Verfahren wird beschrieben, wie Sie eine synchrone Datenabfrage mithilfe von C# ausgeben.

So geben Sie eine synchrone Datenabfrage in C# (System.Management) aus

  1. Erstellen Sie die Abfrage mit einem ManagementObjectSearcher-Objekt, und rufen Sie die Informationen mit einem Aufruf von ManagementObjectSearcher.Get ab.

    Diese Methode gibt ein ManagementObjectCollection-Objekt zurück.

    using System.Management;
    ...
    ManagementObjectSearcher mgmtObjSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk");
    ManagementObjectCollection objCol = mgmtObjSearcher.Get();
    
  2. Verwenden Sie Standardsammlungstechniken der Sprache C#, um auf die einzelnen zurückgegebenen Objekte zuzugreifen.

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

Im folgenden Verfahren wird beschrieben, wie Sie eine synchrone Datenabfrage mithilfe von VBScript ausgeben.

So geben Sie eine synchrone Datenabfrage in VBScript aus

  1. Beschreiben Sie Ihre Abfrage für WMI mithilfe von SWbemServices.ExecQuery. Diese Methode gibt ein SWbemObjectSet zurück.

    GetObject("winmgmts:").ExecQuery _
            ("Select * from Win32_Service where State='Stopped'")
    
  2. Verwenden Sie Standardtechniken der Skriptsprache für Sammlungen, um auf die einzelnen zurückgegebenen Objekte zuzugreifen.

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

Im folgenden Verfahren wird beschrieben, wie Sie eine synchrone Datenabfrage mithilfe von C++ ausgeben.

So geben Sie eine synchrone Abfrage in C++ aus

  1. Beschreiben Sie Ihre Abfrage für WMI durch einen Aufruf von IWbemServices::ExecQuery.

    Die ExecQuery-Methode verwendet eine WQL-Suchzeichenfolge als Parameter, der Ihre Abfrage beschreibt. WMI führt die Abfrage aus und gibt einen IEnumWbemClassObject-Schnittstellenzeiger zurück. Über die IEnumWbemClassObject-Schnittstelle können Sie auf die Klassen oder Instanzen zugreifen, aus denen das Resultset besteht.

  2. Nachdem Sie Ihre Abfrage erhalten haben, können Sie Ihre Abfrage mit einem Aufruf von IEnumWbemClassObject::Next auflisten. Weitere Informationen finden Sie unter WMI-Enumeration.

    Das folgende Codebeispiel erfordert die folgenden Verweise und #include-Anweisungen für eine ordnungsgemäße Kompilierung.

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

    Im folgenden Codebeispiel wird beschrieben, wie Sie die Objekte abfragen, die die Benutzer und Gruppen in WMI darstellen.

    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();
    }