Active Directory-Scripting

01.05.2006 von Martin Kuppinger
Der abschließende Teil der Serie beschäftigt sich noch näher mit den Internas des Active Directory. Es geht um die Konfigurationseinstellungen des Active Directory selbst sowie um die Durchführung von Wartungsaufgaben über die Schnittstellen, die von ADSI bereitgestellt werden.

Die meisten Konfigurationsinformationen für den Verzeichnisdienst werden im Active Directory abgelegt. Einige Konfigurationsinformationen für das Active Directory stehen jedoch auch in der Registry.

Der Grundansatz

In den vorangegangenen Teilen der Serie wurde – primär am Beispiel von Benutzer- und Gruppeninformationen – gezeigt, wie man auf definierte Objekte im Active Directory zugreifen und die Attributwerte bearbeiten kann.

Das ist auch die Grundlage für weitere Skripts. Dazu muss man nur wissen, welches Attribut von welchem Objekt modifiziert werden muss. Im Gegensatz zur Bearbeitung von Konten für Benutzer, Gruppen und Computer ist das oftmals sogar noch einfacher, da sich die relevanten Objekte im Container Configuration und immer an einer genau festgelegten Position befinden.

Komplexere Herausforderungen wie die Aufzählung vorhandener organisatorischer Einheiten und das Suchen nach bestimmten Objekten entfallen also.

ADSI Edit kann ein hilfreiches Werkzeug bei der Erstellung solcher Skripts sein. Einer der Konfigurationsparameter, die immer wieder angepasst werden müssen, ist tombstoneLifetime. Er findet sich in

cn=directory service,cn=windows
nt,cn=services,cn=configuration,dc=windowstestnetz,dc
=intra

Die beiden Werte für dc müssen natürlich angepasst werden. Mit Hilfe von ADSI Edit kann man einfach durch die Strukturen des Active Directories navigieren und die anzupassenden Objekte und Attribute ermitteln.

Nun muss nur noch auf das Objekt zugegriffen werden. Dazu kann mit GetObject gearbeitet werden:

