AD GPO: Erweiterte Filterung mit WMI

Gruppenrichtlinien-Filterung

windows-ad-gpo-wmi-filter-intro-bannerDie Anweundung von Active Directory Gruppenrichtlinien lässt eine Filterung und Steuerung über verschiedene Techniken zu:

  • Verknüpfung mit OUs (die Voraussetzung ist gewissermaßen die erste Filterebene), Verknüpfungen aktivieren/deaktivieren
  • Sicherheitsfilterung mit Gruppen und Rechten
  • WMI-Filterung


Die ersten beiden sind gewissermaßen schon die Voraussetzung für das Erstellen und Anwenden einer Gruppenrichtlinie. Mit einer guten OU- und Gruppenstrukturen lassen sich bereits viele „Filter“ realisieren. Allerdings sind Rechte, Gruppen und OUs oftmals auch aufwändig in der Pflege.

Negativbeispiel: Mit einer „Windows10Clients“-Gruppe kann eine Filterung auf Sicherheitsebene vollzogen werden. Dazu muss die „Windows10Clients“-Gruppe jedoch händisch von den Admins gepflegt werden – neue Clients rein, alte Clients raus. Ebenso eine „SalesPCs“-Gruppe. In größeren Strukturen ist das nicht umsetzbar und geht auch einfacher.

Erweiterte Gruppenrichtlinienfilterung mit WMI

Hier kommen WMI-Filter ins Spiel. WMI, Windows Management Instrumentation, ist praktisch eine Schnittstelle zum Windows System, welches über Abfragen in einer Art SQL (WQL genannt) bedient wird und Informationen über das abgefragte System liefert. Solche Abfragen können ebenfalls für die Filterung von GPOs verwendet werden.

Beispiel: Wenn eine GPO nun also nur für Windows 10 Clients oder nur für Clients älter als Windows 10 übernommen werden soll, lassen sich die Clients super easy über WMI herausfiltern. Keine OU, keine Gruppen, nur 1 WMI-Objekt, im Endeffekt nur eine Zeile Code.

Mit Google oder Tools wie dem WMI Code Creator von Microsoft lassen sich somit schnell die benötigten Abfragen erstellen:
windows-ad-gpo-wmi-filter-code-creator-classes-processor-executewindows-ad-gpo-wmi-filter-code-creator-classes

Codebeispiele

Die Möglichkeiten sind vielseitig, hier ein paar Beispiele:

/* 32bit / 64bit */
SELECT * FROM Win32_OperatingSystem WHERE OSArchitecture = '32-Bit'
SELECT * FROM Win32_OperatingSystem WHERE OSArchitecture = '64-Bit'
/* Computername beginnt mit "vpc-" */
SELECT * FROM Win32_ComputerSystem WHERE Name LIKE 'vpc-%'
/* Sprache des Betriebssystems ist Deutsch */
SELECT * FROM Win32_OperatingSystem WHERE CountryCode = '49'
/* Internetexplorer ist in Version 8 installiert */
SELECT * FROM CIM_DataFile WHERE Filename = 'iexplore' AND version > '8.0' AND (path = '\\programme\\Internet Explorer\\' OR path = '\\program files\\Internet Explorer\\' )

via

Zufälliger Artikel:  Externe Speichermedien sicher trennen mit diskpart

Betriebssystemversion

Zum Erkennen des Betriebssystems eignen sich einige Variablen; von BuildNumber über Caption bis zu Version. Letztere ist einfach zu benutzen, da Microsoft für jede Betriebssystemversion plus dazu passende Servervariante die gleiche Version benutzt, weitere Infos dazu auf dieser Microsoft Seite.

/* Wählt alle Clients mit Windows Vista/7/8/8.1 (Nicht-Windows-10) */
SELECT * FROM Win32_OperatingSystem where Version like '6.%' and ProductType='1'
/* Windows 10 Clients only */
SELECT * FROM Win32_OperatingSystem where Version like '10.%' and ProductType='1'

Vorsicht: BuildNumber

Etwas nerviger ist die Abfrage der Windows Version anhand der BuildNumber, da diese nicht als Zahl sondern als String im System steht und somit einfache BuildNumber >= X Abfragen nicht funktionieren. Microsoft thematisiert das hier und wählt den Regex-ähnlichen Ansatz über die Anzahl der Ziffern in Kombination mit der BuildNumber. Auch Marc von gruppenrichtlinien.de verwendet WHERE BuildNumber > '5000' – das alles lief bei mir nicht zuverlässig. BuildNumber scheint mir ein schlechtes Werkzeug zu sein und ich gehe daher über die Betriebssystem Caption, die sehr standardisiert ist:

/* Windows 10 Clients */
SELECT * FROM Win32_OperatingSystem WHERE Caption LIKE '%10%' AND BuildNumber LIKE '[123456789][0123456789][0123456789][0123456789][0123456789]'
/* Alle Clients vor Windows 10 */
SELECT * FROM Win32_OperatingSystem WHERE NOT Caption LIKE '%10%' AND BuildNumber LIKE '[123456789][0123456789][0123456789][0123456789]'

Das hat bei Win7 und Win10 funktioniert wie erwünscht.
windows-ad-gpo-wmi-filter-in-use-os-version-buildnumber

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.