Zur Zeit unterstütze ich einen größeren Konzern bei einer Migration. Ein Kollege kam auf mich zu und fragte, ob ich ihm ein Powershell-Skript zur Durchforstung des gesamten AD Forests schreiben könnte.
Na klar – sagte ich 🙂
Hier ist das Skript um den nächstgelegenen Domain Controller zu finden.
Index
Forest durchforsten mit Get-ADForest
Mit den Active Directory cmdLets von Microsoft lässt sich ein AD Forest sehr schön durchforsten.
Zunächst holt man sich mit dem cmdLet Get-ADForest den Forest als Objekt in eine Variable:
1 |
$forest = Get-ADForest <forest.com> |
Im nächsten Schritt will ich alle Domains des Forest durchforsten.
Das Forest Objekt hat eine Eigenschaft „Domains„, welche eine Liste der Domains des Forests enthält.
Mit einer ForEach Schleife kann man sehr einfach jede einzelne Domain des Forests ansprechen:
1 2 3 4 |
ForEach ($Domain in $Forest.Domains) { Write-Host "Current domain name: " $Domain } |
Nahegelegenen DC abfragen mit Get-ADDomainController
Das war bis hier her sehr schön und einfach. Jedoch in einer großen verteilten Umgebung, mit weltweit verteilten Domain Controllern, möchte ich die Abfragen nicht an einen DC am anderen Ende der Welt richten.
Ich möchte gern den optimalen, nächstgelegenen DC finden.
Für diese Aufgabe gibt es ein spezielles cmdLet, welches ich zu diesem Zweck verwende:
Get-ADDomainController
Mit den beiden Parametern -Discover und -NextClosestSite nutzt das cmdLet die Active Directory Sites & Services Konfiguration um den nächst gelegenen Domain Controller für meinen Standort bzw. mein IP Subnetz auszuwählen.
1 2 3 4 5 |
ForEach ($Domain in $Forest.Domains) { Write-Host "Current domain name: " $Domain $DCobj = Get-ADDomaincontroller -DomainName $Domain -Discover -NextClosestSite } |
DC-Namen auslesen
Das Objekt $DCobj kann man leider nicht direkt verwenden um damit einen DC für anderes cmdLets zu definieren. Mit einem Zwischenschritt lässt sich der Name des DC aus der Eigenschaft HostName des $DCobj auslesen und in die Variable $DChost als String schreiben.
1 2 3 4 5 6 |
ForEach ($Domain in $Forest.Domains) { Write-Host "Current domain name: " $Domain $DCobj = Get-ADDomaincontroller -DomainName $Domain -Discover -NextClosestSite [string]$DChost = $DCobj.HostName } |
DC-Namen mit Parameter -Server verwenden
Nachdem wir den Hostname des nächst gelegenen Domain Controllers nun herausgefunden haben, können wir diesen bei den meisten AD cmdLets mit dem Parameter -Server verwenden um den gewünschen DC anzugeben.
1 2 3 4 5 6 7 |
ForEach ($Domain in $Forest.Domains) { Write-Host "Current domain name: " $Domain $DCobj = Get-ADDomaincontroller -DomainName $Domain -Discover -NextClosestSite [string]$DChost = $DCobj.HostName $result = Get-ADObject -LDAPFilter "(attribute=value)" -Server $DChost } |
Mit dieser Prozedur nutzt das cmdLet Get-ADObject den nächstgelegenen Domain Controller zur Abfrage der AD Domain. Ausgewählt wurde der DC mit dem cmdLet Get-ADDomaincontroller unter Berücksichtigung der Active Directory Sites & Services Konfiguration.
Dieser Artikel entstand bei Projekten der FirstAttribute AG
AD Consulting | AD Migration
Sie planen Veränderungen an Ihrem AD?
Nehmen Sie Kontakt zu uns auf, wir hören Ihnen gern zu.
Leave a Reply
<p>Danke für Ihre Anregungen, Fragen und Hinweise.<br/>Infos zum <a href="https://www.active-directory-faq.dekontakt/">Datenschutz</a></p>