Set objConf = GetObject("LDAP:// cn=directory service,
cn=windows
nt,cn=services,cn=configuration,dc=windowstestnetz,dc
=intra ")

Nun muss nur noch der Attributwert angepasst und mit der Methode SetInfo gesetzt werden. Die Vorgehensweise unterscheidet sich in nichts von der Modifikation beispielsweise von Attributen eines Benutzers. Ebenso können so auch einfach die Konfigurationseinstellungen ausgelesen werden. Die Voraussetzung ist natürlich immer, dass man weiß, was wo im Active Directory konfiguriert wird – und das ist in den meisten Fällen die deutlich größere Hürde.

Die Verbindungen des Active Directory

In manchen Fällen werden in diesem Zusammenhang aber etwas komplexere Skripts benötigt. Ein Beispiel dafür findet sich in Listing 1 mit der Ermittlung der Verbindungen im Active Directory für einen ausgewählten Domänencontroller.

Listing 1: Das Ermitteln der Verbindungen im Active Directory
(Quelle: Microsoft)
strDcRDN = "cn=server1"
strSiteRDN = "cn=Stuttgart"
Set objRootDSE = GetObject("LDAP://RootDSE")
strConfigurationNC = objRootDSE.Get("configurationNamingContext")
strNtdsSettingsPath = "LDAP://cn=NTDS Settings," & strDcRDN & ",cn=Servers,"
& strSiteRDN & ",cn=Sites," & strConfigurationNC
Set objNtdsSettings = GetObject(strNtdsSettingsPath)
objNtdsSettings.Filter = Array("nTDSConnection")
WScript.Echo strDcRDN & " NTDS Connection Objects" & vbCrLf &
String(Len(strDcRDN) + 24, "=")
For Each objConnection In objNtdsSettings
WScript.Echo "Name: " & objConnection.Name
WScript.Echo "Enabled: " & objConnection.enabledConnection
WScript.Echo "From: " & Split(objConnection.fromServer, ",")(1)
WScript.Echo "Options: " & objConnection.Options
WScript.Echo "Transport: " & Split(objConnection.transportType, ",")(0)
WScript.Echo "Naming Contexts"
WScript.Echo "---------------"
For Each objDNWithBin In objConnection.GetEx("ms-DS-ReplicatesNCReason")
Wscript.Echo objDNWithBin.DNString
Next
WScript.Echo
Next

In diesem Fall werden zunächst die Namen eines Servers und eines Standorts konfiguriert. Anschließend wird über die Informationen von RootDSE, also der Root der LDAP-Repräsentation der Informationen im Active Directory, der Namenskontext für die Konfigurationsinformationen ermittelt. Das entspricht der Information

cn=configuration, dc=windowstestnetz,
dc=intra

aus dem ersten Beispiel in diesem Artikel. Der Vorteil der im Listing 1 gewählten Vorgehensweise ist die leichtere Nutzung des Skripts in anderen Domänen.

Anschließend wird erst der relativ komplexe Pfad zu dem Objekt erstellt, bevor auf das Objekt selbst zugegriffen wird. Für dieses werden nun nur die Objekte der Klasse nTDSconnection ermittelt. Für die verschiedenen konfigurierten Verbindungsobjekte werden anschließend verschiedene Attribute ausgegeben.

Bild 1: Mit ADSI Edit lässt sich einfach verifizieren, wie genau die anzupassenden Objekte und Attribute heißen.

Das Skript wirkt durch die Ausgabe einer größeren Anzahl von Parametern und durch die relativ komplexe, aber flexible Vorgehensweise für die Konstruktion des Objektnamens deutlich aufwändiger als es tatsächlich ist. Letztlich handelt es sich auch hier nur um eine Aufzählung von Objekten einer definierten Klasse in einem bestimmten Bereich des Active Directory, was sich von der Auflistung von Benutzern oder Gruppen nur graduell unterscheidet.

Das Verschieben eines Domänencontrollers an einen anderen Standort

Ebenfalls nicht sonderlich aufwändig und vor allem für größere Netzwerke interessant ist das nachfolgende Skript, mit dem sich ein Domänencontroller an einen anderen Standort verschieben lässt:

strSourceSiteRDN = "cn=Standardname-des-ersten-Standorts"
strTargetSiteRDN = "cn=Stuttgart"
strDcRDN = "cn=server1"
Set objRootDSE = GetObject("LDAP://RootDSE")
strConfigurationNC = objRootDSE.Get("configurationNamingContext")
strDcPath = "LDAP://" & strDcRDN & ",cn=Servers," &
strSourceSiteRDN & ",cn=Sites," & strConfigurationNC
strTargetSitePath = "LDAP://cn=Servers," & strTarget-
SiteRDN & ",cn=Sites," & strConfigurationNC
Set objTargetSite = GetObject(strTargetSitePath)
objTargetSite.MoveHere strDcPath, strDcRDN

In diesem Fall wird es genutzt, um den standardmäßigen Standortnamen anzupassen. Das sollte auch bei Umgebungen gemacht werden, in denen nur mit einem Standort gearbeitet wird. Die Werte für den bisherigen und zukünftigen Standortnamen werden ebenso vorab definiert wie der Servername.

Anschließend wird auf den Konfigurationscontainer zugegriffen. In diesem werden die entsprechenden Festlegungen angepasst und neu konfiguriert.

Man könnte hier natürlich auch zunächst die Liste der Domänencontroller aus dem Standardordner Domain Controllers im Active Directory ermitteln und anschließend die Änderungen der Standortnamen in einer Schleife für die in einem Array gespeicherten Domänencontrollernamen durchführen.

In diesem Zusammenhang ist auch das nachfolgende Skript interessant:

strDcName = "server1"
strSiteName = "Stuttgart"
Set objADSysInfo = CreateObject("ADSystemInfo")
strDcSiteName = objADSysInfo.GetDCSiteName(strDcName)
If UCase(strSiteName) = UCase(strDcSiteName) Then
WScript.Echo "TRUE: " & strDcName & " is in site
" & strSiteName
Else
WScript.Echo "FALSE: " & strDcName & " is NOT in
site " & strSiteName
End If

Mit diesem Skript lässt sich prüfen, ob sich ein Domänencontroller an einem bestimmten Standort befindet. Das Skript könnte verwendet werden, um bei einem Skript zum Anpassen der Standortnamen zunächst zu prüfen, ob eine Anpassung überhaupt erforderlich ist. Damit der Vergleich korrekt arbeitet, ist zu beachten, dass die Namen in die Großschreibung umgesetzt werden müssen.

WMI statt ADSI

Neben ADSI kann übrigens auch WMI für etliche Aufgabenstellungen genutzt werden. So lassen sich Vertrauensstellungen verwalten und Informationen zu den Replikationspartnern im Active Directory ermitteln.

Serienfortsetzung

Der zweite Teil der Serie „Das Web-SSO-Szenario“ folgt in Ausgabe 6/2006 von Expert’s inside Windows NT/2000.