Подключение к WMI с помощью моникера

Помимо объекта 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) может принимать следующие значения:

  1. Anonymous — Анонимный доступ, не используется.
  2. Identify — Идентификация, объект-сервер может запросить маркер доступа, свя­занный с клиентом, но не может произвести олицетво­рение, используется редко, так как доступ предоставляется только локально.
  3. Impersonate – Олицетворение, предоставляет те же права, какие имеет пользователь, чаще всего используется для удаленного доступа.
  4. Delegate – Делегирование, WMI-объект может обратиться от имени пользователя к другому WMI-объекту — не рекомендуемый уровень, так как команды можно выполнять удаленно через цепочку из нескольких компьютеров.

Примером использования может служить строчка:

"WinMgmts:{impersonationLevel=Impersonate}";

Уровень проверки подлинности DCOM (DCOM Authentication Level) может принимать следующие значения:

  1. None(Отсутствует) — Проверка подлинности отсутствует
  2. Default(По умолчанию) – Используются стандартные настройки безопасности
  3. Connect(Подключение) – Проверка подлинности только в момент подключения, далее, в ходе работы проверка отсутствует.
  4. Call(Вызов) – Проверка подлинности при каждом запросе к серверу, заголовки пакетов подписываются, но содержимое не шифруется
  5. Pkt(Пакет) – Проверка подлинности для всех пакетов которые проходят между клиентом и сервером. Заголовки пакетов не подписываются и содержимое не шифруются.
  6. PktIntegrity(Целостность пакета) — Проверка подлинности для всех пакетов которые проходят между клиентом и сервером. Заголовки пакетов подписываются, но содержимое не шифруются.
  7. 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
Оцените статью
Технологии программирования и ведение блога
Добавить комментарий