Mittwoch, 4. Dezember 2013

Group Policy Preferences und der Internet Explorer 11

Mit Windows 8.1 und Server 2012 R2 wurde auch eine neue Version der RSAT (Remote Server Administration Tools) bereitgestellt.

Die neue GPMC dieser RSAT stellt einige (wenn auch geringfügige) neue Funktionen bereit. 

Wichtige Änderungen (im Bezug auf GPPs):
  • "TCP/IP Printer" Preferences unterstützen nun auch IPv6
  • Das IP Address Range Targeting unterstützt nun auch IPv6
  • Die "VPN-Verbindung" der Netzwerkoptionen unterstützen nun IPv6
Einigen wird aufgefallen sein, dass trotz neuen RSAT keine Group Policy Preferences für den IE 11 angeboten werden:
 



Wie ich bereits in diesem Post berichtet habe, wird in der erzeugten XML Datei eine Versionsnummer gespeichert. Dieser Eintrag gibt die minimale und maximale Versionsnummer des IE an, für den diese XML Datei gelten soll.

Erzeugt man eine "Internet Explorer 10" Preference, so wird der Eintrag max="99.0.0.0" in die XML Datei geschrieben.


Folglich sind die IE 10 Preferences auch für den IE 11 gültig!
Das bedeutet jedoch nicht, dass automatisch alle neuen Einstellungen des IE 11 in den IE 10 Preferences enthalten sind.


ADMX Settings für den IE 11

Für den IE 11 sind neue Administrative Vorlagen erschienen.
Solltet ihr einen Central Store für eure ADMX Vorlagen verwenden, empfielt es sich diesen ggf. upzudaten. 

Eine gute Anleitung hierfür findet ihr hier:
http://www.gpanswers.com/how-to-make-the-ultimate-admx-central-store/

Hier eine Übersicht der neu hinzugekommen ADMX Settings:
http://www.microsoft.com/en-us/download/details.aspx?id=25250

Jeremy's "Pak for Internet Explorer"

MVP "Jeremy Moskowitz" hat einen "Pak for Internet Explorer" erstellt, der den Internet Explorer 11 unterstützt. Diese Software bietet zusätzliche Features, die mit den regulären Group Policy Preferences nicht realisierbar sind (z.B. das Ausblenden von ganzen IE Konfiguration-Tabs).

Internet Explorer Maintenance
Wie auch schon für den Internet Explorer 10 gilt "Internet Explorer Maintenance is dead". Diese CSE ist (völlig zurecht) ausgestorben und steht auch unter dem IE 11 nicht mehr zur Verfügung. Schaut euch auch bitte den vergangen Post für den IE 10 noch einmal an.

Für den IE 11 gilt also weiterhin, man muss sich die passenden Einstellungen zusammensuchen. In der Regel ergibt dies einen Mix aus:
  • Internet Settings - Group Policy Preferences
  • IEAK - Internet Explorer Administration Kit
  • Registry - Group Policy Preferences
  • ADMX Settings für den Internet Explorer
  • Ggf. 3rd Party Tools (wie z.B. "PolicyPak")
Update 06.12.2013

Das ADMX Bundle für Windows 8.1 und Server 2012 R2 findet ihr hier:
http://www.microsoft.com/en-US/download/details.aspx?id=41193

Freitag, 18. Oktober 2013

DHCP Bereiche mittels Group Policy überwachen

Jeder DHCP-Bereich umfasst eine definierte Anzahl an IP-Adressen. 
Ist dieser Bereich erschöpft, so können keine weiteren Adressen mehr vergeben werden. Das passiert meistens dann, wenn man am wenigsten damit rechnet.
Für den User hat das den unschönen Effekt, dass der Client zwar mit dem Netzwerk verbunden ist, aber aufgrund der fehlenden IP-Adresse nicht mit den anderen Clients / Servern kommunizieren kann.

Das MMC-Snapin
Der Microsoft DHCP-Server notiert dies im DHCP Snapin mit verschiedenen Warnsymbolen. Eine Liste aller Symbole incl. ihrer Bedeutung findet ihr hier:

http://technet.microsoft.com/en-us/library/cc784812%28v=ws.10%29.aspx


Diese Warnsymbole kann man leicht übersehen. Hat man nicht ständig das DHCP-Snapin geöffnet, wird man im Zweifelsfalle nicht sehen, dass ein
DHCP-Bereich erschöpft ist.



Event 1020 - an Ereignisse geknüpfte Aktionen
Zusätzlich zur Snapin Warnung wird im Eventlog ein Eintrag protokolliert.
Dieser Eintrag hat die ID 1020.

Diese Events können ab Windows Vista bzw. Server 2008 abonniert werden. 
Eine ebenfalls neue Methode seit 2008 ist das Verknüpfen von Aktionen mit Events. Verknüpft man die Aktion "E-Mail senden" mit dem Event 1020, wird jedes Mal beim Auslösen dieses Events eine Mail gesendet.

