Powershell: Active Directory Replikationsverbindungen erstellen

Der Austausch eines Domain Controllers ist eigentlich keine aufwendige Angelegenheit. Spannend wird es, wenn das Active Directory viele Standorte hat und der auszutauschende Domain Controller als Replikationshub für viele andere Standorte konfiguriert ist. Wir hatten eine solche Situation. Am Hauptstandort des Active Directory sollte einer von zwei Domaincontroller ausgetauscht werden. Der Domain Controller war der Replikationshub für fast 30 der Active Directory   Standorte. An den Remotestandorten mit jeweils einem Domain Controller waren eingehende Verbindungen von dem zu ersetzenden Domain Controller konfiguriert. Am zentralen Standort waren eingehende Replikationsverbindungen von Remotestandorten erstellt worden. Der Intersite-Topology-Generator ist für alle Standort deaktiviert.

Der auszutauschende Domain Controller heißt DC001.foo.intern. Der neue Domain Controller ist DC003.foo.intern. Der Hauptstandort ist die Zentrale. Alle Replikationsverbindungen, die DC001 verwendeten, waren auf DC003 umzustellen:

Zunächst musste festgestellt werden, mit welchen anderen Domain Controller Active Directory Verbindungen für DC001 bestehen. Um die vorhanden Replikationsbeziehungen zu ermitteln, kann Get-ADReplicationConnection verwendet werden.

Die Servername des Domaincontrollers und die Standortnamen werden leider nicht als eigene Properties zurückgeliefert, sondern „verstecken“ sich in den Eigenschaften ReplicateFromDirectoryServer und ReplicatetoDirectoryServer. Wir sind deshalb folgenden Weg gegangen, die Replikatiosverknüpfungen des DC001 zu ermittel:

Alle eingehenden Replikationsverbindungen von DC001 an Remotestandorten ermitteln:

$ConnectionstoRemoteSites = get-adReplicationConnection -filter * | where {($_.ReplicateFromDirectoryserver -match “,cn=DC001,”) -and ($_.ReplicatetodirectoryServer -notmatch “,cn=Zentrale,”)}

Alle von Remotestandorten eingehenden Replikationsverbindungen nach DC001 in der Zentrale:

$ConnectionsFromRemoteSites = get-adReplicationConnection -filter * | where {($_.ReplicatetoDirectoryServer -match “cn=DC001,”) -and ($_.replicatefromDirectoyServer -notmatch “cn=Zentrale”)}

Den Filter ($_.ReplicatetodirectoryServer -notmatch „,cn=Zentrale,“) habe wird aufgenommen, da die Verknüpfungen innerhalb des Standortes Zentrale nicht bearbeitet werden sollten.

Zunächst einmal sicherten wir die Abfrageergebnisse in zwei CSV-Dateien, wobei uns der distinguishedName jeder Replikationsverknüpfung, RelicatetoDirectoryServer und ReplicateFromDirectory interessiert:

$ConnectionstoRemoteSites | select distinguishedName,ReplicatefromDirectoryServer,ReplicatetoDirectorySercver export-csv DC001.ConnectionstoRemoteSites.csv -delimiter “;” -encoding utf8 -notype

$ConnectionsFromRemoteSites | select distinguishedName,ReplicatefromDirectoryServer,ReplicatetoDirectorySercver export-csv DC001.ConnectionsFromRemoteSites.csv -delimiter “;” -encoding utf8 –notype

Aus den CSV-Dateien lassen sich leicht zwei weitere CSV-Dateien erstellen, die die Spalten toServerName und fromServername enthalten:

toServername;fromServerName

DC001;DC101

DC001;DC201

…….

Wir ersetzen den DC001 in beiden Dateien durch den DC003 und speichern diese Dateien als DC003.NewConnections.toRemoteSites.csv und DC003.NewConnections.FromRemoteSites.csv.

DC003.NewConnections.toRemoteSites.csv:

toServername;fromServerName

DC101;DC003

DC201;DC003

…….

DC003.NewConnections.FromRemoteSites.csv

toServername;fromServerName

DC003;DC101

DC003;DC201

…….

Mit beiden Dateien versorgen wir ein Skript, das die benötigten Replikationsverknüpfungen erstellt:

Import-csv DC003.NewConnections.ToRemoteSites.csv – delimiter “;” | newAddConnection.ps1

Import-csv DC003.NewConnections.FromRemoteSites.csv delimiter “;” | newAddConnection.ps1

Das Skript newAddConnection.ps1 legt eine neue Replikationsverknüpfung an. Dabei kann leider kein Cmdlet new-adRepicationConnection verwendet werden, da es auf Windows Server 2012 R2 nicht vorhanden. Stattdessen wird mit new-Adobject –type ntdsConnection die Verknüpfung quasi „händisch“ erstellt:

param (

[Parameter(Mandatory=$true,ValuefromPipelineByPropertyName=$true)]

[String]$toServerName,

[Parameter(Mandatory=$true,ValuefromPipelineByPropertyName=$true)]

[String]$FromServerName

)

Begin {

      $server = (get-AdRootDSE).dnsHostname

      $ConfigurationNamingContext = (get-adRootdse).ConfigurationNamingContext

      $SearchBase = “cn=sites,{0}” -f $ConfigurationNamingContext

}

