WMI查询虚拟机返回本地信息

时间:2014-01-15 15:12:52

标签: c# sql-server wmi virtual-machine remote-access

为了简单起见,我需要管理和更新大约150个虚拟服务器的列表。我想获得一些关于它们的信息,但是为了举例,我想我只想要虚拟机的RAM和物理处理器。

但是,当我查询虚拟服务器时,返回的信息只是有关我本地计算机的信息,而不是虚拟计算机的信息。我不知道去哪儿了。我得到的最大帮助来自http://blogs.technet.com/b/richard_macdonald/

我的应用程序是用C#.NET编写的,connstr是从以下字符创建的字符串:

SqlConnectionStringBuilder stb = new SqlConnectionStringBuilder();
stb.DataSource = lbxConnections.SelectedItem.ToString();
stb.IntegratedSecurity = true;

string connstr = stb.ToString();

其中lbxConnections是一个列表框,其中填充了来自我的活动sql server数据库的连接信息。

我用来查询虚拟机的代码,在成功连接到虚拟机并确保它存在之后,如下所示

using (SqlConnection conn = new SqlConnection(connstr))

跳转到以下代码块

ManagementScope manScope = new ManagementScope(@"\\" + connstr + "\root\virtualization");
ObjectQuery queryObj = new ObjectQuery("SELECT * FROM Win32_ComputerSystem");
ManagementObjectSearcher vmSearcher = new ManagementObjectSearcher(manScope, queryObj);
ManagementObjectCollection vmCollection = vmSearcher.Get();

foreach (ManagementObject vm in vmCollection)
{
    txtPhysicalProcessors.Text = (vm["NumberOfProcessors"]).ToString();
    txtRam.Text = Convert.ToString(Math.Round(Convert.ToDouble(vm.Properties["TotalPhysicalMemory"].Value) / 1073741824, 1)) + " GB";
}

如果我的问题不属于社区标准,我很抱歉,因为这是我在StackOverflow上发表的第一篇文章之后,在过去的帖子中回答了4年的软件中的所有其他问题。

任何帮助或建议都会很棒。谢谢! :)

1 个答案:

答案 0 :(得分:0)

您必须调整ManagementScope才能使其正常工作。而不是您现在给出的connstr,而是将其替换为ip-address或VMMware实例的名称。 (我个人大多使用目标机器的名称)另外,在这种情况下,你必须使用\来逃避\\

到目前为止,这是我第一次看到使用SqlConnectionString的WMI查询,怀疑它是否可能。

ManagementScope manScope = new ManagementScope(@"\\\\" + myServerName+ \\root\\virtualization");  
ObjectQuery queryObj = new ObjectQuery("SELECT * FROM Win32_ComputerSystem");
ManagementObjectSearcher vmSearcher = new ManagementObjectSearcher(manScope, queryObj);

foreach (ManagementObject ob in vmSearcher.Get())
{
    txtPhysicalProcessors.Text = ob["NumberOfProcessors"].ToString();
    txtRam.Text = Convert.ToString(Math.Round(Convert.ToDouble(ob["TotalPhysicalMemory"].ToString()) / 1073741824, 1)) + " GB";
}

另外,请查看this link,它可能有助于在C#中生成WMI查询。给你执行代码。