读取远程计算机上的内存量时出现问题

时间:2011-04-06 13:15:39

标签: c# wmi

我正在尝试确定计算机中安装的物理内存量。为了实现这一点,我使用的是WMI(通过.net 4.0)及其服务。问题是无论远程计算机有多少内存,返回的值都是4GB。这已经过三台远程计算机的测试:

  • 虚拟机,1GB RAM,Windows 2003
  • 物理机,2GB内存,Windows XP
  • 物理机,2GB内存,Windows 7 64位

我自己正在运行物理机,4GB内存,Windows 7 64位。

显示代码:

uint phisicalMemorySize = 0;

ConnectionOptions co = new ConnectionOptions();
co.Username = null;

ManagementScope ms = new ManagementScope("\\\\" + computerName, co);
ObjectQuery q = new ObjectQuery("select TotalPhysicalMemory from Win32_ComputerSystem");
ManagementObjectSearcher os = new ManagementObjectSearcher(ms, q);
ManagementObjectCollection moc = os.Get();

foreach (ManagementObject o in moc)
{
    phisicalMemorySize += Convert.ToUInt64(o["TotalPhysicalMemory"], CultureInfo.InvariantCulture);
}

我也尝试过使用select Capacity from Win32_PhysicalMemoryselect TotalVisibleMemorySize from Win32_OperatingSystem作为查询,但无济于事。最后phisicalMemorySize总是4GB。

2 个答案:

答案 0 :(得分:4)

TotalPhysicalMemory在MSDN Library文档中有一个响亮的免责声明:

  

物理内存的总大小。是   意识到,在某些情况下,   这家酒店可能不会退货   物理的准确值   记忆。例如,事实并非如此   如果BIOS正在使用某些准确的   物理记忆。准确无误   value,使用Capacity属性   改为Win32_PhysicalMemory。

Afaik,所有现代机器都将BIOS复制到内存中。我认为Capacity属性是机器中可用的内存,而不是存在多少。在任何32位操作系统上都是2千兆字节,在64位操作系统上32位进程是4千兆字节。比较List<> .Capacity vs Count属性。

我为TotalPhys获得了不错的价值,我知道我在笔记本电脑上有3千兆字节。容量为2千兆字节,与操作系统相匹配。 WMI有时候会变得不稳定,但它并不完美。

使用WMI Code Creator utility获得第二意见。我认为它是一个.NET 1.1程序,所以如果你在64位操作系统上运行它,请注意它的结果。如果使用Visual Studio 2010,请注意项目中的“平台目标”设置。它默认为x86,因此即使在64位操作系统上也可以在32位模式下运行。项目+属性,构建选项卡,平台目标设置。

答案 1 :(得分:1)

发现问题。它是

ManagementScope ms = new ManagementScope("\\\\" + computerName, co);

线。正确的是

ManagementScope ms = new ManagementScope("\\\\" + computerName + "\\root\\CIMV2", co);

它看起来像默认为本地计算机。

感谢Hans将我指向WMI Code Creator。这个工具真的很有帮助。