为了简单起见,我需要管理和更新大约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年的软件中的所有其他问题。
任何帮助或建议都会很棒。谢谢! :)
答案 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查询。给你执行代码。