如何从WMI获取类方法?查询时用何语句替代SELECT *?
解决WMI查询中避免
SELECT *仍可调用方法的问题 这个问题其实和WMI方法调用的底层机制有关——调用实例方法时,WMI需要知道目标实例的唯一标识路径,而这个信息存储在WMI的系统属性里,不是你看到的普通业务属性(比如Disable/Enable这些方法本身不是属性,是实例的方法)。
为什么只查普通属性会报错?
当你用SELECT YourProperty FROM someClass查询时,返回的ManagementObject只包含你指定的普通属性,缺少了WMI用来定位实例的核心系统属性(比如__PATH)。没有这个路径信息,InvokeMethod就找不到要执行方法的具体实例,自然会抛出异常。而SELECT *会返回所有属性,包括这些系统属性,所以能正常工作。
解决方案:查询必要的系统属性
你不需要查询所有属性,只要包含**__PATH**这个系统属性(它是实例的唯一绝对路径),再加上你需要的普通属性即可。比如:
using (var s = new ManagementObjectSearcher("root\\CIMV2", "SELECT __PATH, YourNeededProperty FROM someClass")) foreach (var obj in s.Get()) { // 现在调用方法不会报错了 obj.InvokeMethod("Disable", null); }
如果你根本不需要任何业务属性,只想调用方法,甚至可以只查询__PATH:
using (var s = new ManagementObjectSearcher("root\\CIMV2", "SELECT __PATH FROM someClass")) foreach (var obj in s.Get()) { obj.InvokeMethod("Enable", null); }
补充说明
__PATH是WMI实例的核心标识,它包含了实例所在的命名空间、类名和唯一键值,足够WMI定位到目标实例执行方法。- 其他可选的系统属性比如
__RELPATH(相对路径)也可以,但__PATH是绝对路径,兼容性更好。
内容的提问来源于stack exchange,提问作者ispiro
相关产品推荐
相关产品推荐

