Секреты Windows: статьи о реестре, rundll32.exe, программах
Приложение B. Работа с WMI - Сервер сценариев Windows Дата: 11 июня 2009, четверг
Вы написали интересную статью на околокомпьютерную тематику? Мы можем опубликовать ее на своем сайте (http://www.onestyle.com.ua). Естественно, мы сохраним ваши авторские права, и укажем при публикации все реквизиты, которые вы посчитаете нужным указать: от вашего ника и имени, до адреса вашего сайта и места вашего жительства.
А теперь давайте рассмотрим несколько простых примеров использования инструментария управления Windows в сервере сценариев WSH.
Первый пример будет очень простым. В нем мы попробуем отредактировать параметр реестра при помощи одного из методов класса WMI. Например, давайте изменим параметр строкового типа Auto из ветви реестра HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug.
Давайте детально рассмотрим данный пример.
Моникер
С помощью первой строки примера мы подключаемся к репозитарию CIM и получаем указатель на объект WMI, определенный моникером, являющимся атрибутом метода GetObject.
Моникером называется объект, предназначенный для доступа к другому объекту.
Наиболее простой синтаксис моникера следующий: Winmgmts::«класс»[.«ключевое свойство»=«значение»]. С его помощью мы подключаемся к классу или экземпляру класса (если указывается ключевое свойство и значение) пространства имен Root\cimv2 (именно оно используется по умолчанию). В качестве примера можно привести следующий моникер: winmgmts::Win32_Service.Name="DHCP".
Если же вам нужно изменить пространство имен, к которому вы подключаетесь, а также компьютер, тогда нужно воспользоваться следующим синтаксисом моникера: Winmgmts:\\[«компьютер»]\«пространство имен»:«класс»[.«ключевое свойство»=«значение»]. Если вместо названия компьютера поставить точку, тогда подключение будет выполнено к локальному компьютеру. Например, winmgmts:\\.\Root\Cimv2:Win32_Service.Name="DHCP" или winmgmts://NOUT/Root/Cimv2:Win32_Service.Name="DHCP".
Заметьте, что в первом случае для указания пространства имен и подключаемого компьютера мы используем символ «\», а во втором случае — символ «/». Эти символы равнозначны.
Уровень заимствования прав
Следующий пример моникера: Winmgmts:[{impersonationLevel=«уровень заимствования прав»}!]\\[«компьютер»]\«пространство имен»:«класс»[.«ключевое свойство»=«значение»]. В нем мы используем новое ключевое слово impersonationLevel, которое определяет уровень заимствования прав пользователя. Возможны следующие уровни заимствования.
Anonymous. Использовать минимальные привилегии.
Identify. Запросить привилегии пользователя, если будет нужно. По умолчанию же использовать минимальные привилегии.
Impersonate. Использовать привилегии пользователя.
Уровень аутентификации
Еще один пример моникера: Winmgmts:[{impersonationLevel=«уровень заимствования прав», AuthenticationLevel=«уровень аутентификации»}!]\\[«компьютер»]\«пространство имен»:«класс»[.«ключевое свойство»=«значение»]. В нем мы используем ключевое слово AuthenticationLevel, которое определяет уровень аутентификации и может принимать следующие значения.
Default. Использовать настройки аутентификации Windows. Данный уровень используется по умолчанию.
None. Не производить аутентификацию.
Connect. Выполнять аутентификацию клиента только при соединении с сервером.
Call. Выполнять аутентификацию клиента при получении любого запроса от сервера.
Pkt. Проверять все данные, получаемые от клиента.
PktIntegrity. Проверять любые данные, переданные как сервером, так и клиентом.
PktPrivacy. Проверять любые данные, переданные как сервером, так и клиентом, а также выполнять шифрование аргументов удаленных вызовов процедур.
Привилегии
И еще один пример синтаксиса моникера: Winmgmts:[{impersonationLevel=«уровень заимствования прав», AuthenticationLevel=«уровень аутентификации»}, (привилегия, привилегия и т.д.)!]\\[«компьютер»]\«пространство имен»:«класс»[.«ключевое свойство»=«значение»]. В нем мы указываем дополнительные привилегии (если перед привилегией поставить восклицательный знак, тогда ее использование будет запрещено). Например, возможны следующие
привилегии.
Audit. Разрешить создание записей в стандартном журнале SECURITY (eventvwr.msc).
ChangeNotify. По умолчанию привилегия установлена. Разрешает не проходить все проверки прав доступа пользователя.
CreatePageFile. Разрешить создание файла подкачки.
CreatePermanent. Разрешить создание постоянного объекта.
CreateToken. Разрешить создание первичного маркера.
Backup. Разрешить выполнение операций архивирования.
Debug. Разрешить отладку процесса.
EnableDelegation. Разрешить делегирование для учетных записей.
IncreaseBasePriority. Разрешить увеличение приоритета процесса.
IncreaseQuota. Разрешить увеличение квоты, назначенной процессу.
LoadDriver. Разрешить загрузку и выгрузку драйверов устройств.
LockMemory. Разрешить блокировку страниц памяти.
MachineAccount. Разрешить создание привилегированной учетной записи.
PrimaryToken. Разрешить назначение первичного маркера процесса.
ProfileSingleProcess. Разрешить сбор информации о профилях для одиночного процесса.
Например, чтобы разрешить выполнение перезагрузки компьютера, нужно использовать моникер winmgmts:{impersonationLevel = Impersonate, (Shutdown)}!\\.\root\cimv2:Win32_OperatingSystem.
Вызов методов WMI
При помощи второй строки примера мы вызываем метод класса, позволяющий изменить значение параметра строкового типа. Как правило, каждый метод после своей работы возвращает код выполнения, который определяет либо ошибку, произошедшую при работе метода, либо то, что метод выполнен без ошибок (в этом случае всегда возвращается значение 0).
Использование WQL-запросов
Еще одним способом работы с репозитарием CIM является выполнение запросов WQL (листинг 9.2).
WQL-запрос к репозитарию CIM выполняется с помощью метода ExecQuery объекта SWbemServices объектной модели WMI. Заметьте, как именно возвращается результат запроса — в виде массива. Мы же с помощью цикла for each in выполняем перечисление каждого из элементов массива.
Редактирование значений свойств
Следующий листинг приводит пример изменения значения свойства экземпляра класса.
Обратите внимание, что после записи в свойство при помощи строки вида «объект».«свойство»=«значение», необходимо использовать метод Put_ данного объекта. С его помощью новое значение сохраняется в репозитарии CIM (если его не использовать, тогда свойство будет изменяться только на момент работы сценария, после чего опять принимать свое исходное значение).