WMI фильтры групповых политики позволяют создать дополнительные условия, в которых определяются параметры компьютеров, к которым нужно нужно применять настройки GPO. Например, с помощью WMI фильтра вы можете применить политику к компьютерам с определенным версией Windows; с определенными настройками; характеристиками оборудования (размеру RAM, HDD); на которых установлена определенная программа; к компьютерам в указанной IP подсети и т.д.
WMI (Windows Management Instrumentation) фильтр в GPO представляет собой запрос на языке WQL (WMI Query Language). Доменный компьютер перед тем, как применить конкретный объект GPO, выполняет такой WMI запрос и опрашивает свое состояние. Если состояние компьютера соответствует условиям выполняются, такая групповая политика будет применена к компьютеру.
Как создать и привязать WMI фильтр к GPO
Для управления WMI фильтрами используется консоль управления доменными групповыми политиками .
- Откройте консоль
gpmc.msc
- Перейдите в раздел WMI Filters и создайте новый фильтр
- Укажите название фильтра и описание (не обязательно)
- Нажмите Add. Выберите пространство имен WMI (в большинстве случаев используется root\CIMv2). Укажите код WMI запроса в следующем формате:
Select * from <WMI Class> WHERE <Property> = <Value>
Например, следующий WMI запрос можно использовать, чтобы применить GPO только к компьютерам с Windows 10 и 11:Select * from Win32_OperatingSystem where Version like "10.%" and ProductType="1"
- Теперь WMI фильтр можно привязать к GPO. Например, вы хотите, чтоб политика установки принтеров применялась только к компьютерам с Windows 10 и 11. В разделе WMI Filtering групповой политики выберите WMI фильтр, который вы создали.
- Обновите настройки GPO на клиентах. Теперь политика будет применяться только к компьютерам, которые удовлетворяют условиям WMI фильтра. Для анализа примененных политики можно использовать команду gpresult /r. Если политика действует на клиента, но не применяется из-за WMI фильтра, такая политика в отчете gpresult будет иметь статус
Filtering: Denied (WMI Filter)
и указано имя WMI фильтра.
Примеры WMI запросов для фильтров GPO
Рассмотрим часто используемые примеры WMI запросов для фильтров GPO.
В зависимости от типа ОС:
- ProductType=1 – рабочая станция (клиентская версия Windows)
- ProductType=2 – контроллер домена AD
- ProductType=3 – серверная ОС (Windows Server)
В зависимости от версии Windows:
Version like "X.X%"
- Windows Server 2016/2019/2022 и Windows 10/11 — 10.%
- Windows Server 2012 R2 и Windows 8.1 — 6.3%
- Windows Server 2012 и Windows 8 — 6.2%
- Windows Server 2008 R2 и Windows 7 — 6.1%
- Windows Server 2008 и Windows Vista — 6.0%
- Windows Server 2003 — 5.2%
- Windows XP — 5.1%
С помощью логических операторов AND и OR можно комбинировать несколько условий в WMI запросе. Например, чтобы применить GPO только к серверам с Windows Server 2019:
select * from Win32_OperatingSystem WHERE Caption LIKE "%2019%" AND Version LIKE "10.%" AND ( ProductType = "2" or ProductType = "3")
Компьютеры с 64 битными версиями Windows 10:
select * from Win32_OperatingSystem WHERE Version like "10.%" AND ProductType="1" AND OSArchitecture = "64-bit"
Компьютеры с определенным билдом Windows 11 (например, 23H2, билд 22631):
select * from Win32_OperatingSystem WHERE Caption like "%Windows 11%" AND ProductType="1" AND BuildNumber = "22631"
Применить политику только к виртуальным машинам VMWare:
SELECT Model FROM Win32_ComputerSystem WHERE Model LIKE "%VMware%"
Применить политику только к ноутбукам:
select * from Win32_ComputerSystem where PCSystemType="2"
Только к десктопным компьютерам (рабочим станциям):
select * from Win32_ComputerSystem where PCSystemType="1" or PCSystemType="3"
WMI фильтр для выбора компьютеров, чьи имена начинаются на “msk-pc
SELECT Name FROM Win32_ComputerSystem WHERE Name LIKE "msk-pc%"
Применить политику только к компьютерам в определенных IP подсетях (WMI фильтр для привязки GPO к IP подсети):
Select * FROM Win32_IP4RouteTable WHERE (Mask='255.255.255.255' AND (Destination Like '192.168.1.%' OR Destination Like '192.168.2.%'))
Компьютеры с более чем 4 ГБ RAM:
Select * from WIN32_ComputerSystem where TotalPhysicalMemory >= 4200000000
Компьютеры, на которых установлен архиватор 7ZIP:
Select * From Win32_Product where Name like "%7-Zip %"
На которых установлен Internet Explorer (по умолчанию IE удален в современных версиях Windows):
SELECT path,filename,extension,version FROM CIM_DataFile WHERE path="\\Program Files\\Internet Explorer\\" AND filename="iexplore" AND extension="exe" AND version>"11.0"
Проверка WMI фильтров с помощью PowerShell
WMI фильтры перед применением в GPO можно протестировать на целевых компьютерах. Это позволит понять, будет или не будет политика с таким WMI запросов применяться на определенных компьютерах. Для просмотра всех доступных WMI классов на компьютере выполните PowerShell команду:
Get-WmiObject -List
Вывести доступные атрибуты и значения WMI класса Win32_OperatingSystem:
Get-WMIObject Win32_OperatingSystem| Select *
Чтобы проверить ваш WMI запроса на компьютере и понять, соответствует ли компьютер данному запросу или нет, укажите его код в параметре -query. Например, такой WMI запрос проверяет, установлен ли на компьютере Microsoft Office:
Get-WmiObject -query 'Select * From Win32_Product where Name like "%Office 16 Click-to-Run%"'
Если такая команда возвращает в ответ список атрибутов, значит компьютер соотвествует вашему запросу и GPO с таким WMI фильтром будет применена. Если команда get-wmiobject ничего не вернула — компьютер не соответствует запросу.
Get-CimInstance
.WMI фильтры GPO позволяют создать динамические правила, в которых определяются характеристики компьютеров, к которым нужно применить групповые политики.
SELECT * FROM Win32_OperatingSystem WHERE (Version LIKE '6.2%' OR Version LIKE '6.3%') AND ProductType = '1'
ЗЫ. Добавил в статью значение WMI параметров Version для Windows 8.1 и Windows 2012 R2
Могли бы вы привести пример, как сделать двойное условие.
Например: компьютеры с Windows XP и ОЗУ<1 Гб
проблема в том что секции FROM разные и соответсвенно просто добавить в Where AND не работает.
Сложные конструкции с объединениями (как в SQL) на WQL построить не получиться, это все таки узкоспециализированный язык. Но при создании WMI фильтра можно указать несколько разных WMI запросов. При выполнении фильтрации они будут применяться по-очереди
Первый запрос:
SELECT * FROM Win32_OperatingSystem WHERE Version LIKE "5.1%" AND ProductType = "1"
Второй запрос:
SELECT * FROM WIN32_ComputerSystem WHERE TotalPhysicalMemory >= 1073741824
Это я увидел, но выполняя эти запросы по очереди будут выбраны сначала все компьютеры с windows xp (с любым объёмом памяти) а потом все компьютеры с ОЗУ меньше 1 Гб (с любой виндовс), а мне нужны компьютер удовлетворяющие одновременно двум условиям…
А не проще воспользоваться item-level targeting в GPP (group pilicy preferences)?
Например, с помощью WMI фильтра выбираем машины с XP, а в GPP делаем условие, что применять политику если RAM< 1 Gb
Верно, по очереди, но результат второго запроса не будет зависеть от первого. Т.е. только логическое ИЛИ.
Это ж СКУЭЛЬ, попробуйте объединение запросов через JOIN
Спасибо за фильтры. Люблю тебя)
Подскажите.
Создал политику, которая назначает принтеры.
WMI-фильтры не устанавливал.
Решил исключить из этой политики компы с серверной ОС, создал фильтр, написал запрос: Select * from Win32OperatingSystem where ProductType=1
После назначил политике фильтр и в итоге, политика не рпименяется нигде.
И так прошел месяц. Жаль что ответа не дождался:(
Пропустил ваше сообщение, каюсь. Какая версия схемы AD, ОС на контроллере домена и на клиенте, с которого выполняете редактирование GPO?
select * from Win32_OperatingSystem where ProductType ="1"
Мне так и не удалось начать использовать WMI фильтры в домене где все DC работают на Windows Server 2012R2. 🙁 Полазил по форумам и нашим и буржуйским — везде одно и то же «20120R2? не будет работать»
может починят когда-нибудь?
Не тестировал фильтры на чистом домене 2012R2. Максимальный уровень схемы пока 2012.
Так фильтры создаются и не применяются, или даже не создаются? Лог gpresult парсили?
Фильтр создается. При создании фильтра вылезает матюг (см картинку)
Не смотря на предпреждение, продолжаю делать GPO
По gpresult вот что выдается (сама политика пустая), но мог бы хотя бы написать про Empty GP? Мне кажется, просто ничего не видится. Если нужно, выдачу gpresult скину полностью на почту.
COMPUTER SETTINGS
——————
CN=IMPAD02,OU=Domain Controllers,DC=***,DC=***
Last time Group Policy was applied: 15.10.2015 at 15:31:31
Group Policy was applied from: IMPAD02.***.***
Group Policy slow link threshold: 500 kbps
Domain Name: ***
Domain Type: Windows 2008 or later
Applied Group Policy Objects
——————————
Default Domain Controllers Policy
WSUS Update Servers
Power Options
Default Domain Policy
Local Group Policy
Ответил, но тут пока ответа не вижу.
Если не появится, продублирую
Появление ошибки — похоже просто баг консоли gpmc в 2012R2. Сейчас протестировал ваш WMI фильтр (Select * from Win32_ComputerSystem where DomainRole = 5) с непустой политикой — все применяется нормально.
а если нужно выбрать все IE11, строка такая будет?
SELECT path,filename,extension,version FROM CIM_DataFile WHERE path=»\\Program Files\\Internet Explorer\\» AND filename=»iexplore» AND extension=»exe» AND version>»11.0″
и еще, как выбрать фильтром все десктопные ОС старше Windows 7 обеих разрядностей? То есть 7,8,8,1,10.
Да, фильтр для выбора IE11:
SELECT * FROM CIM_DataFile WHERE path="\\Program Files\\Internet Explorer\\" AND filename="iexplore" AND extension="exe" AND version LIKE "11.%
Для выбора десктопных ОС c Windows 7 и выше:
select * from Win32_OperatingSystem where (Version like "10.%" or Version like "6.3%" or Version like "6.2%" or Version like "6.1%") and ProductType="1"
Советую вам тестировать WMI запросы с помощью PowerShell командлета get-wmiobject:
get-wmiobject -query 'SELECT * FROM CIM_DataFile WHERE path="\\Program Files\\Internet Explorer\\" AND filename="iexplore" AND extension="exe" AND version LIKE "11.%"'
Где и как тестировать эти запросы? На DC? Можно подробней и в стаью добавить?
Запускаете запрос get-wmiobject на компьютере, который хотите проверить. Если команда что-то возвращает, значит компьтер соотвествет условиям запроса и к такому компьютеру будет применяться фильтр GPO. Если команда get-wmiobject ничего не верунла — компьютер не соответсвует запросу.
Например, запустив указанный запрос на компьютере с IE 11 он должен вернуть:
Compressed : False
Encrypted : False
Size :
Hidden : False
Name : c:\program files\internet explorer\iexplore.exe
Readable : True
System : False
Version : 11.0.17134.1
Writeable : True
Это значит IE 11 установлен.
select * from Win32_OperatingSystem where (Version like «10.%» or Version like «6.%») and ProductType=»1″
меньше текста)
Можно ли каким-то образом запустить на DC, чтоб біло видно какие компі попадают под это фильтр?
WMI — Windows Management Instrumentation, а не Windows Management Interface
Исправьте
Ок, принято.
Значение поля ProductType в кавычках не принимается. Проверил на Windows Server 2016. Лучше переписать запрос так:
select * from Win32_OperatingSystem where Version like “6.1%” and ProductType > 1
добрый день
а можно применить WMI фильтр для фильтрации групп безопасности к которым должна примениться политика? Просто надо применить одну GPO к 10-ку групп безопасности. Все эти группы имеют общее начало в своем названии и вот по если бы их как то отфильтровать по этому названию в WMI, а в фильтрах безопасности тогда будут как обычно «ПРОШЕДШИЕ ПРОВЕРКУ».
Лучше все эти группы добавить непосредственно в ACL политики. Иначе такой WMI запрос должен выполняться на всех клиентах — не совсем правильно с точки зрения производительности. Проще сразу отфильтровать применение политики по группам безопасности.
Меня всегда пугал синтаксис WMI Query Language 🙂 Вот эти вот все пространства имен root\CIMv2 … Узнавать откуда-то все эти WMI классы…
Почему, допустим, мы пишем один запрос select *звёздочка* from, а другой select Model (т.е. что-то конкретное), но при этом дальше и там и там указываем «where» (что-то конкретное)?
Нашел, что список всех доступных wmi классов в системе можно вывести командлетом Get-CimClass
Есть различные графические WMI браузеры, которые позволяют исследовать доступные классы и параметры в WMI. Ну а с синтаксисом — дело привычки. На самом деле не так часто делаешь новые WMI запросы. Обычно хватает старых наработок.
добрый день
можно как то с помощью WMI разделить редакции windows 10? А точнее отделить PRO от LTSC ?
Вот такой WMI фильтр позволит выбрать компьютеры с Цшт 10 LTSC
SELECT Caption,Version FROM Win32_OperatingSystem WHERE Caption='Microsoft Windows 10 Enterprise LTSC'
Либо можно фильтровать еще и по версии:
SELECT Caption,Version FROM Win32_OperatingSystem WHERE Caption='Microsoft Windows 10 Enterprise LTSC' AND Version='10.0.17763'
В последнем примере, если не указывать в фильтре Caption, фильтр выберет все компьютеры с Windows 10 1809 и LTSC 2019.
У меня есть ВМИ-фильтр где идет выборка по имени ПК на много серверов ( Name = «RDSH-12» or Name = «RDSH-13)
как можно указать подмножество имен ПК ( Name = «RDSH-*») вместо того что б указывать каждый севрер ??
Вот так попробуйте. Вместо * в запросах используется знак %. Можно и спереди добавить.
Select * From Win32_ComputerSystem where (Name LIKE "RDSH-%")
Можно ли через wmi фильтр выполнить политику, если отсутствует обновление (hotfix)?
Проверить наличие обновления можно так:
‘Select * from win32_quickfixengineering where HotFixID=»KB4012212″‘, только фильтр выполняется когда значение истина, а не ложь.
В процессе работы столкнулся, должно быть полезно в качестве «Devil in details»:
Домен на Windows Server 2012 R2, рабочие станции под различными операционными системами: Windows 7, 8.1, 10. Но есть особенности: некоторые десятки были изначально немецкими, английскими, на них были установлен русский интерфейс и т.д. И открылись некоторые детали, которые могут озадачить, например значение OSArchitecture «64-разрядная».
Ниже приведен фильтр для Workstations 64-bit (Windows 7-10):
select * from Win32_OperatingSystem WHERE (Version like «10.%» OR Version like «6.1%» OR Version like «6.2%» OR Version like «6.3%») AND ProductType=»1″ AND (OSArchitecture = «64-bit» OR OSArchitecture = «64-разрядная»)
Ништяк, актуально. Особенно у кого зоопарк разных машин с разными ОС.
я вначале налепил тоже самое только AND, а правильно было бы операндом OR. Называется думай головой.
Спасибо за скрипт.
Здравствуйте !
можно ли настроить фильтр по процессору, что бы политика применялась на ПК у которых процессор 7 поколения и старше ? Процессоры все интел.
ProductType = 3 есть не только у Windows Server. Он используется и в Windows 10 Enterprise for virtual desktops.
Эта редакция создана для Azure (но есть лазейка, позволяющая её установить на обычный ПК).
Коллеги, прошу прощения, а может, кто подсказать wmi для применения на определенного доменного юзера?
Заранее благодарю!
Не думаю что WMI для этого можно использовать.
Если для групповых политик, то лучше использовать «Фильтр безопасности». То есть создается группа безопасности, куда включается пользователь, которая и указывается в этом
фильтре (или просто указывается нужный пользователь). Далее, в «Делегировании» добавляете группу «Прошедшие проверку» или другую (в зависимости от ваших нужд) с правами «Чтение».
Максим, благодарю! Так и поступили.
Какой запрос будет , чтобы отбирались все клиентские ПК от 7 до 10 (32 и 64) , чтобы не затронуть сервера?
select * from Win32_OperatingSystem WHERE (Version like «10.%» OR Version like «6.1%» OR Version like «6.2%» OR Version like «6.3%») AND ProductType=»1″
ProductType равный 1 — Workstations
Вроде так
Можно с помощью WMI фильтра, проверить что на компьютере установлена определенная программа:
wmi фильтр для MS Office:
get-wmiobject -query 'Select * From Win32_Product where Name like "%Office 16 Click-to-Run%"'
wmi фильтр для SoftMaker Office:
get-wmiobject -query 'Select * From Win32_Product where Name like "%SoftMaker Office%"'
Приветствую знатоков, я не совсем понимаю как должен выглядеть запрос, что бы политика отработала на определенную OU с пользователями?
Ну в самом простом варианте назначьте полтику прямо на нужные OU.
Если вы же хотите чтобы политика действовала с корня и дальше фильтровалась в зависимости от имени OU, имхо это возможно но как то кривовато.
Если было бы так все просто, я бы так и сделал, но тут гвоздь в том, что пользователи и компьютеры находятся в разных корневых каталогах, соответственно если применить политику пользователя на каталог с нужными компьютерами, то она не отработает т.к. сущности разные, соответственно нужно применить и на пользователя и на компьютеры. А когда это делаешь, то политика начинает отрабатывать на все компьютеры подряд. Вот и возникает потребность отсечь фильтром не нужные OU.
Что то я тоже сходу не нашел, где в WMI эта информация есть.
А как вариант — применения настроек через powershell logon скрипт, который проверяет DN пользователя и в зависимости от OU применяет настройки или нет.
ИМХО, как вариант: сделайте для каждого OU свою security group и фильтруйте по ней. WMI фильр получится с кучей OR, но….
Сам себя поправлю-скорректирую — группы указать в фильрах безопасности, не в WMI
привет! можно ли запретить выполнение определённых запросов в принципе? например, чтобы Get-WmiObject Win32_OperatingSystem | select-object SerialNumber не возвращал никаких данных?
После применения фильтра в gpresult /r получаю такой вывод:
«Следующие политики GPO не были применены, так как они отфильтрованы:
Фильтрация: Отказано (безопасность).»
Подскажите как быть?
У компьютера (или пользователя) нет доступа к GPO. Она отфильтрована (не применилась). Это настраивается в параметрах security filtering GPO