Проблема чтения объема памяти на удаленном компьютере - PullRequest
1 голос
/ 06 апреля 2011

Я пытаюсь определить объем физической памяти, установленной на компьютере.Для этого я использую WMI (через .net 4.0) и его сервисы.Проблема в том, что независимо от того, какой объем памяти у удаленного компьютера, возвращаемое значение составляет 4 ГБ.Это было протестировано на трех удаленных компьютерах:

  • Виртуальная машина, 1 ГБ ОЗУ, Windows 2003
  • Физическая машина, 2 ГБ ОЗУ, Windows XP
  • Физическая машина, 2 ГБОперативная память, Windows 7, 64-битная

Я сам использую физическую машину, 4 ГБ оперативной памяти, 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 всегда будет 4 ГБ.

Ответы [ 2 ]

4 голосов
/ 06 апреля 2011

TotalPhysicalMemory имеет громкий отказ от ответственности в документах библиотеки MSDN:

Общий объем физической памяти. Быть осознавая, что при некоторых обстоятельствах это свойство не может вернуть точное значение для физического объем памяти. Например, это не точно, если BIOS использует некоторые из физическая память. Для точного значение, используйте свойство Capacity в Вместо Win32_PhysicalMemory.

Afaik, все современные машины копируют свои BIOS в память. Я думаю, что свойство Capacity - это то, сколько памяти используется в машине, а не сколько присутствует. Это 2 гигабайта в любой 32-битной операционной системе, 4 гигабайта для 32-битного процесса в 64-битной операционной системе. Сравните, скажем, со свойством List <>. Capacity против Count.

Я получаю приличное значение для TotalPhys, 3 гигабайта, которые, как я знаю, есть на моем ноутбуке. Емкость 2 гигабайта, соответствует операционной системе. WMI иногда становится ненадежным, вряд ли он идеален.

Используйте утилиту WMI Code Creator , чтобы получить второе мнение. Я думаю, что это программа .NET 1.1, поэтому остерегайтесь ее результатов, если вы запускаете ее на 64-битной операционной системе. Если вы используете Visual Studio 2010, следите за настройкой цели платформы в вашем проекте. По умолчанию используется x86, поэтому вы будете работать в 32-битном режиме, даже в 64-битной операционной системе. Проект + Свойства, вкладка "Сборка", настройка цели платформы.

1 голос
/ 07 апреля 2011

Нашел проблему.Это с

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

линией.Правильным будет:

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

Похоже, по умолчанию это локальный компьютер.

Спасибо Гансу, который указал мне на WMI Code Creator.Этот инструмент очень помог.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...