首先瞭解一下WMI.NET中查詢類的結構:
基礎類是System.Management.ManagementQuery,代表抽象的管理查詢類型,它繼承ICloneable。ManagementQuery是抽象類別,它有兩個重要的屬性:QueryLanguage和QueryString(都是字串類型),分別代表查詢語言和查詢字串。雖然ManagementQuery類型是抽象類別,但其內部建構函式的查詢語言就是WMI中的WQL語言:
因此無論是使用ManagementQuery的繼承類ObjectQuery還是WqlObjectQuery都可以快速構建一個WQL查詢的ManagementQuery對象:
var query = new ObjectQuery("SELECT * FROM Win32_OperatingSystem");
當然用SelectQuery去構建選取查詢也是可以的。SelectQuery相對ManagementQuery增加了ClassName屬性代表類名稱,Condition屬性代表條件,SelectedProperties屬性代表要選擇的屬性名稱。
比如上面的用ObjectQuery構建的查詢Win32_OperationSystem的WQL查詢用SelectQuery這樣構建:
var selQuery = new SelectQuery("Win32_OperationSystem");
當然可以有更複雜的查詢,比如分別用ObjectQuery和SelectQuery查詢可移動磁碟的名稱:
//用ObjectQuery和SelectQuery
var objQuery = new ObjectQuery("SELECT Name FROM Win32_LogicalDick WHERE DriveType = 2");
var selQuery = new SelectQuery("LogicalDick", "DriveType = 2", new string[] { "Name" });
事件查詢也類似,可以使用直接繼承與ManagementQuery的EventQuery類型寫事件查詢WQL:
var eveQuery = new EventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE TargetInstance ISA Win32_Process");
或者用WqlEventQuery類型(繼承自EventQuery類型)。這個類有EventClassName屬性代表事件類型名稱。Condition代表條件。和WithinInterval代表等待時間(WQL中的WITHIN),當然還有許多更進階的WQL查詢元素,讀者可以參考:http://msdn.microsoft.com/zh-cn/library/system.management.wqleventquery。
比如上面的EventQuery對象用WqlEventQuery重寫:
var wqlEveQuery = new WqlEventQuery("__InstanceCreationEvent", TimeSpan.FromSeconds(10), "TargetInstance ISA Win32_Process");