Printout Header
RSS Feed

Verbinden mit Objekten im Globalen Katalog


In Tutorial Abschnitt "LDAP Bind: Verbindung mit dem Verzeichnis herstellen" wurde beschrieben, wie man allgemein aus einem Script heraus Verbindung mit einem Verziechnisobjekt herstellt. Hier soll speziell gezeigt werden, wie man auf Objekte im Globalen Katalog zugreift. Bitte beachten: Im Globalen Katalog sind nur Lesezugriffe möglich, und es sind stehen nicht alle Attribute zur Verfügung.

 

Global Catalog Bind mit der User-ID, mit der auch das Skript ausgeführt wird
Global Catalog Bind unter Angabe von speziellen Anmeldedaten
Global Catalog Bind über LDAP SSL
Global Catalog Bind, wenn der eigene Domänenname / Forest nicht bekannt ist



Global Catalog Bind mit der User-ID, mit der auch das Skript ausgeführt wird


Es handelt sich hier um einen Standard Bind-Vorgang, bei dem jedoch der LDAP-Pfadnamen so verändert wird, dass die TCP-Port-Nummer 3268 verwendet wird. Dies funktioniert sowohl über die Funktion GetObject als auch mit OpenDSObject.

Set obj = GetObject("LDAP://server.cerrotorre.de:3268/cn=Philipp,ou=Benutzer,dc=cerrotorre,dc=de") WScript.Echo obj.name Set ou = GetObject("LDAP://server.cerrotorre.de:3268/ou=Benutzer,dc=cerrotorre,dc=de") For Each obj In ou WScript.Echo obj.name Next

Voraussetzung ist hierbei natürlich, dass der angesprochene Server 'server.cerrotorre.de' auch als globaler Katalog konfiguriert wurde.

Eine einfachere Variante, die eine Sonderform des Pfadnamens ausnutzt, wobei der Ausdruck "LDAP" durch "GC" ersetzt wird. Dann braucht auch die spezielle Port-Nummer 3268 nicht angegeben zu werden:

Set ou = GetObject("GC://server.cerrotorre.de/ou=Benutzer,dc=firma,dc=de") For Each obj In ou WScript.Echo obj.name Next

Auch hierbei können Sie in Active Directory Umgebungen ein Serverless Binding durchführen, dann wird ein globaler Katalog automatisch über DNS gesucht:

Set ou = GetObject("GC://ou=Benutzer,dc=cerrotorre,dc=de") For Each obj In ou WScript.Echo obj.name Next

Global Catalog Bind unter Angabe von speziellen Anmeldedaten


Die normale Methode des Verzeichnis-Binds funktioniert immer dann, wenn ich als angemeldeter User auf Objekte aus meiner eigenen Domäne bzw. aus meinem eigenen Active Directory Forest zugreifen will. Oft ist es jedoch notwendig, auf ein Verzeichnis-System zuzugreifen, bei dem man aktuell nicht als User authentifiziert ist. Hier gibt es die Bind-Variante mit dem Befehl OpenDSObject, der die Übergabe von Username und Passwort erlaubt und so eine Anmeldung z.B. auch an fremde Forests ermöglicht.

Set dso = GetObject("LDAP:") Set ou = dso.OpenDSObject("LDAP://controller.cerrotorre.de:3268/ou=test,dc=cerrotorre,dc=de", "administrator", "P@ssw0rd", 1) For Each obj In ou WScript.Echo obj.name Next 'andere Variante: Set dso = GetObject("LDAP:") Set ou = dso.OpenDSObject("GC://controller.cerrotorre.de/ou=test,dc=cerrotorre,dc=de", "administrator", "P@ssw0rd", 1) For Each obj In ou WScript.Echo obj.name Next 'Serverless Binding Set dso = GetObject("LDAP:") Set ou = dso.OpenDSObject("GC://ou=test,dc=cerrotorre,dc=de", "administrator", "P@ssw0rd", 1) For Each obj In ou WScript.Echo obj.name Next

In unseren Beispielen wird also das OU-Objekt in der Domäne "cerrotorre.de zugegriffen, wobei zu diesem Zweck am Server "controller.cerrotorre.de" eine Anmeldung mit Username "administrator" und Passwort "P@ssw0rd" stattfindet. Der letze Parameter (1) führt als Anmelde-Flag dazu, dass eine gesicherte Kerberos-Anmeldung stattfindet.


