WMI-фильтры - создание и проверка
В одной из своих прошлых заметок я упомянул вскользь о возможности применения wmi-фильтров к компьютерам под управлениям Windows XP (смотрите шаг 7-8 указанной статьи). В сети интернет существует довольно много подобных примеров, но прежде чем слепо доверять безвестным авторам и применять их на практике у себя, советую вам прочитать алгоритм самостоятельного создания и проверки правильности данных wmi-фильтров.
Для начала необходимо получить цифровое соответствие той или иной версии операционной системы. Сделать это вы можете командами ver
или systeminfo
:
C:\>ver Microsoft Windows [Version 6.1.7601] C:\>systeminfo | find "Версия ОС" Версия ОС: 6.1.7601 Service Pack 1 сборка 7601
Итак, получаем номера последних на сегодняшний момент версий ОС (в порядке возрастания):
- Windows XP SP3 — 5.1.260;
- Windows Server 2003 (R2) SP2 — 5.2.3790;
- Windows Vista SP2 — 6.0.6002;
- Windows Server 2008 SP2 — 6.0.6002;
- Windows 7 SP1 — 6.1.7601;
- Windows Server 2008 R2 SP1 — 6.1.7601;
- Windows 8 — 6.2.9200;
- Windows Server 2012 — 6.2.9200;
- Windows 8.1 — 6.3.9600;
- Windows Server 2012 R2 — 6.3.9600;
- Windows 10 — 10.0.10586.
Цифровое соответствие версии не зависит от разрядности операционной системы, а так же от её редакции (home/professional/enterprise и т.д.).
Теперь приведу некоторые wmi-фильтры, используемые мной в оснастке управления групповой политикой:
notXPandx86 – фильтр для выявления компьютеров, отличных от Windows XP с разрядностью ОС х86:
select * from Win32_OperatingSystem where version >'5.1.2600' and OSArchitecture='32-bit'
WindowsXP – фильтр для выявления компьютеров под управлением Windows XP:
select * from Win32_OperatingSystem where version='5.1.2600' and ProductType='1'
×86 – фильтр для выявления компьютеров с ОС x86 разрядности:
select * from Win32_Processor where AddressWidth='86'
×64 – фильтр для выявления компьютеров с ОС x64 разрядности:
select * from Win32_Processor where AddressWidth='64'
Чтобы проверить любой wmi-фильтр, необходимо на домен контроллере (у меня он под управлением Windows Server 2012 R2) открыть Модуль Active Directory для Windows PowerShell, либо нажать Win+R и выполнить команду: %windir%\system32\WindowsPowerShell\v1.0\powershell.exe -noexit -command import-module ActiveDirectory
.
Далее наберём следующую последовательность команд:
PS C:\> $comps = Get-ADComputer -filter * | foreach {$_.name} PS C:\> $query = {select * from Win32_OperatingSystem where version='5.1.2600' and ProductType='1'} PS C:\> foreach ($comp in $comps) {gwmi -computername $comp -query $query | select PSComputername}
Первой командой мы в массив $comps
заносим имена всех компьютеров домена.
Во второй команде в переменную $query
мы прописываем интересующий нас запрос (будущий wmi-фильтр).
Третьей командой мы осуществляем поиск интересующих нас компьютеров, соответствующих нашему запросу (в примере – все компьютеры с ОС Windows XP) (gwmi – сокращённое от Get-WmiObject).
В результате отработки команды вы увидите все интересующие вас компьютеры. Так же в вывод попадут ошибки вида:
gwmi : Сервер RPC недоступен. (Исключение из HRESULT: 0x800706BA) строка:1 знак:28 + foreach ($comp in $comps) {gwmi -computername $comp -query $query | select PSCom ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [Get-WmiObject], COMException + FullyQualifiedErrorId : GetWMICOMException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
Означающие, что компьютер домена, к которому сервер пытается сделать запрос, в настоящее время выключен.
В оснастке Просмотр событий -> Журналы Windows -> Система при этом вы обнаружите ошибки следующего вида:
Не удалось установить связь DCOM с компьютером XXX через какой-либо из настроенных протоколов; запрос от PID 14f0 (C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe).
Так же вы можете увидеть ошибку вида (гораздо реже):
gwmi : Отказано в доступе. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED))
Она означает, что пользователь, от имени которого осуществляется запрос, не имеет прав на компьютер, к которому в данный момент осуществляется запрос.
Чтобы этого избежать, добавьте в запрос ключ -erroraction SilentlyContinue
. Третья строка примет вид:
PS C:\> foreach ($comp in $comps) {gwmi -computername $comp -query $query -erroraction SilentlyContinue | select PSComputername}
Проверить результат выполнения этой последовательности команд вы сможете следующей образом:
PS C:\> Get-ADComputer -Filter * -Properties OperatingSystem | Where {$_.OperatingSystem -match "Windows XP"} | select DNSHostName | sort DNSHostName
При построении запроса, необходимо точно знать, что в wmi пространстве имён root/CIMV2 в классе, в котором вы планируете осуществляете поиск в новом wmi-фильтре, присутствуют универсальные для различных операционных систем ключи. Проверить это можно задав вопрос к компьютерам с заранее известной ОС:
PS C:\> gwmi -computername compXP -Class Win32_OperatingSystem | select * PS C:\> gwmi -computername compXP -Class Win32_ComputerSystem | select * PS C:\> gwmi -computername compXP -Class Win32_PhysicalMemory | select * PS C:\> gwmi -computername compXP -Class Win32_Processor | select *
Теперь несколько наглядных примеров. Мной будет использоваться пример с последовательностью команд. Изменяться будет только сам запрос $query
:
$query = {select * from Win32_OperatingSystem where version='6.1.7601' and OSArchitecture!='64-bit'}— Windows 7 32-bit;
$query = {select * from Win32_OperatingSystem where version='6.1.7601' and OSArchitecture='32-bit'}— опять же Windows 7 32-bit (в данных запросах OSArchitecture!=‘64-bit’ идентично OSArchitecture=‘32-bit’);
$query = {select * from Win32_OperatingSystem where version >='6.1.7601' and ProductType='1'}— ОС старше или равно Windows 7 (рабочая станция, т.к. ProductType=‘1’. Если ProductType=‘3’ – то выберутся серверные ОС);
$query = {select * from Win32_OperatingSystem where version >'5.1.2600' and OSArchitecture='32-bit'}— ОС старше Windows XP и с разрядностью x86;
$query = {select * from Win32_OperatingSystem where version like '6.1%' and OSArchitecture='64-bit'}— поиск ОС по маске (до любого необходимого вам знака). в данном случае выберутся 64-х битные ОС Windows 7 и Windows Server 2008 R2. (Поиск операционок по маске очень полезно при работе с Windows 10).
Напоследок небольшой совет. Старайтесь использовать максимально простые фильтры, чтобы потом мучительно долго не разбираться, почему к определённой группе компьютеров не применяется та или иная политика.
Надеюсь, кому-нибудь данный материал окажется полезным. Удачи!