我正在尝试确定计算机中安装的物理内存量。为了实现这一点,我使用的是WMI(通过.net 4.0)及其服务。问题是无论远程计算机有多少内存,返回的值都是4GB。这已经过三台远程计算机的测试:
我自己正在运行物理机,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_PhysicalMemory
和select TotalVisibleMemorySize from Win32_OperatingSystem
作为查询,但无济于事。最后phisicalMemorySize
总是4GB。
答案 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。这个工具真的很有帮助。