Monday, May 13, 2013

Why sorting alphabetically isn't always a good idea...

Hi there and then.

I just stumbled upon a little known change in the RSoP Results report in Windows 8. This report has undergone a number of changes, mentioned partially at http://blogs.technet.com/b/grouppolicy/archive/2012/11/28/group-policy-in-windows-server-2012-results-report-improvements.aspx

Although at first glance it sounds good, I have a severe problem with the little fact that someone at MS decided to list the GPOs "including sorting information by GPO" - that means, the applied GPOs are sorted alphabetically instead of the order in which they apply.

I wouldn't get upset about that if they included the processing order somewhere else in the RSoP report. But, guess what? They didn't...

This effectively breaks our ability to track down the exact processing order (inheritance, enforcement, loopback), and it immediately makes it impossible to do a showcase like the one I did in http://evilgpo.blogspot.de/2012/02/loopback-demystified.html

OMG!

Wednesday, April 03, 2013

Schampus für alle!

Der erste April ist für solche Nachrichten vielleicht - zumindest in Deutschland - nicht der ideale Tag, aber was soll's?

https://mvp.support.microsoft.com/profile/Martin

Thumbs up und Dank an alle, die dazu beigetragen haben!

Thursday, March 28, 2013

Zielgruppenadressierung: "Oder"?

Hallo zusammen.

Es gibt Neuigkeiten aus der weiten Welt der Gruppenrichtlinien:

Wenn Ihr mit Group Policy Preferences arbeitet, dann habt Ihr vielleicht auch die "Zielgruppenadressierung auf Elementebene" schon einmal verwendet. Die ermöglicht für jedes einzelne Einstellungselement eine Filterung, unter welchen Bedingungen es angewendet werden soll - das ganze sogar über einen leicht zu bedienenden grafischen Editor.

Stellt Euch folgendes Szenario vor: Ihr wollt Netzlaufwerke abhängig von Gruppenmitgliedschaften zuordnen. Ein bestimmtes Laufwerk soll dabei mehreren Gruppen zur Verfügung stehen. Dafür erstellt Ihr eine Zielgruppenadressierung wie in der folgenden Abbildung.

Abbildung 1: Zielgruppenadressierung für zwei Gruppen
Abbildung 1: Zielgruppenadressierung für zwei Gruppen

















In der Praxis stellt Ihr dann aber fest: Das Laufwerk wird nur verbunden, wenn der Benutzer Mitglied von Gruppe1 ist - Gruppe2 scheint keine Rolle zu spielen.

Warum funktioniert diese Zielgruppenadressierung nicht wie erwartet? Die Ursache ist in folgender Abbildung zu sehen. Der erste Eintrag hat eine aktivierte Elementoption "Und", die nicht änderbar ist.


Abbildung 2: Nicht änderbare Elementoption "Und"
Abbildung 2: Nicht änderbare Elementoption "Und"
















Um diese Option zu ändern, schiebt man den ersten Eintrag über den blauen Pfeil in der Menüleiste nach unten. Jetzt ist auch das "AND" vorne sichtbar und kann über die Elementoptionen auf "OR" geändert werden.

Abbildung 3: Nach Ändern der Elementreihenfolge
Abbildung 3: Nach Ändern der Elementreihenfolge

















In der Zielgruppenadressierung funktionieren logische Operatoren nicht wie in der booleschen Algebra. In der Zielgruppenadressierung steht der Operator nicht zwischen zwei Elementen (wie in der Algebra), sondern vor genau einem Element.
  • AND: Dieses Element muss auf jeden Fall wahr sein
  • OR: Dieses Element oder ein beliebiges anderes muss wahr sein
Das ist normalerweise kein Problem - die meisten Filter enthalten nur ein Element . Und wenn mehrere Elemente mit "AND" verknüpft werden, funktioniert es auch noch wie erwartet. Erst wenn "OR" verwendet wird, müsst Ihr das oben beschriebene Verhalten beachten.

Happy targeting ;-)
Martin

Thursday, January 17, 2013

Group Policy Preferences "Drive Maps" and slow logons with unavailable servers...

Hi all.

Li'l tip from field engineering ;-)

Through Group Policy Preferences "drive maps", you can easily assign and remove shared folder mappings for users. Unfortunately, there's a drawback: If you assign a shared folder that points to an unresponsive server (typo, malfunctioning or whatever reason), the assignment has a timeout value of about 30 seconds. If 5 of your assignments point to this one server, that sums up to 2,5 minutes. Veeery long...