ADSI-Referenz im MSDN: OpenDSObject()

Der Benutzername kann bei einer AD-Anmeldung in folgender Form angegeben werden:


Anmedename ohne Zusätze z.B. "administrator", hierzu muss das Anmelde-Flag jedoch auf 1 gesetzt werden (gesicherte Anmeldung)
NetBIOS-Anmeldename z.B. "DOMAIN\administrator"
User Principal Name z.B. "administrator@domain.com"
Distinguished Name z.B. "cn=administrator,cn=users,dc=domain,dc=com", hierzu muss das Anmelde-Flag jedoch auf 0 (Klartext-Anmeldung) stehen.

Das Anmelde-Flag bestimmt die Art der Anmeldung. Prinzipiell interessant sind die beiden Werte 0 (für unverschlüsselte Anmeldung im Klartext) und 1 (für gesicherte Anmeldung über Kerberos oder NTLM). Eine gesicherte Anmeldung ist der Klartextanmeldung natürlich vorzuziehen. Allerdings kann es auch Situationen geben, wo eine ungesicherte Klartext-Anmeldung benötigt wird, z.B. für SSL-Verbindungen (hier sind alle Daten sowieso durch den SSL-Tunnel geschützt).


Microsoft-Erläuterungen zum Anmelde-Flag im MSDN


Man kann in Active Directory Umgebungen im LDAP-Pfadnamen den Servernamen weglassen, dann wird automatisch an einen erreichbaren Domänen-Controller der eigenen Domäne gefunden.

 


Global Catalog Bind über LDAP SSL


Man kann auch LDAP-SSL verwenden, wenn man sich mit dem Globalen Katalog verbindet. Dazu baut man die Verbindung einfach mit der TCP-Port-Nummer 3269 (statt 3268) auf. Allerdings klappt das nur, wenn der Server zuvor mit einem SSL-Zertifikat ausgestattet wurde.

Set obj = GetObject("LDAP://server.cerrotorre.de:3269/cn=Philipp,ou=Benutzer,dc=cerrotorre,dc=de") WScript.Echo obj.name Set ou = GetObject("LDAP://server.cerrotorre.de:3269/ou=Benutzer,dc=cerrotorre,dc=de") For Each obj In ou WScript.Echo obj.name Next

Global Ctalog Bind, wenn der eigene Domänenname / Forest nicht bekannt ist


Oft will man Skripte entwickeln, die in verschiedenen Active Directory Umgebungen laufen. Stellen Sie sich z.B. ein Skript vor, dass in der eigenen Domäne irgendwelche Infos zu diversen Objekten ausgibt oder spezielle Änderungen vornimmt. Damit das Skript in beliebigen Domänen läuft, könnte man natürlich den Domänen-Namen als Parameter übergeben lassen. Aber noch eleganter ist es, den Domänen-Namen zu ermiteln, indem man mit einem Serverless Binding das Active Directory selbst danach fragt.

Die entsprechenden Informationen stehen in einem speziellen Verzeichnis-Eintrag, der auf jedem Domänen-Controller zur Verfügung steht: dem rootDSE-Eintrag (Root Directory Service Entry).

Wir können hier aus der Eigenschaft "defaultNamingContext" den Distinguished Name der eigenen Domäne entnehmen und daraus gleich einen LDAP-Pfadnamen bauen, mit dem auf die gewünschten Domänen-Objekte zugegriffen werden kann - auch im Global Katalog:

Set rootDSE = GetObject("LDAP://rootDSE") domainDN = rootDSE.Get("defaultNamingContext") set domain = GetObject("GC://" & domainDN) For Each obj In domain WScript.Echo obj.name Next

Im nächsten Beispiel wird gezeigt, wie man den Namen der Root-Domäne des eigenen Forests herausfindet. Man kann dazu die ADSSystemInfo-Schnittstelle verwenden und muß dann den erhaltenen DNS-Namen in einen LDAP-Pfad umwandeln:

Set aoi = CreateObject("ADSystemInfo") rootDNS = aoi.ForestDNSName rootDN = "DC=" & Replace(rootDNS, ".", ",DC=") set domain = GetObject("GC://" & rootDN) For Each obj In domain WScript.Echo obj.name Next