GPO, WMI, jazykové mutace

Od roku 2003 se věnuji převážně správě serverů internetových, databázových, aplikačních atd. Je to již hodně dlouho, co jsem si hrál se skupinovými politikami, které nastavovaly doménovým uživatelům konfigurace jejich pracovních stanic, profily atd. Bylo to ještě v době Windows 2000, kdy účinnost GPO nemohla být omezena WMI filtrem - tato možnost přišla poprvé s Windows XP. Proto pro mne byla totální předělávka IT infrastruktury jedné firmy dobrým důvodem zopakovat si dávno zapomenuté či dosud nepoznané.

Ačkoliv instalace softwarových MSI balíčků pomocí Group Policy v nějaké míře podporuje instalování správných jazykových verzí na příslušné lokalizované Windows, je lepší nespoléhat na tvůrce aplikace. Člověk musí bádat, jak byla aplikace nastavena, jestli na English, ponechána na default či zvolena např. čeština. Proto jsem se rozhodl, že raději vyrobím dvojici GPO - jednu pro české Windows, druhé pro anglické. V uvedené firmě se naštěstí nepoužívaly další cizojazyčné lokalizace. Na pracovních stanicích byly Windows 2000, XP a Vista.

Pro XP a Vista je možné ovlivnit dopad politiky vhodnou kombinací zvolených OU, oprávnění Read k dané politice pro skupinu/uživatele/počítač a WMI filtru. Posledně jmenované neplatí pro Windows 2000. Jaké jsou tedy nejjednodušší příklady WMI filtrů? Zajímá mne větev "root\CIMv2".

Omezení aplikace GPO na WXP anglické
SELECT * FROM Win32_OperatingSystem WHERE Caption = "Microsoft Windows XP Professional" AND OSLanguage = "1033"

Omezení aplikace GPO na WPX české
SELECT * FROM Win32_OperatingSystem WHERE Caption = "Systém Microsoft Windows XP Professional" AND OSLanguage = "1029"

Omezení aplikace GPO na WXP s aplikovaným SP2
SELECT * FROM Win32_OperatingSystem WHERE Caption LIKE "%Windows XP Professional" AND CSDVersion = "Service Pack 2"

Omezení aplikace GPO na WXP s aplikovaným SP2 nebo SP3
SELECT * FROM Win32_OperatingSystem WHERE Caption LIKE "%Windows XP Professional" AND (CSDVersion = "Service Pack 2" OR CSDVersion = "Service Pack 3")

Omezení aplikace GPO pouze na WXP nebo W2003
SELECT * FROM Win32_OperatingSystem WHERE (Caption LIKE "%Windows XP Professional" OR Caption LIKE "%Server 2003%")

Omezení aplikace GPO pouze na Windows Vista
Ačkoliv by člověk logicky čekal, že i v případě Vist použije Caption, jde to blbě - Microsoft do Vist narval svoje Registered a TradeMark značky. Takže variantou je kontrola Version. V případě Vist je nutné používat ještě kombinaci Version a ProductType. Posledně jmenované kvůli tomu, aby šlo skutečně o Visty a ne Windows 2008 Server, takže příkladem je Version >='6' and ProductType='1' pro Visty či Version >='6' and ProductType='3' pro Windows Server 2008.
SELECT * FROM Win32_OperatingSystem WHERE Caption <> "Microsoft Windows XP Professional" AND Version < '6' 

Omezení aplikace GPO pouze na Windows 2000
Pro korektní funkčnost je třeba v nehomogenních sítích vyrobit více politik, nalinkovat je na příslušnou OU a seřadit je následovně:

  1. GPO pro Windows Vista - Windows XP ji přeskočí, Windows 2000 ji zpracují, ale - viz níže
  2. GPO pro Windows XP - Vista ji přeskočí, Windows 2000 ji zpracují s tím, že tato GPO přepíše předchozí
  3. GPO s podmínkou "not XP or Vista" - Windows XP i Windows Vista ji přeskočí, Windows 2000 ji zpracují jako poslední a tudíž pro ně bude autoritativní

Na procházení WMI tříd a instancí je výborný WMI Explorer spuštěný v PowerShellu.

Doplnění 9.9.2012:

Během migrace SBS2003 na SBS2011 jsem si všiml pár WMI filtrů, které jsou tam použity, pro strýčka Příhodu ukládám sem:

Windows SBS Client
select * from Win32_OperatingSystem Where ProductType!=2

Windows SBS Client - Windows 7 and Windows Vista
select * from Win32_OperatingSystem Where Version>='6.0.6002'

Windows SBS Client - Windows XP
select * from Win32_OperatingSystem Where (Version>='5.1.2600' and '6.0.6000'>Version and ServicePackMajorVersion>=3) or (Version>='5.2.3790' and '6.0.6000'>Version and ServicePackMajorVersion>=2)

 

Doplnění 31.10.2023:

Windows 10
select * from Win32_OperatingSystem Where ((Version>='10') and ('10.0.22000'>Version) and (ProductType='1'))

Windows 11
select * from Win32_OperatingSystem where ((Version>='10.0.22000') and (ProductType='1'))

Windows 10/11
select * from Win32_OperatingSystem where ((Version like "10.%") and (ProductType="1"))