Vyvolání synchronního dotazu
Synchronní dotaz je dotaz, který udržuje kontrolu nad procesem aplikace po dobu trvání dotazu. Synchronní dotaz vyžaduje jedno volání rozhraní, a proto je jednodušší než asynchronní volání. Synchronní dotaz má ale potenciál uzamknout aplikaci pro velké dotazy nebo dotazy v síti.
Následující postup popisuje, jak pomocí PowerShellu vydat synchronní dotaz na data.
Zadání synchronního dotazu na data v PowerShellu
Popište dotaz rozhraní WMI pomocí rutiny Get-WmiObject Get-WmiObject a parametru -query. Cmdlet vrátí buď jeden objekt, nebo kolekci objektů v závislosti na tom, kolik objektů odpovídá dotazu.
Get-WmiObject -query "SELECT * FROM Win32_logicalDisk WHERE DeviceID = 'C:'"
Následující postup popisuje, jak vydat synchronní datový dotaz pomocí jazyka C#.
Vydání synchronního dotazu na data v jazyce C# (Microsoft.Management.Infrastructure)
Popište dotaz rozhraní WMI pomocí instance CimSession.QueryInstances. Tato metoda vrátí kolekci objektů 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);
Pro přístup k jednotlivým vrácených objektům použijte standardní techniky shromažďování jazyka C#.
foreach (CimInstance drive in queryInstances) { Console.WriteLine(drive.CimInstanceProperties["DeviceID"]); }
Následující postup popisuje, jak vydat synchronní datový dotaz pomocí jazyka C#.
Provedení synchronního datového dotazu v jazyce C# (System.Management)
Vytvořte dotaz pomocí objektu ManagementObjectSearcher a načtěte informace voláním metody ManagementObjectSearcher.Get.
Tato metoda vrátí ManagementObjectCollection objektu.
using System.Management; ... ManagementObjectSearcher mgmtObjSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk"); ManagementObjectCollection objCol = mgmtObjSearcher.Get();
Pro přístup k jednotlivým vrácených objektům použijte standardní techniky shromažďování jazyka C#.
foreach (ManagementObject drive in objCol) { Console.WriteLine(drive["DeviceID"]); }
Následující postup popisuje, jak vydat synchronní datový dotaz pomocí jazyka VBScript.
Vydání synchronního dotazu na data v VBScriptu
Popište dotaz rozhraní WMI pomocí SWbemServices.ExecQuery. Tato metoda vrátí SWbemObjectSet.
GetObject("winmgmts:").ExecQuery _ ("Select * from Win32_Service where State='Stopped'")
Pro přístup ke každému vrácenému objektu použijte techniky kolekce spojené se standardním skriptovacím jazykem .
for each Service in _ GetObject("winmgmts:").ExecQuery _ ("Select * from Win32_Service where State='Stopped'") WScript.Echo " "& Service.DisplayName & " [", Service.Name, "]" next
Následující postup popisuje, jak vydat synchronní datový dotaz pomocí jazyka C++.
Vydání synchronního dotazu v jazyka C++
Popište svůj dotaz na WMI prostřednictvím volání IWbemServices::ExecQuery.
Metoda ExecQuery přebírá hledaný řetězec WQL jako parametr, který popisuje váš dotaz. WMI provede dotaz a vrátí ukazatel rozhraní IEnumWbemClassObject. Prostřednictvím rozhraní IEnumWbemClassObject můžete přistupovat ke třídám nebo instancím, které tvoří sadu výsledků.
Po přijetí dotazu můžete vytvořit výčet dotazu voláním IEnumWbemClassObject::Next. Další informace naleznete v oddílu Výčet WMI.
Následující příklad kódu vyžaduje, aby byly správně kompilovány následující odkazy a příkazy #include.
#include <wbemidl.h> #include <iostream> using namespace std;
Následující příklad kódu popisuje, jak dotazovat na objekty, které představují uživatele a skupiny ve službě 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(); }