Es ist wirklich gigantisch wie viele Mails ich in letzter Zeit erhalten habe, was denn los wäre und warum ich mit meinen Blogeinträgen aufgehört hätte.
Deshalb vorweg hier ein paar Antworten auf Mails die ich erhalten habe: Mir geht es zum Glück gesundheitlich gut. Nein, ich habe weder das Land, noch diesen Planeten verlassen. Nein, auch das Schreiben an einen TV-Sender für die Sendung „Bitte melde dich“ ist nicht notwendig. Ja, ich bin weiterhin in der IT-Branche tätig. Nein, ich muss mich auch nicht verstecken.
Aber was ist passiert?
Wie ihr wisst können sich manchmal privat und/oder beruflich Situationen ergeben, die höchste Aufmerksamkeit und vor allem viel Zeit verlangen und dadurch die Internetaktivitäten (bei mir Blogartikel schreiben und in Foren teilnehmen) vorübergehend ausgesetzt werden müssen. So wie auch bei mir.
Zum einen habe ich mich zum 01.06.2011 beruflich verändert! Nach 10 Jahren bei meinem letzten Arbeitgeber wollte ich neue Aufgaben und neue Herausforderungen haben, um mich mit vollem Elan weiter nach vorne zu entwickeln.
Seit dem 01.06.2011 bin ich bei Microsoft Deutschland GmbH als Premier Field Engineer (PFE) – Active Directory am Standort „Bad Homburg“ mit viel Freude tätig! An dieser Stelle möchte ich alle meine PFE – Kolleginnen und Kollegen grüßen. 
Aber die berufliche Veränderung ist noch nicht genug! Zum anderen bzw. zeitgleich oder kurz vor meinem Jobwechsel haben sich meine bessere Hälfte und ich dazu entschieden, ein Massivhaus zu bauen. Das hatte mir monatelange schlaflose Nächte bereitet! Jobwechsel und Hausbau zur gleichen Zeit? Und das wo ich doch gerade der Sicherheitsmensch bin. Unser jetziges Haus muss schließlich auch noch so nebenbei verkauft werden. :-/
Aber letzten Endes haben wir uns gemeinsam dazu entschieden, beides zu tun. Die vielen Gespräche mit der Familie, Freunden, Microsoft-Freunden haben alle dazu beigetragen, diesen Schritt zu gehen. Wie heißt es so schön: No risk – no fun. Spatenstich ist in ca. zwei Wochen.
Lange Rede kurzer Sinn: Wie geht es hier nun weiter?
Wie gehabt, nur nicht mehr so wie in den vergangenen fünf Jahren (meist) im zwei-Wochen Rhythmus. Ich hoffe ihr versteht das! Natürlich betreibe ich meine mit Herzblut betriebene Web-Visitenkarte bzw. meinen Blog weiter. Die Leser meines Blogs (zwischen 4.000 bis 6.000 unique Hits pro Tag) und die vielen Mails in den vergangenen 2 Monaten sind Motivation genug um weiterzumachen!
Wenn dann mal der Alltag einkehrt (Hausbau fertig inkl. des Umzugs was Ende diesen Jahres/Anfang 2012 geplant ist), geht es hier mit Vollgas weiter. Bis dahin versuche ich jedoch auch noch einiges zu schreiben. Ich bitte euch nur um Nachsicht. 
So, nun habt ihr ein Lebenszeichen vor mir erhalten und kennt die Umstände, warum es hier in letzter Zeit so ruhig geworden ist. Ich mach‘ mich wieder ans lernen und freue mich schon, viele Leser meines Blogs in meiner neuen Rolle als AD-PFE demnächst im Berufsleben persönlich kennenzulernen. Einige konnte ich bereits kennenlernen.
Mit dem Wechsel zu Microsoft habe ich natürlich meine drei Buchstaben, sprich meinen MVP Titel abgeben müssen. Naja, ich habe meine drei Buchstaben nicht abgegeben, sondern gegen zwei [MS] bzw. 4 Buchstaben [MSFT ß das ist die Abkürzung an der Börse] eingetauscht. =) Und wenn mein Blogbetreiber, der kein anderer als der ice-Veranstalter „Nicki Wruck“ ist, mal die Zeit findet, wird er sicher demnächst auch das MVP-Logo auf der linken Seite meines Blogs entfernen.
Man liest und ab sofort trifft man sich auch im Berufsleben!
Active Directory (AD) basierte Gruppenrichtlinienobjekte (auf Englisch: Group Policy Object, kurz GPO) bestehen hauptsächlich aus zwei Komponenten, bestehend aus der logischen und physikalischen Struktur. Der logische Teil einer GPO wird in der AD-Datenbank (NTDS.dit) gespeichert und wird als Gruppenrichtliniencontainer (auf Englisch: Group Policy Container, kurz GPC) bezeichnet. Die physikalische Komponente einer GPO wird im Dateisystem, im replizierten Verzeichnis SYSVOL gespeichert und lautet Gruppenrichtlinienvorlage (auf Englisch: Group Policy Template, kurz GPT).
In den Eigenschaften eines GPC werden alle AD relevanten Konfigurationsdaten einer GPO gespeichert, wie beispielsweise der Pfad zur Gruppenrichtlinienvorlage (das Attribut gPCFileSysPath im entsprechenden GPC, also der Pfad zum GPT), der Status von Gruppenrichtlinienobjekten (das Attribut flags) oder die Zugriffsteuerungsliste (Access Control List, kurz ACL) die bestimmt, welcher Benutzer bzw. Gruppe die Einstellungen eines GPOs verwalten darf. Den GPC selbst findet man in der Domänenpartition im Container CN=Policies,CN=System,DC=<Domäne>. Diesen Container kann man in der MMC Active Directory-Benutzer und –Computer (dsa.msc) zum Vorschein bringen. Dazu muss man jedoch zuerst in der MMC dsa.msc unter Ansicht die „Erweiterte Features“ aktivieren. Die GPC werden im AD-Container Policies mit ihrer {GUID} dargestellt und ist derselbe, wie er auch im GPT angezeigt wird.
Im GPT befinden sich die meisten Einstellungen eines GPOs sowie verschiedene Verzeichnisse und Konfigurationsdateien. Im GPT werden also alle aktuellen GPO-Einstellungen eines GPOs gespeichert. Die GPTs werden im Dateisystem tatsächlich unter %windir%\SYSVOL\domain\Policies, jeweils dargestellt mit ihrer {GUID}, gespeichert. Nicht zu verwechseln mit den Junction Points unter %windir%\SYSVOL\sysvol\<Domäne>\Policies. Tools für die Verwaltung von GPOs (z.B. die GPMC) verwenden die Junction Points und nicht den echten Speicherort der GPTs.
Wichtig für das Troubleshooting ist zu wissen, dass die hauptsächlichen Komponenten einer GPO, nämlich der GPC und das GPT, auf unterschiedliche Weise repliziert werden. Der GPC wird im Rahmen der AD-Replikation repliziert. Das GPT wird je nach Domänenfunktionsmodus entweder vom FRS (File Replication Service) oder vom DFS-R (Distributed File System Replication) repliziert. Liegen die Wurzeln einer Domäne im Domänenfunktionsmodus „Windows Server 2003“ oder niedriger, wird das GPT durch den FRS repliziert. Wurde die Domäne mindestens im Domänenfunktionsmodus „Windows Server 2008“ installiert, kommt DFS-R für die Replikation des GPT und somit des SYSVOLs zum Einsatz.
Die Performance bei der Abarbeitung von GPOs erhöhen
Für die Performance des Clients bei der Abarbeitung von GPOs (die auf ihn wirken) ist es empfehlenswert, den nicht konfigurierten Teil einer GPO stets zu deaktivieren. Das bedeutet, wenn in einer GPO lediglich Einstellungen im Benutzerkonfigurationsteil vorgenommen wurden, sollte der Computerkonfigurationsteil deaktiviert werden und vice versa.
Deaktivieren lässt sich ein Teil oder die gesamte GPO in der GPMC (Group Policy Management Console, zu Deutsch: Gruppenrichtlinienverwaltungskonsole). Mit einem Rechtsklick auf der entsprechenden GPO wählt man die Option Objektstatus aus und kann dann den gewünschten Teil oder die gesamte GPO deaktivieren. Das funktioniert auch wenn man die entsprechende GPO in der GPMC ausgewählt hat und danach zum Reiter Details wechselt.

