Технология WMI фильтров в групповых политиках (GPO) позволяет более гибко применять политики на клиентов, за счет использования различных правил, позволяющих указывать WMI запросы для формирования критериев выборки компьютеров, на которые будет действовать групповая политика. К примеру, с помощью WMI фильтров GPO вы можете применить политику, назначенную на OU, только к компьютерам с ОС Windows 10 (на других версиях Windows такая политика с фильтром применяться не будет).
Для чего используются WMI фильтры GPO?
Обычно технология фильтрации групповых политик с помощью WMI (Windows Management Instrumentation) используется в ситуациях, когда объекты домена (пользователи или компьютеры) находятся в плоской структуре AD, а не в выделенном OU, либо если необходимо применить политики, в зависимости от версии ОС, ее сетевых настроек, наличию определенного установленного ПО или любом другом критерии, который можно выбрать с помощью WMI. При обработке такой групповой политики клиентом, Windows будет проверять свое состояние на соответствие указанному WMI запросу на языке WQL (WMI Query Language), и, если условия фильтра выполняются, такая GPO будет применена к компьютеру.
WMI фильтры групповых политик впервые появились еще в Windows XP, и доступны вплоть до последних версий Windows (Windows Server 2019, 2016, Windows 10, 8.1).
Как создать новый WMI фильтр и привязать его к GPO?
Чтобы создать новый WMI фильтр, откройте консоль управления доменными групповыми политиками Group Policy Management (gpmc.msc) и перейдите в раздел Forest -> Domains -> winitpro.ru -> WMI Filters. В этой секции содержатся все WMI фильтры домена. Создайте новый WMI фильтр (New).
В поле Name укажите имя фильтра, в поле Descriptions его описание (не обязательно). Чтобы добавить в фильтр WMI запрос нажмите на кнопку Add, укажите имя пространства имен WMI (по умолчанию root\CIMv2) и укажите код WMI запроса.
WMI запрос имеет следующий формат:
Select * from <WMI Class> WHERE <Property> = <Value>
В нашем примере вы хотим создать WMI фильтр, позволяющий применить групповую политику только на компьютеры с Windows 10. Код WMI запроса может выглядеть так:
Select * from Win32_OperatingSystem where Version like "10.%" and ProductType="1"
Созданные WMI фильтры хранятся в объектах класса msWMI-Som домена Active Directory в разделе DC=…, CN=System, CN=WMIPolicy, CN=SOM их можно найти и отредактировать с помощью консоли adsiedit.msc.
После создания WMI фильтра его можно привязать к конкретному объекту GPO. Найдите нужную политику в консоли GPMC и на вкладке Scope в выпадающем меню секции WMI Filtering выберите созданный ранее WMI фильтр. В этом примере я хочу, чтобы политика автоматического назначения принтеров применялась только к компьютерам с Windows 10.
Дождитесь применения данной политики на клиентов, или обновите ее с помощью
gpupdate /force
. При анализе примененных политик на клиенте нужно использовать команду gpresult /r. Если политика действует на клиента, но не применяется из-за WMI фильтра, такая политика в отчете будет иметь статус Filtering: Denied (WMI Filter) и указано имя WMI фильтра.
Примеры запросов для WMI фильтров GPO
Рассмотрим различные примеры WMI фильтров GPO, который чаще всего используются.
С помощью WMI фильтра вы можете выбрать тип ОС:
- ProductType=1 – любая клиенская ОС
- ProductType=2 – контроллер домена AD
- ProductType=3 – серверная ОС (Windows Server)
Версии Windows:
- Windows Server 2016 и Windows 10 — 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%
- Windows 2000 — 5.0%
Вы можете комбинировать условия выборки в WMI запросе с помощью логических операторов AND и OR. Чтобы применить политику только к серверам с Windows Server 2016, код WMI запроса будет таким:
select * from Win32_OperatingSystem WHERE Version LIKE "10.%" AND ( ProductType = "2" or ProductType = "3" )
Выбрать 32 битные версии ОС Windows 8.1:
select * from Win32_OperatingSystem WHERE Version like "6.3%" AND ProductType="1" AND OSArchitecture = "32-bit"
Применить политику только к 64-битным ОС:
Select * from Win32_Processor where AddressWidth = "64"
Выбрать Windows 10 с определенным билдом, например Windows 10 1803:
select Version from Win32_OperatingSystem WHERE Version like “10.0.17134” AND ProductType=”1″
Применить политику только к виртуальным машинам VMWare:
SELECT Model FROM Win32_ComputerSystem WHERE Model = “VMWare Virtual Platform”
Применить политику только к ноутбукам (см. статью wmi запрос выборки ноутбуков в SCCM:
select * from Win32_SystemEnclosure where ChassisTypes = "8" or ChassisTypes = "9" or ChassisTypes = "10" or ChassisTypes = "11" or ChassisTypes = "12" or ChassisTypes = "14" or ChassisTypes = "18" or ChassisTypes = "21"
WMI фильтр, который применится только к компьютерам, чьи имена начинаются на “msk-pc“(например, для блокировки подключения USB накопителей на этих устройствах):
SELECT Name FROM Win32_ComputerSystem WHERE Name LIKE ‘msk-pc%’
Пример использования WMI фильтра для тонкого нацеливания групповой политики к IP подсетям описывается в статье WMI фильтр для привязки GPO к IP подсети. Например, чтобы применить политику к клиентам в нескольких IP подсетях, используйте фильтр:
Select * FROM Win32_IP4RouteTable WHERE (Mask='255.255.255.255' AND (Destination Like '192.168.1.%' OR Destination Like '192.168.2.%'))
Применять политику к компьютерам, с количеством оперативной памяти больше 1 Гб:
Select * from WIN32_ComputerSystem where TotalPhysicalMemory >= 1073741824
WMI фильтр проверки наличия на компьютере Internet Explorer 11:
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 запросов иногда нужно получать значения различных параметров на компьютере. Вы помете получить эти данный с помощью командлета Get-WMIObject. Например, выведем атрибуты и значения WMI класса Win32_OperatingSystem:
Get-WMIObject Win32_OperatingSystem
SystemDirectory : C:\WINDOWS\system32
Organization :
BuildNumber : 17134
RegisteredUser : Windows User
SerialNumber : 00331-10000-00001-AA494
Version : 10.0.17134
Чтобы вывести все доступные параметры класса:
Get-WMIObject Win32_OperatingSystem| Select *
Для тестирования WMI фильтров на компьютерах можно использовать PowerShell. Допустим, вы написали сложный WMI запрос и его хотите проверить (соответствует ли компьютер данному запросу или нет). Например, вы создали WMI фильтр проверки наличия IE 11 на компьютере. На целевом компьютере вы можете выполнить этот WMI запрос с помощью командлета 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.%"'
Если данная команда что-то возвращает, значит компьютер соответствует условиям запроса. Если команда get-wmiobject ничего не вернула — компьютер не соответствует запросу.
Например, запустив указанный запрос на компьютере с Windows 10 и 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 установлен на компьютере и GPO с таким WMI фильтром будет применяться к этому компьютеру.
Итак, мы разобрались как использовать WMI фильтры для применения групповых политик только компьютерам, попадающим под условия запроса. Нужно учитывать наличие WMI фильтров при анализе причин, из-за которых не применяется политика на компьютере.
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
Спасибо за фильтры. Люблю тебя)
Подскажите.
Создал политику, которая назначает принтеры.
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
Вроде так