Condividi tramite


Chiamata di una query sincrona

Una query sincrona è una query che mantiene il controllo sul processo dell'applicazione per la durata della query. Una query sincrona richiede una singola chiamata di interfaccia ed è quindi più semplice di una chiamata asincrona. Tuttavia, una query sincrona ha il potenziale di bloccare l'applicazione per query di grandi dimensioni o query su una rete.

La procedura seguente descrive come eseguire una query di dati sincrona usando PowerShell.

Per eseguire una query dati sincrona in PowerShell

  • Descrivere la query a WMI usando il cmdlet Get-WmiObject WMI e il parametro -query . Il cmdlet restituisce un singolo oggetto o una raccolta di oggetti, a seconda del numero di oggetti che soddisfano la query.

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

La procedura seguente descrive come eseguire una query di dati sincrona usando C#.

Per eseguire una query dati sincrona in C# (Microsoft.Management.Infrastructure)

  1. Descrivere la query a WMI usando CimSession.QueryInstances. Questo metodo restituisce una raccolta di oggetti 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. Usare tecniche di raccolta linguaggio C# standard per accedere a ogni oggetto restituito.

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

La procedura seguente descrive come eseguire una query di dati sincrona usando C#.

Per eseguire una query di dati sincrona in C# (System.Management)

  1. Creare la query con un oggetto ManagementObjectSearcher e recuperare le informazioni con una chiamata a ManagementObjectSearcher.Get.

    Questo metodo restituisce un oggetto ManagementObjectCollection .

    using System.Management;
    ...
    ManagementObjectSearcher mgmtObjSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk");
    ManagementObjectCollection objCol = mgmtObjSearcher.Get();
    
  2. Usare tecniche di raccolta linguaggio C# standard per accedere a ogni oggetto restituito.

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

La procedura seguente descrive come eseguire una query di dati sincrona usando VBScript.

Per eseguire una query di dati sincrona in VBScript

  1. Descrivere la query a WMI usando SWbemServices.ExecQuery. Questo metodo restituisce un oggetto SWbemObjectSet.

    GetObject("winmgmts:").ExecQuery _
            ("Select * from Win32_Service where State='Stopped'")
    
  2. Usare le tecniche di raccolta linguaggio di scripting standard per accedere a ogni oggetto restituito.

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

La procedura seguente descrive come eseguire una query di dati sincrona usando C++.

Per eseguire una query sincrona in C++

  1. Descrivere la query a WMI tramite una chiamata a IWbemServices::ExecQuery.

    Il metodo ExecQuery accetta una stringa di ricerca WQL come parametro che descrive la query. WMI esegue la query e restituisce un puntatore dell'interfaccia IEnumWbemClassObject . Tramite l'interfaccia IEnumWbemClassObject è possibile accedere alle classi o alle istanze che costituiscono il set di risultati.

  2. Dopo aver ricevuto la query, è possibile enumerare la query con una chiamata a IEnumWbemClassObject::Next. Per altre informazioni, vedere Enumerazione WMI.

    Nell'esempio di codice seguente sono necessari i riferimenti e le istruzioni di #include seguenti per la compilazione corretta.

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

    Nell'esempio di codice seguente viene descritto come eseguire query sugli oggetti che rappresentano gli utenti e i gruppi in 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();
    }