process {

      $DSAObjecttoServer = $Null

      $DSAObjectfromServer = $NULL

      $testConnection = $Null

# Überprüfen, ob es die Server gibt

      $DSAObjecttoServer  = get-adobject -searchBase $searchbase -searchScope Subtree -ldapfilter “(&(name=$toServername)(objectClass=server))” -server $server -errorAction SilentlyContinue

      if ($DSAObjecttoServer -eq $NULL) {

           throw “Server $toServerName existiert nicht!”

           return $NULL

      }

      $DSAObjectfromServer  = get-adobject -searchBase $searchbase -searchScope Subtree -ldapfilter “(&(name=$fromServername)(objectClass=server))” -server $server -errorAction SilentlyContinue

      if ($DSAObjectfromServer -eq $NULL) {

           throw “Server $toServerName existiert nicht!”

           return $NULL

      }

#

# DistinguishedName der NTDS Settings der beiden Server

#

      $toServerDN   = “CN=NTDS Settings,{0}” -f $dsaObjecttoServer.DistinguishedName

      $fromServerDN = “CN=NTDS Settings,{0}” -f $dsaObjectfromServer.DistinguishedName

#

# Überprüfen, ob es zwischen beiden bereits eine Verknüpfung gibt. Wenn ja, wird diese zurückgegeben

#

      $testConnection = get-adReplicationConnection -filter * -server $server | where {($_.ReplicatetoDirectoryServer -eq $toServerDN) -and ($_.ReplicateFromDirectoryServer -eq $fromServerDN)} | select -first 1

      if ($testConnection -ne $NULL) {

            throw “Eine entsprechende Verbindung gibt es schon!”

            return (get-ADReplicationConnection $testConnection[0].distinguishedName)

      }

#

# Festlegen der Mandatory Attributes in einer Hashtable und den Transportdiest hinzufügen. Verwendet werden die AD-Attributname!

#

      $otherAttributes = @{FromServer=$FromServerDN;Enabledconnection=$True;options=”0″}

      $transportType = “cn=IP,CN=Inter-Site Transports,CN=Sites,{0}” -f $ConfigurationNamingContext

      $otherAttributes += @{transportType=$transportType}

      $NewADConnection = new-adobject -type ntDSConnection -name $FromServerName -OtherAttributes $otherAttributes -Path $toServerDN -Server $Server -passthru

#

# Zeitplan erstellen (4x / Stunden jeden Wochentag)

#

      $schedule = new-object -typeName System.DirectoryServices.ActiveDirectory.ActiveDirectorySchedule

      $days = @(0,1,2,3,4,5,6)

      foreach ($day in $days) {

           $schedule.setSchedule($day,0,0,23,45)

      }

      set-adreplicationConnection $NewAdConnection.DistinguishedName -ReplicationSchedule $schedule -server $server -passthru

} # End Process

end {}

Options=0 gibt an, dass die Replikationsverknüpfung manuell erstellt wurde und nicht vom Intersite-Topology-Generator.

$Connectionenabled=$true aktiviert die Verknüpfung

FromServer, Options und ConnectionEnabled sind mandatory Attribute für Objekte vom Typ ntdsConnection.

$TransportType gibt IP als Transport für die Replikation an.

$fromServerDN, $options, $ConnectionEnabled und $TransportType werden in der Hashtable $otherparameters dem Parameter –otherparameters von new-ADObject übergeben.

Anschließend muss der Zeitplan für die Replikationsverknüpfungen erstellt und der neuen Verknüpfung zugewiesen werden:

$schedule = new-object -typeName System.DirectoryServices.ActiveDirectory.ActiveDirectorySchedule

$days = @(0,1,2,3,4,5,6)

foreach ($day in $days) {

     $schedule.setSchedule($day,0,0,23,45)

}

set-adreplicationConnection $NewAdConnection.DistinguishedName -ReplicationSchedule $schedule –passthru

Dieser Zeitplan entspricht einer viermaligen Replikation pro Stunde an jeden Wochentag.

Für die Speicherung des Zeitplans haben wir set-adReplicationConnection verwendet. Dies erwies sich als einfacher als den Zeitplan direkt in der HashTable $otherAttributes zu übergeben, da dabei die Klasse System.DirectoryServices.ActiveDirectory.ActiveDirectorySchedule nicht verwendet kann.

Für das Löschen der Verknüpfungen, die den DC001 noch verwenden, können wir auf die beiden Dateien DC001.ConnectionstoRemoteSites.csv und DC001.ConnectionsfromRemoteSites.csv zurückgreifen.

Import-csv DC001.ConnectionstoRemoteSites.csv –delimiter “;” | foreach {remove-ADOject $_.distinguishedName –confirm:$false}

Import-csv DC001.ConnectionsFromRemoteSites.csv –delimiter “;” | foreach {remove-ADOject $_.distinguishedName –confirm:$false}

Zu beachten: Über die neu erstellten Replikationsverknüpfungen kann erst nach ca. 15 Minuten repliziert werden. Erst nach einem Test mit Repadmin /showreps sollten die alten Replikationsverknüpfungen gelöscht werden.

Facebook
Twitter
LinkedIn
Pinterest
Email
Nach oben scrollen