Wir erhalten eine Mail sobald ein Bereich eine gewisse Schwelle an benutzten Adressen überschreitet, wissen jedoch noch nicht um welchen Bereich es sich handelt. Bei einem DHCP-Server mit vielen Bereichen ist diese Information nicht sehr hilfreich.

PowerShell Skript

Die Aktion die an das Event geknüpft ist, kann auch die Ausführung eines Programms / Befehls sein. Wenn das passende Skript vorhanden ist, können umfangreichere Informationen verarbeitet werden.

$eventList = @()
Get-EventLog -LogName System -After (get-date).AddHours(-1) -Source DhcpServer -InstanceId 1020 | where-object  {$_.Message -notlike "*10.110*"}
| foreach-Object {
$row = "" | Select ScopeAddress, Utilization, FreeIPAddresses
$row.ScopeAddress = $_.ReplacementStrings[0]
$row.Utilization= $_.ReplacementStrings[1]
$row.FreeIPAddresses = $_.ReplacementStrings[2]
$eventList += $row
$FoundEvent="True"
}

$messageParameters = @{
Subject = "DHCP Scope Utilisation Report " + $env:COMPUTERNAME + " - $((Get-Date))"
Body = $eventList | Sort Utilization -Descending |
ConvertTo-Html |
Out-String
From = "DHCP-ALERT@domain.com"
To = "dhcp-alert@domain.com"
SmtpServer = "MAILSERVER"
}

if ($FoundEvent -eq "True")
{
    Send-MailMessage @messageParameters -BodyAsHtml
}


Das Skript führt eine Abfrage auf das System Eventlog durch.
Es werden alle Ereignisse mit der ID 1020 der letzten Stunde ausgelesen.

Diese Events werden dann per Mail an die angegebene Adresse gesendet.

Um nach Bedarf Bereiche auszuschließen, habe ich das Skript etwas modifiziert.
Bereiche (bzw. Textpassagen im Detailtext des Events) können in dieser Zeile vom Mailversand ausgeschlossen werden:

where-object  {$_.Message -notlike "*10.110*"}


In diesem Falle werden also alle Events ausgeschlossen, die "10.110" im Detailtext des Events enthalten.
 
Konfiguration per Gruppenrichtlinie verteilen
Wir haben nun gelernt, dass wir Aktionen an Ereignisse binden können.
Wir haben auch das dazugehörige Skript um diese Informationen per E-Mail zu versenden. Diese Lösung muss manuell an jedem DHCP-Server konfiguriert werden. Nun kommt das Thema Gruppenrichlinien ins Spiel.

Mit einer Kombination aus verschiedenen Group Policy Preferences und Item Level Targetings lässt sich diese Lösung ganz schnell und einfach an alle DHCP-Server verteilen.

Hier die Schritte die dafür nötig sind:

1. Schritt - GPO
Eine neue GPO erstellen

2. Schritt - Hilfsvariable
Um nicht ständig die Registry abzufragen, erstellen wir uns eine Hilfsvariable.
In diesem Falle "ISDHCPSERVER".




Damit die Variable nur bei den DHCP-Server auf "TRUE" gesetzt wird, müssen wir ein Item Level Targeting (Zielgruppenadressierung) verwenden. 
In diesem Falle wird der Starttyp des Dienstes "DHCPServer" abgefragt.
Genau genommen ist dies natürlich noch keine Garantie dass auf dem Server ein Adresspool angelegt und aktiviert ist. In der Regel ist dies jedoch der Fall.

Es können natürlich auch andere ILT verwendet werden.




Bei jedem DHCP-Server der diese Kriterien erfüllt, wird also fortan die Variable "ISDHCPSERVER" erstellt und auf "TRUE" gesetzt.
Damit dies wieder rückgängig gemacht wird (falls z.B. die DHCP Rolle deinstalliert wird), müssen wir diese Option noch aktivieren:



3. Schritt - Kopieren des Skripts
Als nächstes müssen wir das Skript auf jeden zutreffenden Server kopieren.
Das lässt sich ebenfalls mittels Group Policy Preferences realisieren.
Wir nutzen also GPP Files.



Hier verwenden wir die Hilfvariable als Targeting.



4. Schritt - Anlegen der geplanten Aufgabe




Zusätzlich verwenden wir hier das ILT auf die Variable "ISDHCPSERVER" und aktivieren die Option "Element entfernen, wenn es nicht mehr angewendet wird".

Hier noch der Inhalt der Batchdatei "dhcpreport.bat"

%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe Set-ExecutionPolicy RemoteSigned
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe "C:\Batch\dhcpreport.ps1"

%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe Set-ExecutionPolicy Restricted

5. Schritt - Einstellen der Warnschwelle 
Per Default wird das Event ab einer Bereichsauslastung von 80 % erzeugt.
Dieser Threshold kann mit einem Registryschlüssel geändert werden.
Auch hier verwenden wir wieder das gleiche ILT und die genannte Option zum Entfernen der Einstellung.


  
Die genannte DHCP Überwachung in Kombination mit GPP funktioniert erst ab Windows Server 2008 R2.

