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)
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);
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)
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();
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
Descrivere la query a WMI usando SWbemServices.ExecQuery. Questo metodo restituisce un oggetto SWbemObjectSet.
GetObject("winmgmts:").ExecQuery _ ("Select * from Win32_Service where State='Stopped'")
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++
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.
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(); }