The solution is "WMI". To do so, in the GPP drive assingment, click on the "common" tab, enable "Item.Level Targeting" and click "Targeting...". The ILT Editor opens up. In the upper right corner, select "New Item" - "WMI Query". In the Query field, enter the following:

select * from win32_Pingstatus where address="Fileserver" and statuscode=0

"Fileserver", of course, should be replaced with the real server name :-))



Done we are. The win32_pingstatus does one (only one!) ICMP ping to the target machine, this ping has a timeout of only 1 second. Great advantage compared to the 30 seconds GPP (or, to be precise, the redirector) takes.

The same can be applied to mapped printers, too.

And if all your mapped drives reside on the same server: Create a classic WMI filter and assign it to the policy. So the filter is evaluated only once.

Happy filtering :-))

Wednesday, January 16, 2013

Group Policy Preferences "Laufwerkzuordnungen": Lange Anmeldezeit, wenn Server nicht verfügbar

Hallo zusammen.

Kleiner Tip aus der Praxis ;-)

Mit den Group Policy Preferences "Laufwerkzuordnungen" kann man relativ leicht und sehr flexibel Netzlaufwerke verbinden und trennen. Leider gibt es einen unschönen Effekt: Ist ein Server nicht verfügbar, dauert es etwa 30 Sekunden bis zum Timeout. Hat man von diesem Server 5 Laufwerke verbunden, summiert sich das auf 2,5 Minuten. Sehr lang...

Lösen kann man das per WMI. Dazu wechselt man im Einstellungselement auf den Reiter "Gemeinsam", aktiviert "Zielgruppenadressierung auf Elementebene" und klickt dann auf "Zielgruppenadressierung...". Hier wählt man Neues Element - WMI-Abfrage und erstellt folgende Abfrage:

select * from win32_Pingstatus where address="Fileserver" and statuscode=0

"Fileserver" muß natürlich durch den Namen des realen Servers ersetzt werden...








Der Timeout von Win32_Pingstatus ist nur 1 Sekunde - ein deutlicher Vorteil gegenüber den knapp 30 Sekunden, die sich die GPP (bzw. der Redirector) nimmt.

Das gleiche lässt sich natürlich auch bei den Druckern verwenden...

Happy filtering ;-))

Saturday, December 01, 2012

Backup - nur für Feiglinge oder auch für GPOs?

Hallo ins Netz ;-)

Um was geht es hier?


Ich will die Sicherung von GPOs und WMI-Filtern per Skript automatisieren.

Sicher macht Ihr auch alle jeden Tag ein Backup Eurer Server... Vermutlich als System State Sicherung, gerne per WBAdmin oder mit ArcServe oder TSM. Aber wie ist das mit den GPOs und WMI-Filtern?

Natürlich werden die dann mit gesichert. Allerdings kommt man an einzelne Objekte dieser Sicherung nur schlecht heran: GPOs liegen im Sysvol, WMI-Filter nur im AD. Über die GPMC kann man beides manuell sichern.

Backup mit der GPMC

GPOs sichern ist noch relativ einfach - da gibt es "Alle sichern...":


Bei WMI-Filtern ist es schon schwieriger - die gehen nur einzeln:


Das ist natürlich ärgerlich, wenn man nicht - wie hier - nur einen einzigen Filter hat, sondern einige Duzend. Und ohnehin gilt: "Manuell ist immer schlecht"...

Deshalb habe ich mich mal wieder mit dem Skripting-Interface der GPMC beschäftigt. Heraus kam ein Skript, das GPOs und WMI-Filter sichert. Es gibt zwar auch Sample Scripts von MS (BackupAllGPOs.wsf), aber die haben einige Nachteile:
  • Keine Sicherungslimits (Anzahl oder Alter)
  • Keine WMI-Filter
  • Keine Events, die wir überwachen können
Das können wir besser, oder? ;-))

GPO-Backup mit GPOBackup.VBS

Nachdem es für meine Belange nichts fertiges gab, musste ein eigenes Skript her. Das Skript habe ich so gebaut, dass es entweder als geplanter Task auf einem DC oder manuell von einem Member aus aufgerufen werden kann. Läuft es auf einem DC, dann verbindet es sich mit genau diesem DC - jeder DC erstellt also eine Sicherung der bei ihm lokal vorhandenen Repliken von GPOs und WMI-Filtern. Das kann wichtig sein bei Replikationsproblemen...