Dienstag, 3. September 2013

Windows Update: Fehler "0x80072ee2" unter Windows 8 - Dienst reagiert nicht mehr

In Windows 8 gibt es ein Verhalten, dass den Windows Update Dienst (wuauserv) zum Absturz bringen kann.

Für den wuauserv lässt sich ein Proxy-Server konfigurieren.
Standardmäßig ist jedoch kein Proxy für den Dienst gesetzt.

Die wuauserv Proxy-Einstellung:
Die Konfiguration kann mit diesem Befehl angezeigt werden:
 

netsh winhttp show proxy

Im Normalfall erscheint dann diese Config:


 Current WinHTTP proxy settings:

    Direct access (no proxy server).


Sucht ihr online nach Updates, werden die Proxy-Einstellungen des Internet Explorers verwendet.



Wenn ihr einen WSUS-Server konfiguriert habt, wird jedoch die Einstellung die
mittels "netsh winhttp ..." angezeigt wird, verwendet.

Fehler unter Windows 8:
Ist kein Proxy konfiguriert unter Windows 8 und man besitzt jedoch keine direkte Internetverbindung, so kann es passieren, dass die Suche nach Windows Updates nicht abgeschlossen werden kann:

Im Logfile "C:\Windows\WindowsUpdate.log" erscheinen diese Einträge:

2013-09-03    07:58:21:157     900    e30    Misc    WARNING: Proxy List used: <(null)> Bypass List used : <(null)> Auth Schemes used : <None>
2013-09-03    07:58:21:157     900    e30    Misc    WARNING: Send request failed, hr:0x80072ee2
2013-09-03    07:58:21:157     900    e30    Misc    WARNING: WinHttp: SendRequestUsingProxy failed for <http://ds.download.windowsupdate.com/w8/2/windowsupdate/redir/wuredir.cab>. error 0x80072ee2
2013-09-03    07:58:21:157     900    e30    Misc    WARNING: WinHttp: SendRequestToServerForFileInformation MakeRequest failed. error 0x80072ee2
2013-09-03    07:58:21:157     900    e30    Misc    WARNING: WinHttp: SendRequestToServerForFileInformation failed with 0x80072ee2
2013-09-03    07:58:21:157     900    e30    Misc    WARNING: WinHttp: ShouldFileBeDownloaded failed with 0x80072ee2
2013-09-03    07:59:03:198     900    e30    Misc    WARNING: Send failed with hr = 80072ee2.
2013-09-03    07:59:03:198     900    e30    Misc    WARNING: Proxy List used: <(null)> Bypass List used : <(null)> Auth Schemes used : <None>
2013-09-03    07:59:03:198     900    e30    Misc    WARNING: Send request failed, hr:0x80072ee2
2013-09-03    07:59:03:198     900    e30    Misc    WARNING: WinHttp: SendRequestUsingProxy failed for <http://ds.download.windowsupdate.com/w8/2/windowsupdate/redir/wuredir.cab>. error 0x80072ee2
2013-09-03    07:59:03:198     900    e30    Misc    WARNING: WinHttp: SendRequestToServerForFileInformation MakeRequest failed. error 0x80072ee2
2013-09-03    07:59:03:198     900    e30    Misc    WARNING: WinHttp: SendRequestToServerForFileInformation failed with 0x80072ee2
2013-09-03    07:59:03:198     900    e30    Misc    WARNING: WinHttp: ShouldFileBeDownloaded failed with 0x80072ee2
2013-09-03    07:59:03:198     900    e30    Misc    WARNING: DownloadFileInternal failed for http://ds.download.windowsupdate.com/w8/2/windowsupdate/redir/wuredir.cab: error 0x80072ee2
2013-09-03    07:59:24:558     900    e30    Misc    WARNING: Send failed with hr = 80072ee2.


Bei der angegebenen Datei (http://ds.download.windowsupdate.com/w8/2/windowsupdate/redir/wuredir.cab) handelt es sich um ein File, dass für den Windows-Store benötigt wird.

By design:

Nach ca. 8 Wochen Kontakt mit dem Microsoft Support lautet die finale Aussage:
By Design. D.h. "das ist einfach so".
Die Case Nummer hierzu lautet: 113070910573485

Workaround?
Mit der Fehlermeldung im Logfile könnte man sicherlich leben.
Dass jedoch sich teilweise der Windows Update Dienst verabschiedet, ist sehr unschön (und zumdem ein Sicherheitsrisiko).

Um die Funktion des Dienstes zu gewährleisten, gibt es also zwei sinnvolle Lösungen:
  1. Einen Proxy-Server mittels "netsh winhttp" konfigurieren und den Download ermöglichen + Eine Proxyausname für den WSUS-Server definieren.
  2. Einen Proxy-Server mittels "netsh winhttp" konfigurieren und den Download am Proxy-Server sperren + Eine Proxyausname für den WSUS-Server definieren.
Gesetzt werden kann dieser Proxy mit diesen Befehlen:

netsh winhttp set proxy myproxy:80 "*.domain.intern"
(es kann natürlich auch nur explizit der WSUS-Server ausgeschlossen werden) 
oder
netsh winhttp import proxy source =ie  

 Geht das nicht eleganter?
Wir sind ja hier im GPO-Blog. Deshalb lautet die Antwort: Ja :-)

