Powershell: Domaincontroller in einer Multiforest Umgebung ermitteln

Wir benötigten in einem Unternehmensnetzwerk mit mehreren Active Dirctory Forests eine Lösung, um alle Domaincontroller ermitteln.

Alle Forest bestehen nur aus einer Active Directory Domain. Alle Forests haben eine Vertrauensstellung zu einer Domain mit den administrativen Konten und zentralen Diensten. In dieser Domain wird das Skript ausgeführt.

Zunächst verfolgten wir folgenden Ansatz: Wir erstellten eine Liste mit den DNS-Namen der Forests und ermittelten einen Domain Controller mit folgendem Powershell-Befehl aus den Active Directory Module für die Powershell:

Get-adDomainController –domain intern.foo.de –discover

Damit erhält man für die angegebene Domain einen Domain Controller und für diesen den Hostname und die IP-Adressen. Mit get-ADDomain kann man dann unter Angabe des Servers aus der Eigenschaft ReplicaDirectoryServers eine Liste der Domaincontroller ermittelt werden:

$DomainController = Get-adDomainController –domain intern.foo.de –discover

$domain = Get-ADDomain intern.foo.de –server $DomainController.Hostname[0]

$domain.ReplicaDirectoryServers

Soweit – so gut.

Das Verfahren hat allerdings folgende Einschränkungen:

    Wir müssen eine Liste der Active Directory Forest pflegen.

    Auf dem Computer, auf den die Befehle ausgeführt werden, muss das Active Directory Module für die Powershell installiert sein.

    Der Domaincontroller, der mit get-adDomainController ermittelt wird, muss die Active Directory Web Services ausführen, sonst funktioniert get-adDomain nicht.

    Das war allerdings in unserem Projekt nicht gewährleistet.

Wir mussten die Lösung deshalb also „verallgemeinern“.

    Ermitteln der vorhandenen Active Directory Domains

    Ermitteln der Domain Controller

ohne das wir das Active Directory Module für die Powershell verwenden.

Dazu haben wird die .NET-Klasse System.DirectoryServices.ActiveDirectory.Domain verwendet:

$Domains = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().GetallTrustRelationships()

$Dcs = @()

Foreach ($domain in $Domains) {

$context = New-Object    System.DirectoryServices.ActiveDirectory.DirectoryContext(“domain”,$Domain.TargetName)

$DCs += [System.DirectoryServices.ActiveDirectory.Domain]::GetDomain($context)

}

# Hinzufügen der aktuellen Domain, da nicht in der Liste

$DCs + = [System.DirectoryServices.ActiveDirectory.Domain]::GetcurrentDomain()

$Dcs

Die Domain, in der das Skript ausgeführt wird, musste noch hinzugefügt werden.

Die Liste $DCs enthält für jede Domain folgende Angaben:

Forest : ad.foo.xyz

DomainControllers       : {DC001.ad.foo.xyz, TREV-DC002.ad.foo.xyz}

Children               : {}

DomainMode             : Windows2012R2Domain

DomainModeLevel         : 6

Parent                 :

PdcRoleOwner            : DC001.ad.foo.xyz

RidRoleOwner           : DC001.ad.foo.xyz

InfrastructureRoleOwner : DC001.ad.foo.xyz

Name                   : ad.foo.xyz

Durch Auswertung der Property DomainControllers können die Domaincontroller der Domain ermittelt werden.

Die Lösung kann leicht erweitert werden, wenn z.B. ein Forst aus mehreren Domains besteht (Multi-Domain-Forest), falls die ermittelte Domain die Root Domain des Forest ist.

$context = New-Object System.DirectoryServices.ActiveDirectory.DirectoryContext(“domain“,“ad.foo.xyz“)

$Forest = [System.DirectoryServices.ActiveDirectory.Forest]::GetForest($Context)

$Forest.Domains

Im Attribute $Forest.Domains finden wir eine Liste der Domains in dem abgefragten Forest. Über diese Einträge kann bei vorliegenden einer transitiven Vertrauensstellung die Liste der Domaincontroller erstellt werden.

Share on facebook
Facebook
Share on twitter
Twitter
Share on linkedin
LinkedIn
Share on pinterest
Pinterest
Share on email
Email
Scroll to Top