叫用同步查詢
同步查詢是一種查詢,可維護應用程式在查詢期間之程式的控制權。 同步查詢需要單一介面呼叫,因此比非同步呼叫更為簡單。 不過,同步查詢可能會鎖定您的應用程式,以便透過網路進行大型查詢或查詢。
下列程式說明如何使用 PowerShell 發出同步資料查詢。
若要在 PowerShell 中發出同步資料查詢
使用 WMI Get-WmiObject Cmdlet 和 -query 參數來描述 WMI 的查詢。 Cmdlet 會傳回單一物件或 物件的集合,視查詢符合多少物件而定。
Get-WmiObject -query "SELECT * FROM Win32_logicalDisk WHERE DeviceID = 'C:'"
下列程式說明如何使用 C# 發出同步資料查詢。
若要在 C# (Microsoft.Management.Infrastructure) 中發出同步資料查詢
使用 CimSession.QueryInstances 描述 WMI 的查詢。 這個方法會傳回 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);
使用標準 C# 語言集合技術來存取每個傳回的物件。
foreach (CimInstance drive in queryInstances) { Console.WriteLine(drive.CimInstanceProperties["DeviceID"]); }
下列程式說明如何使用 C# 發出同步資料查詢。
若要在 C# (System.Management) 中發出同步資料查詢
使用 ManagementObjectSearcher 物件建立查詢,並使用 對 ManagementObjectSearcher.Get的呼叫來擷取資訊。
這個方法會傳回 ManagementObjectCollection 物件。
using System.Management; ... ManagementObjectSearcher mgmtObjSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk"); ManagementObjectCollection objCol = mgmtObjSearcher.Get();
使用標準 C# 語言集合技術來存取每個傳回的物件。
foreach (ManagementObject drive in objCol) { Console.WriteLine(drive["DeviceID"]); }
下列程式說明如何使用 VBScript 發出同步資料查詢。
在 VBScript 中發出同步資料查詢
使用 SWbemServices.ExecQuery描述 WMI 的查詢。 這個方法會傳回 SWbemObjectSet。
GetObject("winmgmts:").ExecQuery _ ("Select * from Win32_Service where State='Stopped'")
使用標準指令碼語言 集合 技術來存取每個傳回的物件。
for each Service in _ GetObject("winmgmts:").ExecQuery _ ("Select * from Win32_Service where State='Stopped'") WScript.Echo " "& Service.DisplayName & " [", Service.Name, "]" next
下列程式描述如何使用 C++ 發出同步資料查詢。
若要在 C++ 中發出同步查詢
透過 呼叫 IWbemServices::ExecQuery來描述對 WMI 的查詢。
ExecQuery方法會採用 WQL 搜尋字串作為描述查詢的參數。 WMI 會執行查詢並傳回 IEnumWbemClassObject 介面指標。 透過 IEnumWbemClassObject 介面,您可以存取組成結果集的類別或實例。
收到查詢之後,您可以使用 對 IEnumWbemClassObject::Next的呼叫來列舉查詢。 如需詳細資訊,請參閱 列舉 WMI。
下列程式碼範例需要下列參考和#include語句才能正確編譯。
#include <wbemidl.h> #include <iostream> using namespace std;
下列程式碼範例說明如何查詢代表 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(); }