Diese Einstellung wird in einem Registry-Binary gespeichert.
Dieser befindet sich unter HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Connections und nennt sich "WinHttpSettings".

Ihr könnt also Group Policy Preferences Registry benutzen um diesen Schlüssel zu setzen:



Jetzt noch eine Zielgruppenadressierung setzen und fertig:



Donnerstag, 29. August 2013

Powershell Skript zur Gruppenrichtlinien-Verarbeitung

Events und Verarbeitungszeiten einfach auslesen 

Michael Köppl hat ein sehr komfortables Skript für die Analyse der Gruppenrichtlinien-Verarbeitung erstellt.

Das Skript erschien als Gastbeitrag im AD-Blog.

Execution Policy anpassen:
Da das File nicht signiert ist, müsst ihr zunächst eure
Powershell-Execution-Policy umstellen:

Set-ExecutionPolicy Unrestricted

Danach könnt ihr das Skript wie folgt ausführen:

.\GPAnalyser.ps1 -Analyse
.\GPAnalyser.ps1 -Analyse -Computer <MyComputer>
.\GPAnalyser.ps1 -Analyse -Computer <MyComputer> -ShowLastHours 24


Natürlich könnt ihr auch das Skript signieren.
Signing PowerShell Scripts

Hier noch ein paar Screenshots:





Hier der Link zum vollständigen Artikel:
http://blogs.technet.com/b/deds/archive/2013/08/19/powershell-script-zur-gruppenrichtlinien-verarbeitung.aspx

Freitag, 26. Juli 2013

Windows 8 / 8.1: Laufwerkszuordnungen von Unterordnern schlagen fehl

*** Informationen zum Update KB2878604 siehe Ende des Posts ***  
*** In Windows 8.1 besteht dieses Problem ebenfalls ***  

Unter Windows 8 und 8.1 gibt es einen Bug, der beim Mappen von Laufwerksverbindungen auftritt. Das Problem äußert sich darin, dass Laufwerke deren Ziel Unterordner sind nicht korrekt gemapped werden. 

Beispiel:
Per Preference wurde das hier definiert:
Laufwerk M: = \\server\share\subfolder\subfolder


Das Laufwerk wird jedoch wie folgt gemappt:
Laufwerk M: = \\server\share


Die Unterverzeichnisse werden komplett ignoriert.

Es war bereits ein ähnliches Problem bekannt, bei dem auch nicht korrekt
gemappt wurde. Jedoch tritt dies nur auf, wenn ein sogenannter "trailing slash" im Pfad enthalten ist.

siehe hier

In diesem konkreten Beispiel (Windows 8 und Server 2012) hat dies jedoch nichts mit dem Problem zu tun.

Problemzusammenfassung:
  • Die Netzlaufwerke werden mit NET USE immer korrekt angezeigt, unabhängig von einer elevated Shell.
  • Startet man den Windows Explorer elevated, hat dieser die Netzlaufwerke ebenfalls korrekt gemappt.
  • Startet man den Windows Explorer non-elevated, zeigt er die Netzlaufwerke korrekt gemappt an, verweist aber auf den Root-Folder des Shares. 
  • Es werden Laufwerke von Win 2003 Servern (SP1) gemappt. 
  • Die Policy "EnableLinkedConnections" ist aktiv.
  • Im Trace steht die Meldung Failed to connect drive with restricted token.
    [ hr = 0x80070055 "The local device name is already in use." ] 
  • Die Laufwerke werden alle mit den folgenden Optionen gemappt: Replace, Non-Reconnect, Run in logged-on user's context, Remove this item when it is no longer applied
  • Das Problem wurde auch im Microsoft Case "113021910228246" erfasst

Der Workaround:

Der einzig bekannte Workaround ist das Deaktivieren dieser Policy.
Der Wert muss auf "0" gesetzt werden.

Achtung, das Problem tritt nur bei Windows 8 auf. Der Key sollte auch nur bei Windows 8 auf "0" gesetzt werden.
Der Key kann natürlich bequem per Group Policy Preferences Registry mit einem Item Level Targeting gesetzt werden.

Microsoft hat den offiziellen Artikel zum Thema "EnableLinkedConnections" geändert. Der neue Artikel scheint mir wenig hilfreich.

Das Problem sollte jedoch nicht mit dem eigentlichen Zweck des Keys "EnableLinkedConnections" verwechselt werden (bei dem der Key auf "1" gesetzt werden muss).


Ursprünglicher Zweck des Schlüssels: 
If a user is logged on to Windows Vista or to Windows 7, and if User Account Control is enabled, a program that uses the user’s filtered access token and a program that uses the user’s full administrator access token can run at the same time. Because LSA created the access tokens during two separate logon sessions, the access tokens contain separate logon IDs.
siehe auch

