hyperv wmi 如何将参数作为字符串传递?

hyperv wmi How to pass a parameter as a string?

我使用较新的 Microsoft.Management.Infrastructure,我想将参数传递给 class Msvm_VirtualSystemManagementService:

的 ModifySystemSettings 方法

https://docs.microsoft.com/en-us/windows/win32/hyperv_v2/modifysystemsettings-msvm-virtualsystemmanagementservice

参数类型是一个嵌入Msvm_VirtualSystemSettingData实例的字符串。

在旧版本 System.Management 中,可以使用 ManagementBaseObject.GetText(TextFormat.WmiDtd20) 将其转换为字符串:

https://docs.microsoft.com/en-us/dotnet/api/system.management.managementbaseobject.gettext?view=netframework-4.8

以下代码显示了 ModifySystemSettings 方法的当前实现。 问题是 snapshotInstance.ToString() 显然是错误的。有谁知道如何正确传递参数?


CimInstance snapshotInstance = session.EnumerateAssociatedInstances(hvNamespace, vm, "Msvm_MostCurrentSnapshotInBranch", "Msvm_VirtualSystemSettingData", null, null).FirstOrDefault();

snapshotInstance.CimInstanceProperties["ElementName"].Value = "testSnapshot";
CimMethodParametersCollection modifySystemSettingsParameters = new CimMethodParametersCollection
{
     CimMethodParameter.Create("SystemSettings",snapshotInstance.ToString(),CimType.String, CimFlags.In)
       };

if(virtualSystemManagementService != null)
{
      CimMethodResult result = session.InvokeMethod(hvNamespace, virtualSystemManagementService, "ModifySystemSettings", modifySystemSettingsParameters);
      Console.WriteLine(result.ReturnValue.Value.ToString());
}

我的目标是更改快照的名称。

一段时间后,我找到了正确的解决方案。

CimSerializer 帮我把它转换成字符串。

这是背后的代码:

CimSerializer serializer = CimSerializer.Create();
byte[] serializedClass = serializer.Serialize(snapshotInstance, InstanceSerializationOptions.None);
CimMethodParametersCollection modifySystemSettingsParameters = new CimMethodParametersCollection
{
       CimMethodParameter.Create("SystemSettings",System.Text.Encoding.Unicode.GetString(serializedClass),CimType.String, CimFlags.In)
};