Den Status der GPOs abfragen
Den Status einer GPO veranschaulicht das Attribut flags, das sich in den Eigenschaften jedes GPCs befindet. Dabei kann das Attribut flags folgende Werte enthalten:
- Der Wert 0 im Attribut flags bedeutet, das gesamte Gruppenrichtlinienobjekt, also der Benutzerkonfigurations- und Computerkonfigurationsteil ist aktiviert.
- Der Wert 1 bedeutet, der Benutzerkonfigurationsteil einer GPO ist deaktiviert.
- Ist der Wert 2, wurde der Computerkonfigurationsteil einer GPO deaktiviert.
- Beim Wert 3 ist das gesamte GPO deaktiviert.
State of the Art kann man den Status der GPOs in der AD-PowerShell mit folgenden Einzeilern abfragen:
# Alle GPOs mit ihrem Status anzeigen lassen:
Get-ADObject -Server <DC> -LDAPFilter "(flags=*)" -SearchBase "CN=Policies,CN=System,DC=<Domäne>" -SearchScope Subtree -Properties displayName,flags | Select displayName,flags | FT -A
# Alle GPOs anzeigen, die beide Teile (Benutzer- und Computerkonfiguration) aktiviert haben:
Get-ADObject -Server <DC> -LDAPFilter "(flags=0)" -SearchBase "CN=Policies,CN=System,DC=<Domäne>" -SearchScope Subtree -Properties displayName,flags | Select displayName,flags | FT -A
# Alle GPOs die den Teil der Benutzerkonfiguration deaktiviert haben, werden folgendermaßen angezeigt:
Get-ADObject -Server <DC> -LDAPFilter "(flags=1)" -SearchBase "CN=Policies,CN=System,DC=<Domäne>" -SearchScope Subtree -Properties displayName,flags | Select displayName,flags | FT -A
# Alle GPOs die den Computerkonfigurationsteil deaktiviert haben, werden wie folgt angezeigt:
Get-ADObject -Server <DC> -LDAPFilter "(flags=2)" -SearchBase "CN=Policies,CN=System,DC=<Domäne>" -SearchScope Subtree -Properties displayName,flags | Select displayName,flags | FT -A
# Alle komplett deaktivierten GPOs (beide Teile Benutzer- und Computerkonfigurationsteil sind deaktiviert) werden so angezeigt:
Get-ADObject -Server <DC> -LDAPFilter "(flags=3)" -SearchBase "CN=Policies,CN=System,DC=<Domäne>" -SearchScope Subtree -Properties displayName,flags | Select displayName,flags | FT -A
Das Attribut flags automatisiert mit einem AD-PowerShellskript abfragen
Man kann die Abfrage auch automatisiert mit folgendem AD-PowerShellskript durchführen.
######################################################
#
# AD-PowerShellskript zur Statusabfrage von GPOs
#
# Von: Yusuf Dikmenoglu 05/2011
#
# http://blog.dikmenoglu.de
#
######################################################
$auswahl = Read-Host "Welcher GPO-Status soll angezeigt werden (0... Alle komplett aktiven GPOs anzeigen 1...Benutzerkonfiguration ist deaktiviert 2...Computerkonfiguration ist deaktiviert 3...GPOs die komplett deaktiviert sind):"
switch ($auswahl){
0 {
Get-ADObject -Server <DC> -LDAPFilter "(flags=*)" -SearchBase "CN=Policies,CN=System,DC=<Domäne>" -SearchScope Subtree -Properties displayName,flags | ForEach-Object {
if ($_.flags -eq 0){
write-host "Gesamte GPO aktiviert: " $_.displayName
}
}
}
1 {
Get-ADObject -Server <DC> -LDAPFilter "(flags=*)" -SearchBase "CN=Policies,CN=System,DC=<Domäne>" -SearchScope Subtree -Properties displayName,flags | ForEach-Object {
if ($_.flags -eq 1){
write-host "Benutzerkonfiguration des GPO ist deaktiviert: " $_.displayName
}
}
}
2 {
Get-ADObject -Server <DC> -LDAPFilter "(flags=*)" -SearchBase "CN=Policies,CN=System,DC=<Domäne>" -SearchScope Subtree -Properties displayName,flags | ForEach-Object {
if ($_.flags -eq 2){
write-host "Computerkonfiguration des GPO ist deaktiviert: " $_.displayName
}
}
}
3 {
Get-ADObject -Server <DC> -LDAPFilter "(flags=*)" -SearchBase "CN=Policies,CN=System,DC=<Domäne>" -SearchScope Subtree -Properties displayName,flags | ForEach-Object {
if ($_.flags -eq 3){
write-host "Gesamte GPO deaktiviert: " $_.displayName
}
}
}
default{
Write-Host "Ungültige Eingabe"
}
}
Der Unterschied zwischen einer beschreibbaren und nur lesbaren Verzeichnispartition (auf Englisch Naming Context, kurz NC) liegt im Attribut instanceType. Dieses Attribut besteht aus einer Bitmaske und existiert in den Eigenschaften jeder Verzeichnispartition. Ist das dritte Bit (Hex = 0x4; Dezimal = 4) im Attribut instanceType, in den Eigenschaften einer Verzeichnispartition auf einem DC gesetzt, so ist die Verzeichnispartition auf diesem DC beschreibbar. Falls das dritte Bit nicht gesetzt ist, ist die Verzeichnispartition auf diesem DC nur lesbar.
Da ein Read-Only Domänencontroller (RODC) nur einen lesenden Zugriff auf die Active Directory-Datenbank (NTDS.DIT) und somit auf alle Verzeichnispartitionen hat, ist logischerweise in allen Verzeichnispartitionen die sich auf einem RODC befinden das dritte Bit in instanceType nicht gesetzt!
Auch in den fremden Domänenpartitionen die sich im globalen Katalog befinden, ist das dritte Bit in instanceType nicht gesetzt!
Überprüfen kann man das mit dem Schweizer Messer Werkzeug für die AD-Replikation Repadmin. Führt man den Befehl Repadmin /showrepl /verbose in der Kommandozeile aus, erhält man solch eine Ausgabe:

