2011-04-06 39 views
1

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

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

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

显示代码:

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的查询,但无济于事也试过。在末尾总是4GB。

回答

1

发现问题。它是与

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

线。正确的将是

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

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

感谢汉斯谁向我指出WMI代码造物主。该工具真的帮助了很多。

4

TotalPhysicalMemory在MSDN库文档大声免责声明:

的物理内存的总大小。是 意识到,在某些情况下, 此属性可能不会返回 准确值的物理内存。例如,如果BIOS正在使用某些物理内存,则不是 。为了获得精确的 值,使用 Win32_PhysicalMemory而不是能力属性。

Afaik,所有现代机器都将他们的BIOS复制到内存中。我认为Capacity属性是多少内存可用机器,不存在多少。在任何32位操作系统上都是2 GB,对于64位操作系统上的32位进程则为4 GB。比较,比如,列表<> .Capacity vs Count属性。

我得到了TotalPhys的一个体面的价值,3千兆字节,我知道我在我的笔记本电脑上。容量是2千兆字节,与操作系统相匹配。 WMI有时会出现碎片,这并不完美。

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

+0

我相信你对容量错了。它返回**每个棒的容量**([点击](http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/32da73c1-de42-4c74-b59e-4f1e51d2e7a2))当然不会假设在WMI里面改变了。 RAM中的BIOS又有多大? 100 MB?这不应该太偏离我的结果。你用什么类和财产来获得笔记本电脑中提到的3 GB? – AtaSmrk 2011-04-07 07:10:26