#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
.