In der Ausgabe werden alle Verzeichnispartitionen aufgelistet, die der DC repliziert. Die Verzeichnispartitionen in denen der DC das Schreibrecht besitzt, sind mit WRITEABLE gekennzeichnet. Die Verzeichnispartitionen in der der DC lediglich das Leserecht besitzt, sind nicht mit WRITEABLE gekennzeichnet.
Ob eine Verzeichnispartition auf einem bestimmten DC nur lesbar oder beschreibbar ist, kann man mit dem folgenden AD-PowerShellskript überprüfen:
######################################################
#
# AD-PowerShellskript zum überprüfen ob eine Verzeichnispartition
# nur lesbar oder beschreibbar ist.
#
# Von: Yusuf Dikmenoglu 05/2011
#
# http://blog.dikmenoglu.de
#
######################################################
# Hier den distinguishedName der entsprechenden Verzeichnispartition (= NC = Naming Context) angegeben
$searchbase = "DC=ad2008R2,DC=dikmenoglu,DC=de"
# Wenn man einen NC von einem globalen Katalog (GC) abfragen möchte, muss man bei "-Server" den FQDN
# des DCs und den GC-Port angeben. Also: "R2DCON01.ad2008R2.dikmenoglu.de:3268"
Get-ADObject -Server R2DCON01 -LDAPFilter "(instanceType=*)" -SearchBase $Searchbase -SearchScope base -Properties instanceType | ForEach-Object {
if ($_.instanceType -band 4){
write-host $_.ncName "Beschreibbare Verzeichnispartition: $Searchbase"
}
else{
write-host $_.ncName "Lesbare Verzeichnispartition: $Searchbase"
}
}
Weitere Informationen: Welche Verzeichnispartitionen befinden sich auf einem DC? Instance-Type Attribute Read-Only Domain Controller (RODC)
Hin und wieder kommt es vor, dass man den Benutzeranmeldenamen mehrerer Domänen-Benutzer ändern muss. Da sich die Domänen-Benutzer mit dem „Benutzeranmeldenamen“ oder mit dem „Benutzeranmeldenamen (Prä-Windows 2000)“ anmelden können, müssen beim ändern des Benutzeranmeldenamen die Werte in den beiden Attributen userPrincipalName (kurz, UPN) und sAMAccountName geändert werden. Bei wenigen Benutzern lassen diese sich recht einfach händisch ändern. Doch wie sieht es mit hunderten oder >1.000 Benutzern aus?!
Diese Aufgabe lässt sich einfach und State of the Art mit Excel und der AD-PowerShell lösen! Die Basisdaten kann man sich recht simpel in eine CSV-Datei, die sich wiederum in Excel importieren lässt, aus dem AD exportieren. Dazu eignen sich CSVDE und die AD-PowerShell. Wie man einen Export (und Import) mit CSVDE oder der AD-PowerShell durchführen kann, zeigt dieser Artikel:
Massenimporte- und -exporte mit CSVDE und der AD-PowerShell durchführen
Die Excel-Datei könnte beispielsweise folgendermaßen aussehen:

