Помимо объекта SWbemLocator есть еще один альтернативный способ для получения доступа к подсистеме WMI как на локальном так и на удаленном компьютере – моникер WMI. При написании сценариев Windows Script Host для получения доступа к WMI с помощью моникера используется метод GetObject, в результате возвращается ссылка на определенный объект или конкретный экземпляр объекта библиотеки поддержки сценариев WMI, в большинстве случаев возвращается ссылка на объект SWbemServices.
Использование моникера в сценариях накладывает некоторые ограничения:
- В целях безопасности в середине HTML страницы использование моникеров нельзя.
- Процесс обращения к подсистеме WMI всегда происходит от имени текущей учетной записи, вы не сможете указать права администратора, как это было возможно при использовании объекта SWbemLocator.
И так, давайте посмотрим из чего состоит и что такое моникер. Моникер в простом варианте это строчка, которая позволяет задать путь к классу WMI, она состоит из обязательно префикса «WinMgmts: «, необязательных настроек безопасности и необязательного пути к нужному классу.
Что бы не сваливать все в одну кучу, давайте рассмотрим каждую часть по отдельности
Префикс «WinMgmts:»
Регистр символов в моникере «WinMgmts:» не имеет значения, самый простой пример использования:
Set objService = GetObject("WinMgmts:") |
Так как пространство имен и имя компьютера отсутствует, то будет производится обращение к пространству имен по умолчанию на локальном (текущем) компьютере, пространство по умолчанию прописано в реестре операционной системы по адресу HKLMSOFTWAREMicrosoft WBEMScripting Default Namespace
Теперь в переменной objService хранится ссылка на объект SWbemServices, его методы можно использовать сразу в строке с моникером. Например:
Set objProcess = GetObject("WinMgmts:").InstancesOf("Win32_Process") |
А можно прописать все и в две строки:
Set objService = GetObject("WinMgmts:") Set objProcess = objService.InstancesOf("Win32_Process") |
Гибкость использования моникера заключается и в том, что при переборе коллекции, метод GetObject() можно использовать в середине цикла For Each … in. Так, пример ниже позволяет вывести поочередно имена всех запущенных в системе процессов:
ForEach objProcess In GetObject("WinMgmts:").InstancesOf("Win32_Process") WScript.Echo objProcess.Name Next |
Настройки безопасности в моникере
При работе с WMI важным фактором является безопасность, поэтому, общая схема безопасности основывается на уровне операционной системы, а дополнительная на уровнях пространств имен и протокола DCOM. Отсюда следует, что если у пользователя нет прав на какое то действие в операционной системе, то у него и не будет прав сделать это через WMI, но даже если у пользователя есть права в системе, то это еще не факт, что такие же права будут и в WMI. Поэтому, для доступа к некоторым аспектам WMI надо дополнительно указывать уровни олицетворения, аутентификации и различные привилегии.
Теперь давайте приступим к описанию параметров безопасности, их всего четыре, они указываются в фигурных скобках сразу после префикса “WinMgmts:”.
Уровень олицетворения DCOM (DCOM Impersonation Level) может принимать следующие значения:
- Anonymous — Анонимный доступ, не используется.
- Identify — Идентификация, объект-сервер может запросить маркер доступа, связанный с клиентом, но не может произвести олицетворение, используется редко, так как доступ предоставляется только локально.
- Impersonate – Олицетворение, предоставляет те же права, какие имеет пользователь, чаще всего используется для удаленного доступа.
- Delegate – Делегирование, WMI-объект может обратиться от имени пользователя к другому WMI-объекту — не рекомендуемый уровень, так как команды можно выполнять удаленно через цепочку из нескольких компьютеров.
Примером использования может служить строчка:
"WinMgmts:{impersonationLevel=Impersonate}";
|
Уровень проверки подлинности DCOM (DCOM Authentication Level) может принимать следующие значения:
- None(Отсутствует) — Проверка подлинности отсутствует
- Default(По умолчанию) – Используются стандартные настройки безопасности
- Connect(Подключение) – Проверка подлинности только в момент подключения, далее, в ходе работы проверка отсутствует.
- Call(Вызов) – Проверка подлинности при каждом запросе к серверу, заголовки пакетов подписываются, но содержимое не шифруется
- Pkt(Пакет) – Проверка подлинности для всех пакетов которые проходят между клиентом и сервером. Заголовки пакетов не подписываются и содержимое не шифруются.
- PktIntegrity(Целостность пакета) — Проверка подлинности для всех пакетов которые проходят между клиентом и сервером. Заголовки пакетов подписываются, но содержимое не шифруются.
- PktPrivacy(Секретность пакета) – Проверка подлинности для всех пакетов которые проходят между клиентом и сервером. Заголовки пакетов подписываются, а содержимое шифруется.
Примером использования:
"WinMgmts:{authenticationLevel=pktPrivacy}";
|
источник проверки подлинности (Authority), например,
"WinMgmts:{authority=NTLMDomain:Domain1}";
|
или
"WinMgmts:{authority=Kerberos:Domainl\Serverl}"
|
назначенные или отозванные привилегии. Привилегии могут быть следующими:
CreateToken, PrimaryToken, LockMemory, IncreaseQuota, MachineAccount, Tcb, Security, TakeOwnership, LoadDriver, SystemProfile, SystemTime, ProfileSingleProcess, IncreaseBasePriority, CreatePagefile, CreatePermanent, Backup, Restore, ShutDown, Debug, Audit, SystemEnvironment, ChangeNotify, RemoteShutDown, Undock, SyncAgent и EnableDelegation.
Я не стал приводить их назначение, так как они описаны в статье “Объект SWbemSecurity”
Чаще всего используются привилегии для выключения и перезагрузки системы, например:
"WinMgmts:{(Shutdown, RemoteShutdown)}"
|
Как видно, привилегии помещаются в круглые скобки и перечисляются через запятую, для отмены привилегии перед ее именем ставится восклицательный знак. Вот пример использования нескольких параметров безопасности:
"winmgmts:{impersonationLevel=Impersonate, (Shutdown, RemoteShutdown)}" |
Путь к объекту WMI в моникере
Путь к заданному объекту формируется из имени компьютера, пространства имен, имени класса и набора ключевых свойств объекта вместе с их значениями. Сам формат строки безопасности будет зависеть от наличия в ней параметров безопасности, так, если параметры безопасности не указаны, то строка может принять следующий вид:
"WinMgmts:\\.\Root\CIMV2" "WinMgmts:\\.\Root\CIMV2:Win32_Service " "WinMgmts:\\.\Root\CIMV2:Win32_Service.Name='Alerter'" |
Точка вместо имени компьютера говорит, что подключение производится для текущей системы. Если же будут присутствовать параметры безопасности, то перед путем к объекту ставится восклицательный знак, например:
"WinMgmts: {impersonationLevel=Impersonate}!\\.\Root\CIMV2" "WinMgmts: {impersonationLevel=Impersonate}!\\.\Root\CIMV2:Win32_Service " "WinMgmts: {impersonationLevel=Impersonate}!\\.\Root\CIMV2:Win32_Service.Name='Alerter'" |
Ниже привожу пример, сценария, который будет выводить список всех запущенных в системе процессов:
set objServices = GetObject("WinMgmts:\\.\root\CIMV2").InstancesOf("Win32_Process") For Each objNamespace In objServices strResult = strResult & objNamespace.Name & VbCrLf Next Wscript.Echo strResult |