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)
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);
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)
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();
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
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'")
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++
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.
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(); }