Найти максимальное количество процессов в Windows без WMI

#c #windows #go #wmi

#c #Windows #Вперед #wmi

Вопрос:

В настоящее время наше решение для мониторинга использует WMI для нескольких своих показателей, однако при загрузке WMI работает ужасно и часто не возвращается вовремя, вызывая большое количество ложных предупреждений о различных вещах, находящихся в автономном режиме, или отсутствующих показателях.

Замена запросов WMI вызовами функций Windows, найденных в psapi.h, sysinfoapi.h и других, разрешила большинство из них и возвращает примерно в 100 раз быстрее, однако я не могу найти способ получить эквивалентное значение запроса WMI Win32_OperatingSystem.Максимальное количество процессов

Определение из документации Windows здесь гласит:

 MaxNumberOfProcesses

Data type: uint32

Access type: Read-only

Qualifiers: MappingStrings ("MIB.IETF|HOST-RESOURCES-MIB.hrSystemMaxProcesses")

Maximum number of process contexts the operating system can support. 
The default value set by the provider is 4294967295 (0xFFFFFFFF). If there is no fixed maximum, the value should be 0 (zero). On systems that have a fixed maximum, this object can help diagnose failures that occur when the maximum is reached—if unknown, enter 4294967295 (0xFFFFFFFF).

This property is inherited from CIM_OperatingSystem.
 

Я протестировал это значение примерно на 10 разных машинах, каждая с разным количеством процессоров и оперативной памяти, все из которых вернули указанное выше значение по умолчанию 4294967295 (0xFFFFFFFF). Должен ли я предположить, что Windows на самом деле просто отправляет обратно это значение напрямую, или я должен возвращать значение ULONG_MAX , или есть другой способ найти, каким должно быть это значение?

Я попытался найти способ получить доступ к MIB хоста для Windows, но не могу найти никаких подробностей о нем, кроме как с помощью какого-либо внешнего инструмента, а не напрямую через код.

В настоящее время я программирую это на языке GO, используя библиотеки C.

Если кто-нибудь может дать представление о том, как получить это значение без использования WMI, я был бы очень признателен.

Комментарии:

1. Windows не имеет установленного максимума, практический предел — «насколько позволяет память». Подробности здесь . Напрашивается вопрос, почему это свойство вообще существует, оно имеет значение для unix. Настолько простое решение: нет смысла запрашивать его.

2. @HansPassant Спасибо за информацию. Я уже просматривал этот пост раньше, однако он по-прежнему не имел для меня смысла, когда я видел, что на самом деле исходит из запроса, и что в документации указано, что если нет фиксированного максимального значения, оно должно быть установлено равным 0, что явно было не так. Наверное, я просто предположу, что Windows возвращает значение по умолчанию, потому что оно «насколько позволяет память». Спасибо

Ответ №1:

Вы можете использовать CIM_OperatingSystem class CIM (общие информационные модели) https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/cim-operatingsystem

 [Abstract, UUID("{8502C565-5FBB-11D2-AAC1-006008C78BC7}"), AMENDMENT]
class CIM_OperatingSystem : CIM_LogicalElement
{
  string   Caption;
  string   CreationClassName;
  string   CSCreationClassName;
  string   CSName;
  sint16   CurrentTimeZone;
  string   Description;
  boolean  Distributed;
  uint64   FreePhysicalMemory;
  uint64   FreeSpaceInPagingFiles;
  uint64   FreeVirtualMemory;
  datetime InstallDate;
  datetime LastBootUpTime;
  datetime LocalDateTime;
  uint32   MaxNumberOfProcesses;   <----------------------------------------
  uint64   MaxProcessMemorySize;
  string   Name;
  uint32   NumberOfLicensedUsers;
  uint32   NumberOfProcesses;
  uint32   NumberOfUsers;
  uint16   OSType;
  string   OtherTypeDescription;
  uint64   SizeStoredInPagingFiles;
  string   Status;
  uint64   TotalSwapSpaceSize;
  uint64   TotalVirtualMemorySize;
  uint64   TotalVisibleMemorySize;
  string   Version;
};
 

DMTF (целевая группа распределенного управления) CIM (общая информация
Классы модели) являются родительскими классами, на основе которых
создаются классы WMI. в настоящее время WMI поддерживает только схемы версии CIM 2.x.

Если количество процессов на компьютере не ограничено MaxNumberOfProcesses , 0

Максимальное количество контекстов процессов, которые может поддерживать операционная система. Если нет фиксированного максимума, значение должно быть 0. В системах с фиксированным максимумом этот объект может помочь диагностировать сбои, возникающие при достижении максимума.

О связи между WMI и CIM см. https://www.red-gate.com/simple-talk/sysadmin/powershell/powershell-day-to-day-admin-tasks-wmi,-cim-and-pswa/

Общая информационная модель

Начиная с третьей версии PowerShell, в Windows Server 2012 и Windows 8 был введен новый модуль, который называется CIMCmdlets. Он был добавлен для замены устаревших командлетов WMI. Если вы регулярно используете WMI, то вы не потеряетесь при переходе к новым командлетам, поскольку в них много общего.

Первая команда для использования — Get-CimInstance:

PS> Get-CimInstance -Class Win32_Process

Вы заметите, что можно делать запросы к классам WMI. Чтобы дать простое резюме:

 Get-WmiObject is replaced by Get-CimInstance
Get-WmiObject -list is replaced by Get-CimClass
 

Давайте подробно рассмотрим новую функциональность, представленную CIM

Пространство имен: https://wutils.com/wmi/root/cimv2/properties/maxnumberofprocesses.html

Комментарии:

1. О, хорошо. Я думал, что WMI — это реализация схем CIM от Microsoft. Я не знал, что существуют сами классы CIM. Если это классы, из которых построен WMI, будут ли они иметь те же проблемы с производительностью или будут более эффективными, поскольку мы пропускаем слой?

2. Я не могу понять, как получить доступ к этому классу через CIMWin32.dll

3. Попробуйте получить его с Get-CimInstance помощью PowerShell docs.microsoft.com/en-us/powershell/module/cimcmdlets /…

4. Это абстрактный класс, в powershell он снова вычисляется через WMI в случае win32: docs.microsoft.com/de-de/powershell/scripting/samples /… . И он находится в пространстве root/CIMV2 имен также в 64-разрядном

5. @retryW Смотрите примеры кода при получении класса WMI и Win32_OperatingSystem .