Noch mehr Hintergrundinfos findet ihr in diesem Thread.
Sollte es neue Informationen zu diesem Problem geben, findet ihr das hier.

Update 26.07.2013:
Setzt man den Schlüssel "EnableLinkedConnections" auf "0", bootet den Client und meldet einen Benutzer an, dann funktioniert es für dieses Benutzerprofil.
Egal ob der Key danach wieder auf "1" gesetzt wird.
Wird jedoch das Benutzerprofil gelöscht oder ein Benutzer meldet sich an, der noch kein Benutzerprofil hat, so tritt der Fehler unter diesem User auf.


Das Problem tritt nicht wie oben angekündigt nur unter Group Policy Preferences auf, sondern auch wenn man zum Mappen das WSH(Windows Scripting Host) Object verwendet.

Vielen Dank an Martin Binder (Group Policy MVP) für diese zusätzlichen Informationen.

Update 10.08.2013:
Es gibt Licht am Ende des Tunnels. 
Microsoft hat einen Hotfix für September 2013 angekündigt.

Siehe Martin's Blog:
http://evilgpo.blogspot.de/2013/08/windows-8-und-enablelinkedconnections.html

Update 20.09.2013: 
Microsoft hat nun einen Hotfix veröffentlicht, der das Problem behebt.
Leider ist dieser Hotfix nur für Windows 8, nicht 8.1 verfügbar!

http://support.microsoft.com/kb/2878604 

Update 03.10.2013:
Auch unter Windows 8.1 (bzw. Server 2012 R2) besteht dieses Problem.
Leider gibt es jedoch keinen Hotfix für Windows 8.1.
Ob und wann es einen Fix geben wird, ist noch ungewiss.

Donnerstag, 27. Juni 2013

Sicherheitseinstellungen für Systemdienste werden nicht übernommen

Heute wieder eine ganz besondere Konstellation.
Es gibt ein unerwartetes Verhalten der Security CSE beim Setzen von ACLs (Access Control Lists) für Systemdienste.

Bevor wir jedoch zum eigentlichen Problem kommen, hier erst ein paar Hintergrundinformationen.

So funktioniert die Security CSE:

In den Gruppenrichtlinien lassen sich unter anderem Sicherheitseinstellungen für Systemdienste definieren.




Diese Einstellungen werden in der Datei GptTmpl.inf gespeichert.

Diese Datei befindet sich unter:

\\domain.intern\sysvol\domain.intern\Policies\{GUID}\Machine\Microsoft\Windows NT\SecEdit


Die ACLs werden jedoch nicht direkt von diesem File aus angewendet, sondern es werden zunächst alle Richtlinien gesammelt, die Sicherheitseinstellungen enthalten.

Dieser Cache liegt im Verzeichnis %systemroot%\security\templates\policies.

Dort werden verschiedene *.dom und *.inf Dateien abgelegt.

Anwenden von mehreren Policies die Sicherheitseinstellungen enthalten


Nun zum eigentlichen Problem. 
Nehmen wir an, wir haben eine OU auf der zwei Richtlinien verlinkt sind.
Richtlinie 2 hat eine höhere Priorität als Richtlinie 1.
Richtlinie 2 wird also später verarbeitet als Richtlinie 1.

Richtlinie 1 enthält diese Einstellungen:
 



Richtlinie 2 enthält diese Einstellungen:




Da Richtlinie 2 keine Sicherheitseinstellungen enthält, sollten eigentlich die Einstellungen von Richtlinie 1 angewendet werden.
(Gruppe JEDER Zugriff verweigern)


Sichtbar ist dies auch im RSoP (Resultant Set of Policies).

Das ist jedoch nicht der Fall. Die Sicherheitseinstellung des genannten Dienstes werden nicht angepasst

Richtlinien die also Sicherheitseinstellungen für Dienste enthalten, müssen immer höher priorisiert sein als Richtlinien die keine Sicherheitseinstellung enthalten.

Möchte man nur den Starttyp definieren, sollte man dies nach Möglichkeit mittels Group Policy Preferences lösen.



Montag, 13. Mai 2013

Der große Group Policy Troubleshooting Guide - Teil 3/3

Teil 1 behandelte vor allem logische Fehler im Umgang mit Gruppenrichtlinien.
Teil 2 befasste sich mit technischen Fehlern und Tools mit denen die Abarbeitung von Richtlinien überprüft werden kann.

Der letzte Teil des GPO Troubleshooting Guides behandelt das Thema "GPO Performance."

Inhalt:
  • Welche Timeouts können beim Abarbeiten von Policies auftreten?
  • Wie lassen sich erhöhte Laufzeiten von Policies erkennen?
  • Welche CSEs können erhöhte Laufzeiten verursachen?
  • Wie wirkt sich das Policy- und AD Design auf die Laufzeit der GPOs aus?
  • Wie wirkt sich Group Policy Loopback auf die Laufzeit der GPOs aus? 
  • Wie wirkt sich die Anzahl der GPOs auf die Laufzeit aus?
