Delen via


Een synchrone query aanroepen

Een synchrone query is een query die de controle over het proces van uw toepassing behoudt voor de duur van de query. Een synchrone query vereist één interfaceaanroep en is daarom eenvoudiger dan een asynchrone aanroep. Er is echter een risico dat een synchrone query uw toepassing vergrendelt, vooral bij grote query's en query's via een netwerk.

In de volgende procedure wordt beschreven hoe u een synchrone gegevensquery uitvoert met behulp van PowerShell.

Een synchrone gegevensquery uitvoeren in PowerShell

  • Beschrijf uw query naar WMI met behulp van de cmdlet WMI Get-WmiObject en de parameter -query. De cmdlet retourneert één object of een verzameling objecten, afhankelijk van het aantal objecten dat past bij de query.

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

In de volgende procedure wordt beschreven hoe u een synchrone gegevensquery uitvoert met behulp van C#.

Een synchrone gegevensquery uitvoeren in C# (Microsoft.Management.Infrastructure)

  1. Beschrijf uw query naar WMI met CimSession.QueryInstances. Met deze methode wordt een verzameling CimInstance-objecten geretourneerd.

    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. Gebruik standaard C#-taalverzamelingstechnieken voor toegang tot elk geretourneerd object.

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

In de volgende procedure wordt beschreven hoe u een synchrone gegevensquery uitvoert met behulp van C#.

Een synchrone gegevensquery uitvoeren in C# (System.Management)

  1. Maak de query met een ManagementObjectSearcher--object en haal de gegevens op met een aanroep naar ManagementObjectSearcher.Get.

    Met deze methode wordt een ManagementObjectCollection--object geretourneerd.

    using System.Management;
    ...
    ManagementObjectSearcher mgmtObjSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk");
    ManagementObjectCollection objCol = mgmtObjSearcher.Get();
    
  2. Gebruik standaard C#-taalverzamelingstechnieken voor toegang tot elk geretourneerd object.

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

In de volgende procedure wordt beschreven hoe u een synchrone gegevensquery uitvoert met behulp van VBScript.

Een synchrone gegevensquery uitvoeren in VBScript-

  1. Beschrijf uw query naar WMI met behulp van SWbemServices.ExecQuery-. Met deze methode wordt een SWbemObjectSetgeretourneerd.

    GetObject("winmgmts:").ExecQuery _
            ("Select * from Win32_Service where State='Stopped'")
    
  2. Gebruik standaardscripttaal verzameling technieken voor toegang tot elk geretourneerd object.

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

In de volgende procedure wordt beschreven hoe u een synchrone gegevensquery uitvoert met C++.

Een synchrone query uitvoeren in C++

  1. Beschrijf uw query naar WMI via een aanroep naar IWbemServices::ExecQuery.

    De methode ExecQuery gebruikt een WQL-zoekreeks als een parameter die uw query beschrijft. WMI voert de query uit en retourneert een IEnumWbemClassObject interfaceaanwijzer. Via de interface IEnumWbemClassObject hebt u toegang tot de klassen of exemplaren waaruit de resultatenset bestaat.

  2. Nadat u uw query hebt ontvangen, kunt u uw query opsommen met een aanroep naar IEnumWbemClassObject::Next. Zie WMI-opsommen voor meer informatie.

    Voor het volgende codevoorbeeld zijn de volgende verwijzingen en #include instructies vereist om correct te compileren.

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

    In het volgende codevoorbeeld wordt beschreven hoe u een query uitvoert op de objecten die de gebruikers en groepen in WMI vertegenwoordigen.

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