Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何调用ManagementBaseObject方法或获取ManagementObject? TL/DR:_C#_Wmi - Fatal编程技术网

C# 如何调用ManagementBaseObject方法或获取ManagementObject? TL/DR:

C# 如何调用ManagementBaseObject方法或获取ManagementObject? TL/DR:,c#,wmi,C#,Wmi,主要问题是:我得到一个ManagementBaseObject作为返回值。但是我不能调用它的方法,因为它没有InvokeMethod()成员,就像ManagementObject一样。那么我如何调用它的成员方法呢 阐述: 我打开一个BcdStore对象: var bcdCls = new ManagementClass(@"root\WMI", "BcdStore", null); // OpenStore is a static method var m

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

阐述: 我打开一个
BcdStore
对象:

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);
但这个物体是无用的:

// 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!

这可能是一个错误,因为如果
Type
的值为
CimType.Object
(),则
PropertyData
总是返回
ManagementBaseObject
InvokeMethod
的返回值也是
ManagementBaseObject
(),除非使用了
ManagementOperationObserver

没有观察员的示例:

// result is ManagementBaseObject
// result["__GENUS"] == 2
var result = bcdCls.InvokeMethod("OpenStore", methodParams, null);
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
}
观察者的例子:

// result is ManagementBaseObject
// result["__GENUS"] == 2
var result = bcdCls.InvokeMethod("OpenStore", methodParams, null);
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
方法在内部使用()。所以你可以向微软汇报

最后,解决方法:

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
}

这个问题可能会有所帮助,这取决于你最终要做什么:@PaulGriffin,我可以通过这个或那个方法实现战略目标(这就是我实际做的),但我真的想理解这里的逻辑:这种情况很奇怪,我得到了一个返回的对象,我应该可以用它做一些事情,但我找不到它是如何完成的……在使用
管理操作观察服务器的示例中,我如何将
BcdStore
作为
管理对象
获取?无论
results=bcd.InvokeMethod(…,“OpenStore”,…)
返回
ManagementBaseObject
还是
ManagementObject
,我需要的
ManagementObject
就是
results[“store”]
返回的内容。此断言失败:
Assert.IsInstanceOfType(bcd.InvokeMethod(…,“OpenStore”,…)[“store”],typeof(ManagementObject))否,因为
结果[“存储”]
正在获取仅返回
ManagementBaseObject的属性值。您可以使用反射来获取
管理对象
或。您还可以使用我的答案向Microsoft报告“InvokeMethod”的奇怪行为/错误。这是一个精英级的答案——这是肯定的,但我现在带着复杂的感觉接受它,因为它依赖于反射和私有字段名称。谁知道它什么时候会破裂?我觉得很奇怪,微软设法不去注意这个主要的“错误”——这让我怀疑这不是一个错误,这是错误的做法。。。