Welche Timeouts können auftreten?  
Im Laufe der Gruppenrichtlinienabarbeitung können verschiedene Timeouts auftreten. Da insbesondere bei der synchronen Richtlinienanwendung unendliche Start- und Anmeldezeiten verursacht werden könnten, sind diese Timeouts als Sicherheitsmechanismus anzusehen.

Der 60 Minuten Timeout: 
Diese maximale Zeitspanne lässt sich nicht konfigurieren. Es handelt sich um einen hartcodierten Wert von genau 60 Minuten. Ist eine Client Side Extension nach dieser Zeitspanne mit der Anwendung der Einstellungen nicht fertig, so wechselt die GPO-Engine in den asynchronen Modus. Dies bedeutet nichts anderes, als dass der Start- bzw. Anmeldeprozess fortgeführt wird.
Die restlichen Richtlinien werden (wenn möglich) im Hintergrund abgearbeitet.
Die betreffende CSE wird jedoch nicht beendet, sondern läuft ebenfalls im Hintergrund weiter. 60 Minuten ist ein größzügig bemessener Timeout.
Eine CSE die definitiv in diesen Timeout laufen kann, ist die "Software Installation" CSE. Dauert eine Softwareinstallation länger als 60 Minuten,
so tritt dieses Verhalten ein.

Beim Neustart des Computers und bei der Anmeldung immer auf das Netzwerk warten:
Diese Richtlinie kennen wir bereits aus Teil 2.
Die Beschreibung der Richtlinie lässt vermuten, dass so lange auf das Netzwerk gewartet wird, bis dieses verfügbar ist. Dem ist jedoch nicht so.

Es gilt ein Standard Timeout von 30 Sekunden. Dieser kann mit dieser Richtlinie allerdings geändert werden: 
"Wartezeit für Richtlinienverarbeitung beim Systemstart angeben"
Es kann zusätzlich noch eine separate Policy konfiguriert werden, die die maximale Wartezeit für DirectAccess Verbindungen definiert. Hier ist der Default 60 Sekunden. Leider ist der Name der Policy missverständlich. 

"Wartezeit der Arbeitsbereichskonnektivität für Richtlinienverarbeitung angeben"

Maximale Wartezeit für Gruppenrichtlinienskripts angeben:
Dieser Timeout definiert die maximale Ausführungszeit der Skripte beim Starten, Anmelden, Abmelden und Herunterahren des Computers.
Der Standardwert liegt bei 10 Minuten.
Definiert man eine Wartezeit von 0 Sekunden, so bedeutet dies, unendlich.
Zu beachten ist jedoch, dass die Skripte von keiner CSE ausgeführt werden.
Das bedeutet, der Standard CSE Timeout von 60 Minuten gilt hier nicht.

"Maximale Wartezeit für Gruppenrichtlinienskripts angeben"

Gruppenrichtlinien zur Erkennung von langsamen Verbindungen
Hierbei handelt sich nicht um einen zeitlichen Timeout, sondern vielmehr um eine Bandbreitenmessung. Wird eine langsame Netzwerkverbindung erkannt, so werden Teile der Gruppenrichtlinien nicht angewendet. 
Hierbei handelt es sich um alle Client Side Extensions bei denen der Registrywert "NoSlowLink" auf 0x1 gesetzt wurde.
Dieser Schlüssel befindet sich unter "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\GPExtensions" unterhalb des GUID der jeweiligen CSE


Dies ist das Standardverhalten (Quelle TechNet): 

Richtlinien, die standardmäßig angewendet werden: 
  • Registrierungseinstellungen (aus administrativen Vorlagen) müssen immer angewendet werden – dies kann nicht geändert werden
  • Sicherheitsrichtlinien müssen immer angewendet werden - dies kann nicht geändert werden)
  • EFS-Wiederherstellungsrichtlinie
  • IP-Sicherheit
Richtlinien, die nicht angewendet werden:
  • Anwendungsbereitstellung
  • Skripts
  • Ordnerumleitung
  • Datenträgerkontingente
Alle Verbindungen bei denen eine Bandbreite von weniger 500 KBit/s erkannt wird, gelten standardmäßig als "langsame Verbindung". 
Beeinflusst kann dieser Wert mit dieser Policy werden:
"Gruppenrichtlinien zur Erkennung von langsamen Verbindungen"

Der WMI-Filter Timeout:
Richtlinien können mit WMI Filtern verknüpft werden.
Über die GPO-Performance im Zusammenhang mit WMI-Filtern habe ich bereits in meinem Post "The lies of GPOs! #4" berichtet.
Noch vor Windows Vista (bzw. Server 2008) konnte ein WMI-Filter theoretisch unendlich lange ausgeführt werden. Dies hat man nun mit einem WMI-Timeout unterbunden. Dieser Timeout ist 30 Sekunden und kann nicht geändert werden.

