使用WMI类读取Hyper-V中的VM的RAM和磁盘利用率
问题描述:
我是WMI类的新手,我想在C#代码中使用WMI类读取Hyper-V上不同虚拟机的CPU,RAM和磁盘利用率。使用WMI类读取Hyper-V中的VM的RAM和磁盘利用率
CPU使用率:能够通过使用性能ProcessorLoad和ProcessorLoadHistory
得到它 ManagementBaseObject outParams = virtualSystemService.InvokeMethod("GetSummaryInformation", inParams, null);
ManagementBaseObject[] summaryInformationArray = (ManagementBaseObject[])outParams["SummaryInformation"];
内存使用率:没有能够得到当前内存使用率的动态和静态分配的精确值。 'Msvm_MemorySettingData'类的VirtualQuantity和Reservation属性给出了动态RAM情况下的启动RAM值和静态RAM情况下分配的RAM的最小值。
HardDisk利用率:无法获得每个虚拟机的硬盘利用率。
我的代码是:
public static ManagementObject GetTargetComputer(string vmElementName, ManagementScope scope)
{
string query = string.Format("select * from Msvm_ComputerSystem Where ElementName = '{0}'", vmElementName);
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, new ObjectQuery(query));
ManagementObjectCollection computers = searcher.Get();
ManagementObject computer = null;
foreach (ManagementObject instance in computers)
{
computer = instance;
break;
}
return computer;
}
void GetSummaryInformation(ManagementObject virtualSystemSettings, UInt32[] requestedInformation, ManagementObject virtualSystemService)
{
ManagementBaseObject inParams = virtualSystemService.GetMethodParameters("GetSummaryInformation");
string[] settingPaths = new string[1];
settingPaths[0] = virtualSystemSettings.Path.Path;
inParams["SettingData"] = settingPaths;
inParams["RequestedInformation"] = requestedInformation;
ManagementBaseObject outParams = virtualSystemService.InvokeMethod("GetSummaryInformation", inParams, null);
UInt32 v = (UInt32)outParams["ReturnValue"];
if ((UInt32)outParams["ReturnValue"] == 0)
{
ManagementBaseObject[] summaryInformationArray = (ManagementBaseObject[])outParams["SummaryInformation"];
foreach (ManagementBaseObject summaryInformation in summaryInformationArray)
{
foreach (UInt32 requested in requestedInformation)
{
string Name = summaryInformation["Name"].ToString();
switch (requested)//103, 106, 109, 104, 3, 4, 101, 105
{
case 103:
string MemoryUsage = summaryInformation["MemoryUsage"].ToString();
break;
case 112:
Int32 MemoryAvailable = (Int32)summaryInformation["MemoryAvailable"];
break;
case 113:
Int32 AvailableMemoryBuffer = (Int32)summaryInformation["AvailableMemoryBuffer"];
break;
}
}
}
}
else
{
Console.WriteLine("Failed to retrieve virtual system summary information");
}
inParams.Dispose();
outParams.Dispose();
}
ManagementObject virtualSystem = GetTargetComputer(vm["ElementName"].ToString(), Scope);
ManagementObjectCollection virtualSystemSettings = virtualSystem.GetRelated
(
"Msvm_VirtualSystemSettingData",
"Msvm_SettingsDefineState",
null,
null,
"SettingData",
"ManagedElement",
false,
null
);
ManagementObject virtualSystemSetting = null;
foreach (ManagementObject instance in virtualSystemSettings)
{
virtualSystemSetting = instance;
foreach (ManagementObject memorySettingData in virtualSystemSetting.GetRelated("Msvm_MemorySettingData"))
{
string HeartBeat = (string)memorySettingData["Heartbeat"];
string MemoryUsage = (string)memorySettingData["MemoryUsage"];
string VirtualQuantity = (string)memorySettingData["VirtualQuantity"];
string Limit = (string)memorySettingData["Limit"];
}
}
UInt32[] requestedInfo = { 103, 112, 113 };
GetSummaryInformation(virtualSystemSetting, requestedInfo, virtualSystemService);
是否有可能得到各个虚拟机的Hyper-V中使用WMI类当前的内存使用率和硬盘的利用率?
答
要找出内存使用率,您可能想看看下面的“Hyper-V的动态内存”例如:
https://code.msdn.microsoft.com/windowsdesktop/Hyper-V-dynamic-memory-9b0b1d05
它也可以为您提供有关如何获取其他信息洞察力你正在寻找。
请不要包含关于问题标题中使用的语言的信息,除非在没有它的情况下没有意义。标签用于此目的。 –