【问题标题】:WMI query on virtual machine returning local info虚拟机上的 WMI 查询返回本地信息
【发布时间】:2014-02-04 03:20:18
【问题描述】:

为了简单起见,我需要管理和更新大约 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 服务器数据库中的连接信息。

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

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 年软件中的所有其他问题。

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

【问题讨论】:

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


    【解决方案1】:

    您必须调整您的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 查询。给你代码来执行。

    【讨论】:

    • 我的 connstr 是从我所做的查询中生成的,该查询提取了我的虚拟机的名称或 ip。我插入问题的第一个代码块使用我对虚拟机地址表的查询并填充 lbxConnections,然后使用选定的值连接到 WMI 并查询虚拟信息。
    • 所以如果我理解正确,你的 connstr 看起来不像"Sever=x;Initial catalog=x;username=x;password=x;"?只是出于好奇,如果您对服务器的名称或 IP 进行硬编码(并设置双 ``,您会得到任何结果吗?
    • 它没有,在存储我的管理员凭据后,connstr 看起来像“Data Source=x; Integrated Security=True”,其中 Data Source 是我尝试的虚拟机的 ip 或名称访问。
    • 我明白了,管理范围的问题是,由于内部信息过多,它可能无法正常工作。我过去使用过的所有范围都归结为:\\\\myServer\\root\\virtualization。也许我不够清楚,但这就是设置范围所要做的一切。如果要添加凭据,请使用 ManagementScope 重载构造函数和 ConnectionOptions
    • 我没有将我的凭据存储在 ManagementScope 中,我将其存储在使用以下方法的方法中:PrincipalContext(ContextType.Domain)ValidateCredentials。我真的一直在与这个程序发生争执。
    猜你喜欢
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    相关资源
    最近更新 更多