叫用同步查詢
同步查詢是一種查詢類型,能在查詢期間保持對應用程式處理過程的控制權。 同步查詢需要單一介面呼叫,因此比異步呼叫更簡單。 不過,同步查詢有可能凍結您的應用程式,特別是在進行大規模查詢或透過網路進行查詢時應用程式可能會無法響應。
下列程序說明如何使用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(); }