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.

 

Feedback

Haben Sie Fragen, Anregungen oder Kritik zu diesem Beitrag?
Nutzen Sie unser Feedback-Tool. Wir freuen uns auf Ihre Nachricht.

Ihre E-Mail-Adresse (Pflichtfeld)

Ihre Nachricht (Pflichtfeld)

Ich stimme zu, dass die Verarbeitung meiner Daten gemäß Punkt 3 der Datenschutzerklärung erfolgt .

Trevedi

Trevedi IT-Consulting GmbH
Gottfried-Hagen-Str. 30
51105 Köln

T +49 (0)221 – 3 55 88 88 – 0
E info(@)trevedi.de

Trevedi Partnerlogos

Top