Dauert die Ausführung eines WMI-Filters länger als 30 Sekunden, so wird das Ergebnis mit "false" beantwortet. 
Zwischenzeitlich findet man nun auch auch eine offizielle Erwähnung dieses Timeouts. Den Link hierzu findet ihr hier.

GPP - nicht verfügbare Netzlaufwerke:
Versucht man ein nicht verfügbares Netzlaufwerk mit der Client Side Extension "Drive Maps" zu verbinden, so tritt auch hier ein Timeout auf. 
Dieser liegt ebenfalls bei 30 Sekunden und kann nicht geändert werden.
Möchte man diesen Timeout jedoch umgehen, so kann man Martin Binder's Workaround benutzen.
Mehr dazu findet ihr in seinem Blog-Post über dieses Thema:

http://evilgpo.blogspot.de/2013/01/group-policy-preferences.html
 
Der TCP Standard Timeout
Abschließend sei noch ein Timeout erwähnt, der theoretisch bei unterschiedlichen Sektionen der Gruppenrichtlinienanwendung auftreten kann.

Es handelt sich um den Standard Timeout für TCP/IP Verbindungen.
Dieser Timeout wird von zwei Registryschlüsseln kontrolliert.
Der Schlüssel "TCPInitialRtt" gibt den anfänglichen Timeout an.
Der Schlüssel "TcpMaxDataRetransmissions" gibt dann die Anzahl der Wiederholversuche an. Mit jedem Wiederholversuch wird der Timeout "TCPInitialRtt" dann verdoppelt.
Dieser Timeout ist leider schwer zu erkennen.
Es sollten größere Zeitsprünge im gpsvc.log erkennen zu sein.

Mehr zum Anpassen dieses Timeouts findet ihr hier: http://support.microsoft.com/kb/170359/en-us

Wie lassen sich erhöhte Laufzeiten von Policies erkennen?

Im Eventlog:

Ab Windows Vista lassen sich die Laufzeiten der jeweiligen Client Side Extensions komfortabel im Eventlog ablesen.
Interessieren euch die Laufzeiten der einzelnen Erweiterungen, dann solltet ihr nach Event-ID 5016 suchen.





800x Events zeigen euch die Gesamtlaufzeit der GPO Anwendung.
Dauert die Abarbeitung der jeweiligen CSE ungewöhnlich lange, so wird ein Fehler im Eventlog vermerkt. Die Event-ID ist dann in der Regel die 7016.

Im gpsvc.log:
Das Logfile des Gruppenrichtlinien-Clients muss zunächst aktiviert werden.
Das Logfile lässt sich am komfortabelsten mit dem Policy Reporter auswerten.
Zu beachten ist jedoch, dass nicht alle Ausführungszeiten im Logfile erscheinen.

Die Laufzeiten der Skripte wird zum Beispiel nicht im Logfile erfasst.

In der GPMC und im gpresult /h von Windows 8 und Server 2012:
Über die Funktion "Gruppenrichtlinienergebnisse" können die Laufzeiten der jeweiligen CSEs angezeigt werden.



Mit Hilfe von GPTime.exe
Das Tool GPTime.exe liest die Gesamtlaufzeit der Benutzer- und Computerkonfiguration aus den jeweiligen Registrywerten und konvertiert diese in eine lesbare Zeitangabe.

Welche CSEs können erhöhte Laufzeiten verursachen?
Die Anwendung der Richtlinien besteht aus zwei Anteilen:

Dem "Core Processing":
Hierbei wird bestimmt, welche Richtlinien angewendet werden müssen.
Es werden die Sicherheits- und WMI Filter durchlaufen.
Zudem wird ermittelt welche CSEs registriert sind und welche CSEs aufgerufen werden müssen.
Dem "CSE Processing":
Hierbei werden die eigentlichen Einstellungen angewendet.
Jede zutreffende CSE wird nach ihrer registrierten Reihenfolge ausgeführt
und arbeit die Einstellungen ab.
Die jeweils benötigte Zeitdauer dieser beiden Anteile kann variieren.  

Bei asynchroner Richtlinenverarbeitung gilt:
Bei einem nicht erzwungenen GPO Refresh (z.B. gpupdate) nimmt das Core Processing in der Regel mehr Zeit in Anspruch als das CSE Processing.
Erzwingt man jedoch einen vollständigen Refresh (z.B. gpupdate /force),
so müssen alle Einstellungen erneut angewendet werden.
Hierbei nimmt das CSE Processing in der Regel mehr Zeit in Anspruch. 

