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.
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.