首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何调用ManagementBaseObject方法或获取ManagementObject?

如何调用ManagementBaseObject方法或获取ManagementObject?
EN

Stack Overflow用户
提问于 2015-03-22 09:16:40
回答 1查看 4.5K关注 0票数 2

TL/DR:

主要问题是:我得到一个ManagementBaseObject作为返回值。但是我不能调用它的方法,因为它没有InvokeMethod()成员,就像ManagementObject一样。那么,我如何调用它的成员方法呢?

阐述:

我打开一个BcdStore对象:

代码语言:javascript
复制
var bcdCls = new ManagementClass(@"root\WMI", "BcdStore", null); // OpenStore is a static method
var methodParams = bcdCls.GetMethodParameters("OpenStore");
methodParams["file"] = ""; // the default store
var results = bcdCls.InvokeMethod("OpenStore", methodParams, null);
Assert.IsNotNull(results);
var store = results["store"] as ManagementBaseObject;
Assert.IsNotNull(store);

但是这个对象是无用的:

代码语言:javascript
复制
// unfortunately, it is not a ManagementObject, so no InvokeMethod() is possible :-(
Assert.IsNull(store as ManagementObject);
store.InvokeMethod("EnumerateObjects", new object[] { 0 }); // Compilation error!
// ManagementBaseObject doesn't have an InvokeMethod member method!
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-25 21:00:57

可能是一个bug,因为PropertyData总是返回ManagementBaseObject,如果Type的值是CimType.Object (来源),那么InvokeMethod的返回值也是ManagementBaseObject(来源),除非使用ManagementOperationObserver

没有观察者的例子:

代码语言:javascript
复制
// result is ManagementBaseObject
// result["__GENUS"] == 2
var result = bcdCls.InvokeMethod("OpenStore", methodParams, null);

一个观察者的例子:

代码语言:javascript
复制
var observer = new ManagementOperationObserver();

observer.ObjectReady += ObjectReady;
bcd.InvokeMethod(observer, "OpenStore", methodParams, null);

void ObjectReady(object sender, ObjectReadyEventArgs e)
{
    // e.NewObject is ManagementObject
    // e.NewObject["__GENUS"] == 2
}

在第二个片段中,我们有一个ManagementObject,因为ManagementBaseObject.GetBaseObject方法是在内部使用的(来源)。这样你就可以向微软汇报了。

最后,解决办法是:

代码语言:javascript
复制
var bcd = new ManagementClass(@"root\WMI", "BcdStore", null);
var openStoreParams = bcd.GetMethodParameters("OpenStore");

openStoreParams["File"] = "";

var openStoreResult = bcd.InvokeMethod("OpenStore", openStoreParams, null);
var openedStore = (ManagementObject)typeof(ManagementBaseObject)
    .GetMethod("GetBaseObject", BindingFlags.Static | BindingFlags.NonPublic)
    .Invoke(
        null,
        new object[]
        {
            typeof(ManagementBaseObject)
                .GetField("_wbemObject", BindingFlags.Instance | BindingFlags.NonPublic)
                .GetValue(openStoreResult["Store"]),
            bcd.Scope
        }
    );
var enumObjectsParams = openedStore.GetMethodParameters("EnumerateObjects");

enumObjectsParams["Type"] = 0;

var enumObjectsResult = openedStore.InvokeMethod("EnumerateObjects", enumObjectsParams, null);
var enumObjects = (ManagementBaseObject[])enumObjectsResult["Objects"];

foreach (var enumObject in enumObjects)
{
    // Do something
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29192707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档