Danach lässt sich der userPrincipalName sowie sAMAccountName mit dem folgenden AD-PowerShellskript ändern.
######################################################
#
# AD-PowerShell Skript zum umbenennen von AD-Benutzer.
# Mit diesem Skript wird der sAMAccountName, userPrincipalName
# und das Attribut name umbenannt
#
# Von: Yusuf Dikmenoglu 04/2011
#
# http://blog.dikmenoglu.de
#
######################################################
clear
# Excel Einstellungen
$excel = New-Object -ComObject Excel.Application # create base object
$excel.visible = $false
$wb = $excel.workbooks.open("C:\Tools\Benutzernamen.xls")
$ws1 = $wb.Worksheets.item(1)
# Programmbeginn
$count = 5
for ($index = 2; $index -lt $count; $index++) {
Write-Host $index
$loginAlt = $ws1.Cells.Item($index,6).text.trim()
$loginNeu = $ws1.Cells.Item($index,10).text.trim()
$aduser = Get-ADUser $loginAlt | ForEach-Object {
$ws1.Cells.Item($index,4) = $_.givenname
$ws1.Cells.Item($index,3) = $_.surname
$pricipalname = $loginNeu + "@Domäne.de"
Set-ADUser -Identity $loginAlt -SamAccountName $loginNeu -UserPrincipalName $pricipalname
Rename-ADObject -Identity $loginAlt -NewName $loginNeu # Funktioniert nur, wenn das Attribut "name" gleich "sAMAccountName" ist
}
}
$wb.save()
$wb.Close()
$excel.Quit()
Weitere Informationen: Die Active Directory-Attribute hinter den Feldnamen Die AD Management Gateway Services für Windows Server 2003 und Windows Server 2008 LDIFDE - LDAP Data Interchange Format Data Exchange
|
Copyright © 2012 Yusuf Dikmenoglu. All rights reserved.
DasBlog 'Portal' theme by Johnny Hughes.
Pick a theme:
|
|