Ruft man es von einem Member auf, geht es zum PDC-Emulator.



Hier der vollständige Aufruf mit allen Parametern:

cscript GPOBackup.VBS [/CreateShare:0] [/BackupDirectory:] [/BackupShare:] [/ForceBackup] [/RetentionMethod:age|count] [/RetentionCount:] [/L:] [/EventLogName:] [/EventSource:]

Keiner der Parameter ist erforderlich, und Gross-/Kleinschreibung ist natürlich egal. Statt Parameter kann man auch das Skript selber bearbeiten und die dort definierten Defaultwerte einfach überschreiben.

Nach dem Aufruf passiert folgendes:
  1. Das Sicherungsverzeichnis %Public%\GPOBackup (oder /BackupDirectory:) wird erstellt und mit ACLs versehen. Die Rechte auf dem Verzeichnis: Vollzugriff für System, Administratoren, Domain Admins und Creator-Owner.
  2. Ist der Computer ein DC und nicht /CreateShare:0, wird das Verzeichnis freigegeben als GPOBackup (oder /BackupShare:). Die Rechte auf der Freigabe: Vollzugriff für Everyone.
  3. Alle GPOs werden gesichert, wenn sie geändert wurden. Mit /ForceBackup auch ohne Änderungen. Jede GPO bekommt unter "GPOBackup\GPOs" ihr eigenes Verzeichnis {GPO-GUID}.
  4. Die Anzahl der vorhandenen Backups pro GPO wird geprüft.
    1. Gibt es mehr als 10 (oder /RetentionCount:) Sicherung, werden die ältesten gelöscht.
    2. Wurde /RetentionMethod:age angegeben, werden alle gelöscht, die älter als 10 Tage (oder /RetentionCount:) sind, gelöscht.
  5. Alle WMI-Filter werden gesichert, wenn sie geändert wurden. Mit /ForceBackup auch ohne Änderungen. Alle Filter landen in "GPOBackup\WMI-Filter". Es gibt nur eine Sicherung pro Filter. Der Filter wird gesichert in {Filter-GUID}.mof.
  6. Für eine einfache Überwachung gibt es eine Handvoll Events im Application Event Log (oder /EventLogName:], Quelle "GPOBackup" (oder /EventSource:):
    •  I  1 - started
    •  I  2 - GPOs unchanged
    • I/W 3 - GPOs backed up (with error)
    • I/W 4 - GPOs backup deleted (with error)
    •  I  5 - WMI filters unchanged
    • I/W 6 - WMI filters backed up (with error)
    • I/W 9 - finished (with errors)
Mit /L kann noch ein Logfile angegeben werden, das den (spärlichen) Bildschirmoutput auch noch in eine Datei schreibt (mit automatischem Size Wrapper bei >100 kB natürlich - wir wollen ja nicht die Platte vollmüllen).

Zwei Tricks sind auch noch dabei:
  1. AD-intern sind GPOs und WMI-Filter nur GUIDs, und die Anzeigenamen müssen nicht eindeutig sein. Ich kann also nicht einfach den Anzeigenamen im Dateisystem der Sicherung verwenden. Also machen wir eine desktop.ini dazu, die jeweils im Explorer statt der GUID den Anzeigenamen darstellt. Das sieht dann für einen WMI-Filter z.B. so aus:
    Dateisystem


    01.12.2012 15:24 326 {76593C02-E9B2-414A-BB9E-A3BF3E51F519}.mof


    Explorer

     
  2. WMI-Filter kann man nicht direkt "sichern", man kann aber deren Eigenschaften auslesen. Daraus wird dann das mof neu zusammengesetzt.
Und wie einsetzen?

Ganz einfach - per GPO natürlich ;-)
  1. Skript auf Netlogon oder sonstwo im Netzwerk kopieren
  2. Per GPP "Dateien" oder per Startskript auf den DC bringen
  3. Geplanten Task einrichten per GPP, Ausführungstrigger nach Wunsch


Hier findet Ihr das Skript als ZIP:

Im Skript findet Ihr einige Kommentare zum "warum, wieso, weshalb".
Fragen, Feedback und Kommentare sind herzlich willkommen!

Und wenn sich jemand fragt "warum VBS und nicht Powershell" - ganz einfach: VBS spreche ich besser, und die Powershell-CMDlets für GPOs haben kein GPOBackup-Interface, wie es das COM-Objekt der GPMC kennt.

Have fun!!!

Links:

GPMC Scripting COM Interface
MOF-Dateieformat