Bei synchroner Richtlinenverarbeitung gilt:
Da in diesem Falle auf das Netzwerk gewartet wird, kann das Core Processing mehr Zeit benötigen. Wie lange das CSE Processing dauert, hängt in erster Linie von den Einstellungen in den Richtlinen ab.  
Typische Beispiele für zeitintensive Client Side Extensions:
  • Software Installation CSE
    Je nachdem wieviele und wie umfangreiche Installationen ausgeführt werden, kann diese CSE viel Zeit beanspruchen.
  • Security CSE
    Mit dieser CSE lassen sich unter anderem Datei- und Ordnerberechtigungen setzen. Werden Verzeichnisse mit vielen Dateien bearbeitet, so kann diese CSE sehr viel Zeit in Anspruch nehmen.
  • Scripts CSE
    Hier muss man unterscheiden. Die eigentliche CSE ist sehr schnell abgearbeitet. Hierbei werden nur die Einstellungen in die Registry geschrieben. Die Skripte laufen dann unabhängig von der Richtlinenanwendung beim Starten, Anmelden, Abmelden und Herunterfahren. Sind hier zeitintensive Skripte hinterlegt, so kann auch hier eine hohe Ausführungszeit entstehen.
Der Sonderfall Group Policy Preferences Item Level Targeting:
GPPs (Group Policy Preferences) bieten einem die Möglichkeit eine sogenannte Zielgruppenadressierung (Item Level Targeting) zu verwenden. Mehr dazu auch im Abschnitt "Item Level Targeting - jetzt wird es granular" im Teil 1 des Guides.
Der Sonderfall hierbei ist, dass das Filtern innerhalb des CSE Processings stattfindet. Hier können ebenfalls zeitintensive Filter hinterlegt sein.
Zielgruppenadressierungen die viel Zeit in Anspruch nehmen können:

  • Sicherheitsgruppenziele
    Auf Computerebene kann diese viel Zeit beanspruchen.
    Auf Benutzerebene wird dies lokal ausgeführt und benötigt nur wenig Zeit.
  • LDAP-Abfrage 
  • Domäne
  • Siteziele
  • Organisationseinheit
Tipp:
Eine Liste der Zielgruppenadressierungen findet ihr hier.
Mehr zum Thema ITLs die viel Zeit in Anspruch nehmen können findet ihr hier.
Wie wirkt sich das Policy- und AD Design auf die Laufzeit der GPOs aus?
Bei dem Thema möchte ich vor allem auf MVP Darren Mar-Elia's exzellenten Beitrag hinweisen.
 

Er unterteilt Richtlinien in zwei Kategorien.
"Monolithic and Functional GPOs".


"Monolithic GPOs":
Enthalten Einstellungen aus verschiedenen Gruppenrichtlinienbereichen (z.B. administrative Vorlagen, Sicherheitseinstellungen, Software Installationen).
Da die Versionierung nur pro Computerkonfiguration und Benutzerkonfiguration besteht, so müssen im Zweifelsfalle bei einer Änderung alle Einstellungen erneut angewendet werden. Die Delegierung (Zugriffsrechte) an einzelne Administratoren gestaltet sich hier schwierig, da dies ebenfalls nur pro Richtlinie möglich ist.
Um ein einfaches Beispiel zu nennen:
In einem großen Unternehmen gibt es Administratoren die nur administrative Vorlagen verwalten. Verwendet man nun "Monolithic GPOs", so könnten diese Administratoren mit ihren Zugriffsrechten auch andere Richtlinien Einstellungen (z.B. Skripte) bearbeiten.
"Functional GPOs":

Enthalten Einstellungen aus speziellen Bereichen (z.B. nur administrative Vorlagen). Hierbei besteht das beschriebene Problem mit der Versionierung nicht. Jedoch führt dies unweigerlich zu einer großen Anzahl von Richtlinien. Diese Richtlinien können jedoch aufgrund ihrer Granularität besser an einzelne Administratoren delegiert werden.

Wie wirkt sich Group Policy Loopback auf die Laufzeit der GPOs aus? 
Group Policy Loopback kann in zwei verschiedenen Modi ausgeführt werden,
Merge und Replace.


Loopback Merge:
Hierbei entstehen zwei GPO Durchläufe.
Der erste Durchlauf läuft wie gewohnt ab, die Benutzereinstellungen werden anhand der Position des Benutzerobjekts im Active Directory abgearbeitet.
Ist dieser Prozess abgeschlossen, wird der Suchfilter geändert.
Nun startet ein zweiter Durchlauf, hierbei ist allerdings die Position des Computerobjekts im Active Directory entscheidend.
Zum Verständnis noch einmal, es geht nur um die Anwendung der Benutzereinstellungen. Loopback Merge verdoppelt die Abarbeitungszeit der Richtlinien nahezu. 

Loopback Replace:
Bei Replace ist nur noch die Position des Computerobjekts entscheidend.
Es gibt nur einen Durchlauf. Loopback Replace hat praktisch keine Auswirkungen auf die Abarbeitungszeit der Richtlinien.


Wie wirkt sich die Anzahl der GPOs auf die Laufzeit aus?
Die Antwort ist kurz und knapp: Geringfügig.
Die Anzahl der Richtlinien ist kaum entscheidend. Die Ausführungszeit wird vielmehr von den Einstellungen der Policies und den Filtern, die mit den Policies verknüpft sind, beinflusst.