如何在C#中正确实现指定WMI查询?
正确实现PowerShell WMI查询对应的C#代码
你的C#代码抛出"Invalid query"异常的核心原因是误用了meta_class——这个WQL语句用于查询WMI类的元数据信息,而非目标类的实例。而你要实现的是和PowerShell中Get-WMIObject等价的功能,即直接查询MDM_DevDetail_Ext01类的实例并应用过滤条件。
正确的C#实现代码
using System.Management; // 初始化WMI命名空间范围 ManagementScope scope = new ManagementScope(@"\\localhost\root\cimv2\mdm\dmmap"); scope.Connect(); // 构造正确的WQL查询:直接从目标类查询,带上过滤条件 ObjectQuery query = new ObjectQuery( "SELECT * FROM MDM_DevDetail_Ext01 WHERE InstanceID='Ext' AND ParentID='./DevDetail'" ); using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query)) using (ManagementObjectCollection results = searcher.Get()) { foreach (ManagementObject obj in results) { // 处理查询到的实例数据,示例:输出属性值 Console.WriteLine($"Device ID: {obj["DeviceID"]}"); // 根据业务需求访问其他属性 } }
关键说明
- 移除
meta_class相关逻辑,直接指定目标类MDM_DevDetail_Ext01作为查询源 - 过滤条件和PowerShell的
Filter参数保持一致,直接写入WQL的WHERE子句 - 新增
ManagementObjectCollection的using块,确保资源被正确释放 - 可根据实际需求遍历查询结果,访问实例的对应属性
内容的提问来源于stack exchange,提问作者Duncan Groenewald
相关产品推荐
相关产品推荐

