Microsoft Windows 2000 - Scripting-Handbuch (Teil 1) Scripting-Konzepte und -Technologien zur Systemadministration: Kapitel 5 - ADSI-Scripting

(Engl. Originaltitel: ADSI Scripting Primer)

Die Administration eines Verzeichnisdienstes besteht oft aus vielen sich wiederholenden Aufgabe

n, zum Beispiel dem Erstellen, Löschen und Ändern von Benutzern, Gruppen, OUs, Computern und anderen Verzeichniselementen. Scripte sind geradezu prädestiniert, um solche Aufgaben durchzuführen.

Bei Active Directory Service Interfaces (ADSI) handelt es sich um eine Technologie, die die Script-basierte Verwaltung des Verzeichnisdiensts Active Directory ermöglicht. ADSI-fähige Scripte können eine große Menge an administrativen Aufgaben durchführen.

Zurück zur Übersichtsseite

Auf dieser Seite

Links zu verwandten Themen


Dn151181.ACDCF196BC98A92A7E35715F19C8C405(de-de,TechNet.10).png ADSI-Überblick

Dn151181.ACDCF196BC98A92A7E35715F19C8C405(de-de,TechNet.10).png ADSI-Scripting-Grundlagen

Dn151181.ACDCF196BC98A92A7E35715F19C8C405(de-de,TechNet.10).png Fortgeschrittene ADSI-Scripting-Techniken

Dn151181.ACDCF196BC98A92A7E35715F19C8C405(de-de,TechNet.10).png Die Active Directory-Architektur

Dn151181.ACDCF196BC98A92A7E35715F19C8C405(de-de,TechNet.10).png Die ADSI-Architektur

Download

Artikel im Word-Format

Dn151181.8806D110EB18CD71B1CE323B89624167(de-de,TechNet.10).png sas_ads_overview.doc

Microsoft Word-Datei

Viewer für Office-Dateien downloaden

Artikel im PDF-Format

Dn151181.8B3D04996314173E7583D7C6B55A6BAC(de-de,TechNet.10).png sas_ads_overview.pdf

PDF-Datei

Adobe Acrobat Reader downloaden

Die Administration eines Verzeichnisdienstes besteht oft aus vielen sich wiederholenden Aufgaben, zum Beispiel dem Erstellen, Löschen und Ändern von Benutzern, Gruppen, OUs, Computern und anderen Verzeichniselementen. Scripte sind geradezu prädestiniert, um solche Aufgaben durchzuführen.

Bei Active Directory Service Interfaces (ADSI) handelt es sich um eine Technologie, die die Script-basierte Verwaltung des Verzeichnisdiensts Active Directory ermöglicht. ADSI-fähige Scripte können eine große Menge an administrativen Aufgaben durchführen.

ADSI-Überblick

Die Administration von Verzeichnisdiensten über Scripte ist nicht wirklich schwer. Von den ganzen hierfür erforderlichen Scripting-Fähigkeiten ist ADSI sogar die am einfachsten zu erlernende.

Ein einführendes Beispiel

Stellen Sie sich das folgende Szenario vor: Es ist Freitagmorgen und Sie planen gerade Ihr Wochenende - außerdem haben Sie in der nächsten Woche Urlaub. Sie erhalten eine dringende E-Mail von Ihrem Chef, der Ihnen mitteilt, dass eine Gruppe Consultants Montagmorgen einen Anwendungstest durchführen will. Bei diesem Test soll an der Anwendung jeweils eine Testanmeldung mit 1.000 verschiedenen AD-Benutzerkonten durchgeführt werden.

Ihre Aufgabe soll es nun sein, eine Active Directory-Domäne mit 1.000 Benutzerkonten einzurichten. Die Einrichtung der Domäne ist einfach - aber was ist mit den 1.000 Benutzerkonten? Wenn Sie die alle per Hand anlegen, dann haben Sie bis Montagmorgen zu tun. Eine solche Aufgabe können Sie jedoch hervorragend über ein Script erledigen. Script 5.1 legt 1.000 Benutzerkonten an (mit den Namen UserNo1 - UserNo1000).

Script 5.1: Erstellen von 1.000 Active Directory-Benutzerkonten



1

2

3

4

5

6

7

8

9

10

Set objRootDSE = GetObject("LDAP://rootDSE")

Set objContainer = GetObject("LDAP://cn=Users," & _

objRootDSE.Get("defaultNamingContext"))


For i = 1 To 1000

Set objLeaf = objContainer.Create("User", "cn=UserNo" & i)

objLeaf.Put "sAMAccountName", "UserNo" & i

objLeaf.SetInfo

Next

Wscript.Echo "1000 Users created."

Warnung


Führen Sie Script 5.1 nicht in einer Produktionsumgebung aus. Sie legen sonst 1.000 Benutzerkonten in dieser Domäne an.

Auf langsamen Domänencontrollern kann das Script bis zu fünf Minuten für seine Ausführung benötigen.

Verwaltung des Verzeichnisdienstes

Script 5.1 ist zwar sehr nützlich, erledigt jedoch nur eine einzelne Aufgabe - es erstellt Benutzerkonten. Die normale Verwaltung von Active Directory umfasste jedoch sehr viel mehr. Diese Aufgaben lassen sich in vier grundlegende Kategorien unterteilen:

  1. Erstellen - Zum Beispiel das Erstellen von Benutzerkonten, Gruppen, OUs, Computerkonten, Standorten, Subnetzen, veröffentlichten Druckern und Freigaben.
  2. Ändern - Zum Beispiel das Konfigurieren einer Telefonnummer für ein Benutzerkonto, die Delegierung der Kontrolle über eine OU, das Löschen von Gruppenmitgliedern oder die Deaktivierung von Computerkonten.
  3. Lesen - Zum Beispiel das Auslesen von Benutzernamen, Gruppenmitgliedern.
  4. Löschen - Zum Beispiel das Löschen von Benutzerkonten, Gruppen und OUs.

Was ADSI wirklich praktisch macht, ist die effiziente Verwaltung von Active Directory über den konsistenten Ansatz von ADSI - mit diesem Ansatz werden die unterschiedlichsten Objekte auf die gleiche Art und Weise verwaltet. So funktioniert zum Beispiel die Erstellung von Benutzern, OUs und Gruppen fast gleich.

Das gleiche gilt für die Bearbeitung und für das Auslesen von Active Directory-Objekten. Sie können alle Objekte über die gleichen grundlegenden Schritte auslesen.

Dn151181.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).png Zum Seitenanfang

ADSI-Scripting-Grundlagen

Wir werden uns Scriptbeispiele für die oben definierten grundlegenden Kategorien anschauen - Erstellen, Ändern, Lesen und Löschen. So werden Sie ein besseres Verständnis für ADSI-Scripting entwickeln.

Primäre ADSI-Scripting-Kategorien

Erstellen von Active Directory-Objekten

Script 5.1 hat Ihnen gezeigt, wie Sie 1.000 Benutzerkonten erstellen können. Im folgenden Abschnitt wird - etwas bescheidener - jeweils eine OU, ein Benutzerkonto und eine Gruppe erstellt.

Die Erstellung von Active Directory-Objekten umfasste vier grundlegende Schritte:

  1. Eine Verbindung mit dem Active Directory-Container aufbauen, der das neue Objekt aufnehmen soll.
  2. Das Objekt erstellen.
  3. Die verpflichtenden Attribute des Objektes konfigurieren (wenn erforderlich).
  4. Das neue Objekt an Active Directory übermitteln.

Das Ziel der drei Scripte dieses Abschnitts ist es, eine OU mit dem Namen HR und in der OU ein Benutzerkonto mit dem Namen MyerKen und eine Gruppe mit dem Namen Atl-Users zu erstellen.

Erstellen einer OU

Script 5.2 erstellt eine OU mit dem Namen HR in der Domäne na.fabrikam.com. Allen verpflichtenden Attributen einer OU werden von Active Directory automatisch Werte zugewiesen. Daher ist dieser Schritt in Script 5.2 nicht erforderlich.

Um die OU zu erstellen, führt das Script die folgenden Schritte aus:

  1. Es baut eine Verbindung mit dem Domänen-Container na.fabrikam.com auf.
  2. Es erstellt eine OU mit dem Namen HR.
  3. Es übermittelt die neue OU an Active Directory.

Script 5.2: Erstellen einer OU



1

2

3

Set objDomain = GetObject("LDAP://dc=NA,dc=fabrikam,dc=com")

Set objOU = objDomain.Create("organizationalUnit", "ou=HR")

objOU.SetInfo

Erstellen eines Benutzerkontos

Script 5.3 erstellt ein neues Benutzerkonto mit dem Namen MyerKen in der OU HR. Die OU HR befindet sich in der Domäne na.fabrkam.com. Das Script führt die folgenden Schritte durch:

  1. Es baut eine Verbindung mit dem Container der OU HR in der Domäne na.fabrikam.com auf.
  2. Es erstellt ein Benutzerkonto mit den Namen MyerKen.
    Es ist nicht notwendig den ersten Buchstaben von Vor- und Nachnamen groß zu schreiben - da die Groß- und Kleinschreibung jedoch in Active Directory erhalten bleibt, fällt es den Benutzern so möglicherweise einfacher, den Vor- und Nachnamen zu unterscheiden.
  3. Es setzt das verpflichtende Attribut sAMAccountName auf den Wert myerken.
  4. Es übermittelt das neue Benutzerkonto an Active Directory.

Script 5.3: Erstellen eines Benutzerkontos



1

2

3

4

Set objOU = GetObject("LDAP://ou=HR,dc=NA,dc=fabrikam,dc=com")

Set objUser = objOU.Create("user", "cn=MyerKen")

objUser.Put "sAMAccountName", "myerken"

objUser.SetInfo

Erstellen einer Gruppe

Script 5.4 erstellt eine globale Gruppe mit den Namen Atl-Users in der OU HR in der Domäne na.fabrikam.com. Hierzu geht das Script folgendermaßen vor:

  1. Es baut eine Verbindung mit dem Container der OU HR in der Domäne na.fabrikam.com auf.
  2. Es erstellt eine Gruppe mit den Namen Atl-Users (standardmäßig wird eine globale Gruppe erstellt).
  3. Es setzt das einzige verpflichtende Attribut sAMAccountName auf den Wert Atl-Users.
  4. Es übermittelt die neue Gruppe an Active Directory.

Script 5.4: Erstellen einer Gruppe



1

2

3

4

Set objOU = GetObject("LDAP://ou=HR,dc=NA,dc=fabrikam,dc=com")

Set objGroup = objOU.Create("group", "cn=Atl-Users")

objGroup.Put "sAMAccountName", "Atl-Users"

objGroup.SetInfo

Aus den Scripten dieses Abschnitts können wir folgende Erkenntnisse gewinnen:

  • Sie führen alle die gleichen grundlegenden Schritte durch (verbinden mit einem Active Directory-Container, Objekt erstellen, verpflichtende Attribute setzen und Objekt an Active Directory übermitteln).
  • Sie verwenden alle dieselbe Methode (Create), egal was für ein Objekt erstellt wird.
  • Die einzigen Teile, die sich bei den Scripten unterscheiden, sind die von den Methoden verwendeten Parameter. Hierzu gehört zum Beispiel der Klassenname (organizationalUnit, user und group), der angibt was für ein Objekt erstellt werden soll. Auch die zu setzenden Attribute unterscheiden sich.

Die Schritte beim Erstellen einer OU (Script 5.2), eines Benutzerkontos (Script 5.3) und einer Gruppe (Script 5.4) sind exakt gleich. Dies gilt auch für alle übrigen Objekttypen.

Um ein Objekt zu erstellen, verbindet sich das Script als erstes mit einem Container - dieser Prozess wird auch Bindung genannt. Script 5.2 verbindet sich mit der Domäne, um eine OU zu erstellen. Die Domäne können Sie sich hier als normalen Container vorstellen. Script 5.3 und Script 5.4 verbinden sich beide mit der OU.

Nach der Bindung an einen Container erstellt das jeweilige Script ein Objekt. Hierzu müssen zwei Parameter angegeben werden: der Klassenname des Objekts und der Name des eigentlichen Objekts. Script 5.2 erstellt eine OU. Es gibt hierzu die Klasse organizationalUnit und den Objektnamen ou=HR an. Script 5.3 erstellt ein Benutzerkonto: Die Klasse heißt user, und der Name des neuen Objekts ist cn=MyerKen. Script 5.4 erstellt eine Gruppe. Die Klasse heißt hier group, und der Objektname lautet cn=Atl-Users. Der Vorgang findet jeweils in Zeile 3 der Scripte statt. Weitere Informationen dazu wie Sie die Objektklasse eines Objekts abfragen, finden Sie im Abschnitt ADSI Schnittstellen dieses Kapitels.

Bevor ein Objekt an Active Directory übermittelt wird, müssen Sie die verpflichtenden Attribute für die Objekte setzen. Für eine OU gibt es keine verpflichtenden Attribute. Daher wird dieser Schritt in Script 5.2 nicht durchgeführt. In Zeile 4 von Script 5.3 und Script 5.4 werden jedoch verpflichtende Attribute gesetzt (sAMAccountName wird sowohl bei einem Benutzerkonto als auch bei einer Gruppe verwendet). Weitere Informationen dazu, wie Sie feststellen, welche verpflichtenden Attribute ein bestimmtes Objekt benötigt, erhalten Sie im Abschnitt Die Active Directory-Architektur in diesem Kapitel.

Der letzte Schritt in der Erstellung eines Objekts ist die Übertragung (Speicherung) in Active Directory. Dieser Schritt wird jeweils in der letzten Zeile der Scripte durchgeführt.

Bearbeiten von Active Directory-Objekten

Das Bearbeiten von Attributen von Active Directory-Objekten ist gleichbedeutend mit dem Ersetzen von Attributen. Beim Bearbeiten wird der vorhandene Attributwert gelöscht und der neue Attributwert geschrieben.

Die Art einer Änderung hängt normalerweise vom Objekttyp und von dessen Attributen ab - zum Beispiel, ob ein Attribut einen einzelnen Wert oder mehrere Werte speichert. Die folgenden Beschreibungen ändern jedoch zur Vereinfachung nur Attribute mit einem einzelnen Wert.

Die Änderung eines Attributs eines Active Directory-Objekts besteht aus drei grundlegenden Schritten:

  1. Eine Verbindung zu dem Active Directory-Objekt aufbauen, das geändert werden soll.
  2. Ein oder mehrere Attribute des Objektes ändern.
  3. Die Änderungen an Active Directory übertragen.

Die drei Scripte in diesem Kapitel ändern die Attribute der drei Objekte, die weiter oben in diesem Kapitel erstellt wurden (die OU HR, der Benutzer MyerKen und die globale Gruppe Atl-Users). Da alle drei Objekte über ein Attribut description (Beschreibung) verfügen, wird dieses Attribut verändert.

Ein Attribut einer OU ändern

Script 5.5 ändert das Attribut description der OU HR in der Domäne na.fabrikam.com. Dem Attribut wird der Wert Human Resources zugewiesen. Hierbei geht das Script folgendermaßen vor:

  1. Es verbindet sich mit der Objekt der OU HR in der Domäne na.fabrikam.com. Im Gegensatz zum Erstellen wird die OU hier als Objekt statt als Container bezeichnet - die liegt daran, dass bei diesem Vorgang ein Attribut eines Objekts geändert wird.
  2. Es ändert das Attribut des Objekts, indem es ihm den Wert Human Resources zuweist.
  3. Es überträgt die Änderung an der OU an Active Directory.

Script 5.5: Das Attribut description einer OU ändern



1

2

3

Set objOU = GetObject("LDAP://ou=HR,dc=NA,dc=fabrikam,dc=com")

objOU.Put "description", "Human Resources"

objOU.SetInfo

Ein Attribut eines Benutzerkontos ändern

Script 5.6 ändert das Attribut description des Benutzerkontos mit dem Namen MyerKen in der OU HR der Domäne na.fabrikam.com. Dem Attribut wird der Wert HR employee zugewiesen. Hierzu geht das Script folgendermaßen vor:

  1. Es verbindet sich mit dem Benutzerobjekt MyerKen in der OU HR der Domäne na.fabrikam.com.
  2. Es ändert das Attribut des Objekts, indem es ihm den Wert HR employee zuweist.
  3. Es überträgt die Änderungen am Benutzerkonto an Active Directory.

Script 5.6: Das Attribut description eines Benutzerkontos ändern



1

2

3

4

Set objUser = _

GetObject("LDAP://cn=MyerKen,ou=HR,dc=NA,dc=fabrikam,dc=com")

objUser.Put "description", "HR employee"

objUser.SetInfo

Ein Attribut eines Benutzerkontos ändern

Script 5.7 ändert das Attribut description der Gruppe mit dem Namen Atl-Users in der OU HR der Domäne na.fabrikam.com. Dem Attribut wird der Wert Atlanta users zugewiesen. Hierzu führt das Script die folgenden Aufgaben durch:

  1. Es verbindet sich mit dem Gruppenobjekt Atl-Users in der OU HR der Domäne na.fabrikam.com.
  2. Es ändert das Attribut des Objekts, indem es ihm den Wert Atlanta users zuweist.
  3. Es überträgt die Änderungen an der Gruppe an Active Directory.

Script 5.7: Das Attribut description einer Gruppe ändern



1

2

3

4

Set objOU = GetObject _

("LDAP://cn=Atl-Users,ou=HR,dc=NA,dc=fabrikam,dc=com")

objOU.Put "description", "Atlanta users"

objOU.SetInfo

Zusammenfassend kann man über die Scripte in diesem Abschnitt Folgendes sagen:

  • Sie führen alle die gleichen grundlegenden Schritte aus: Verbinden mit dem Active Directory-Objekt, Ändern des Attributes und die Änderung an Active Directory übertragen.
  • Sie verwenden alle die gleiche Methode (Put), egal, welche Objektklasse geändert wird.

Attribute eines Active Directory-Objekts lesen

In den vorhergehenden Abschnitt wird die Erstellung einer OU, eines Benutzerkontos und einer Gruppe beschrieben. Außerdem wurde das Attribut description der Objekte konfiguriert. Als Nächstes lernen Sie, wie die Attribute der Objekte ausgelesen werden.

Das Lesen von Attributen von Active Directory-Objekten wird über zwei einfache Schritte durchgeführt:

  1. Eine Verbindung mit dem Active Directory-Objekt aufbauen, das gelesen werden soll.
  2. Ein oder mehrere Attribute des Objekts lesen.

Das Ziel der drei Scripte in diesem Abschnitt ist es, das Attribut description der OU HR, des Benutzerkontos MyerKen und der Gruppe Atl-Users zu lesen und deren Werte anzuzeigen.

Wichtig


Die nach den Scripten gezeigten Ausgaben werden von CScript erstellt. Wenn Sie die Scripte ausführen, sollten Sie daher sicherstellen, dass diese unter CScript ausgeführt werden. Einige der folgenden Scripte erzeugen eine größere Menge an Ausgaben. Wenn Sie diese Scripte unter WScript ausführen, werden sie eine große Menge an Nachrichtenfenstern erzeugen.

Ein Attribut einer OU auslesen

Script 5.8 liest das Attribut description der OU HR in der Domäne na.fabrikam.com und zeigt dieses an. Hierzu geht das Script folgendermaßen vor:

  1. Es verbindet sich mit dem OU-Objekt HR in der Domäne na.fabrikam.com.
  2. Es liest das Attribut description des Objekts.

Script 5.8: Lesen des Attributs description einer OU



1

2

Set objOU = GetObject("LDAP://ou=HR,dc=NA,dc=fabrikam,dc=com")

Wscript.Echo objOU.Get("description")

Ein Attribut eines Benutzerkontos auslesen

Script 5.9 liest das Attribut description des Benutzerobjekts MyerKen in der OU HR in der Domäne na.fabrikam.com und zeigt dieses an. Hierzu geht das Script folgendermaßen vor:

  1. Es verbindet sich mit dem Benutzerobjekt MeyerKen in der OU HR in der Domäne na.fabrikam.com.
  2. Es liest das Attribut description des Objekts.

Script 5.9: Lesen des Attributs description eines Benutzerkontos



1

2

3

Set objUser = _

GetObject("LDAP://cn=MyerKen,ou=HR,dc=NA,dc=fabrikam,dc=com")

Wscript.Echo objUser.Get("description")

Wenn Sie das Script in der Domäne na.fabrikam.com ausführen, erhalten Sie die folgende Ausgabe:

HR employee

Reading an Attribute of a Group

Script 5.10 liest das Attribut description des Gruppenobjekts Atl-Users in der OU HR in der Domäne na.fabrikam.com und zeigt dieses an. Hierzu geht das Script folgendermaßen vor:

  1. Es verbindet sich mit dem Gruppenobjekt Atl-Users in der OU HR in der Domäne na.fabrikam.com.
  2. Es liest das Attribut description des Objekts.

Script 5.10: Lesen des Attributs description einer Gruppe



1

2

3

Set objGroup = _

GetObject("LDAP://cn=Atl-Users,ou=HR,dc=NA,dc=fabrikam,dc=com")

Wscript.Echo objGroup.Get("description")

Wenn Sie das Script in der Domäne na.fabrikam.com ausführen, erhalten Sie die folgende Ausgabe:

Atlanta users

Aus den Scripten in diesem Abschnitt lassen sich die folgenden wichtigen Erkenntnisse gewinnen:

  • Sie führen alle die gleichen grundlegenden Schritte aus: eine Verbindung mit dem Active Directory-Objekt aufbauen und ein Attribut des Objekts lesen.
  • Sie verwenden alle die gleiche Methode (Get) - egal welche Klasse das zu lesende Objekt hat.

Wie Sie in diesem Abschnitt gesehen haben, funktioniert das Lesen von Attributen bei allen Objekten gleich.

Löschen von Active Directory-Objekten

Die letzte Aktion im Leben eines Objekts ist normalerweise das Löschen. Alle bisherigen Scriptbeispiele haben erst die OU erstellt, dann den Benutzer und dann die Gruppe. Die folgenden Scripte gehen nun anders herum vor. Erst wird die Gruppe gelöscht, dann der Benutzer und erst dann die OU. Das liegt daran, dass Sie mit der Methode Delete keine OUs löschen können, ohne erst die Objekte in der OU zu löschen (dies Objekte werden auch als Endknotenobjekt bezeichnet).

Wenn Sie versuchen eine OU zu löschen, in der sich noch Endknotenobjekte (untergeordnete Objekte) befinden, erhalten Sie die folgende Fehlermeldung:

C:\DeleteOu.vbs(2, 1) (null): Der Verzeichnisdienst kann den angeforderten Vorgang 
nur an einem Endknotenobjekt durchführen.

Die Fehlermeldung ist etwas verwirrend. Warum kann der Vorgang nur für ein Endknotenobjekt durchgeführt werden? Wenn Objekte in er OU vorhanden sind, dann ist die OU ein Containerobjekt. Sind jedoch keine Objekte mehr in der OU, dann ist die OU aus der Perspektive des Scripts kein Container mehr, sondern ein Endknotenobjekt (ein Objekt, das keine weiteren Objekte enthält). Nun ist die Fehlermeldung klarer.

Da in den folgenden Beispielen erst Benutzer und Gruppen entfernt werden, tritt der Fehler hier nicht auf.

Das Löschen von Active Directory-Objekten wird über zwei Schritte durchgeführt:

  1. Eine Verbindung mit dem Active Directory-Container aufbauen, in dem das Objekt gespeichert ist.
  2. Das Objekt löschen.

Eine Gruppe löschen

Script 5.11 löscht die Gruppe Atl-Users aus der OU HR in der Domäne na.fabrikam.com.

  1. Es baut eine Verbindung mit dem OU-Container HR in der Domäne na.fabrikam.com auf.
    In diesem Fall wird die OU als Container statt als Objekt behandelt - es soll ja ein Objekt in einem Container gelöscht werden.
  2. Es löscht die Gruppe Atl-Users aus der OU.

Script 5.11: Löschen einer Gruppe



1

2

Set objOU = GetObject("LDAP://ou=HR,dc=NA,dc=fabrikam,dc=com")

objOU.Delete "group", "cn=Atl-Users"

Ein Benutzerkonto löschen

Script 5.12 löscht den Benutzer MyerKen aus der OU HR in der Domäne na.fabrikam.com.

  1. Es baut eine Verbindung mit dem OU-Container HR in der Domäne na.fabrikam.com auf.
  2. Es löscht den Benutzer MyerKen aus der OU.

Script 5.12: Löschen eines Benutzers



1

2

Set objOU = GetObject("LDAP://ou=HR,dc=NA,dc=fabrikam,dc=com")

objOU.Delete "user", "cn=MyerKen"

Löschen einer OU

Script 5.12 löscht die OU HR in der Domäne na.fabrikam.com.

  1. Es baut eine Verbindung mit dem OU-Objekt HR in der Domäne na.fabrikam.com auf.
    Es löscht die OU.

Script 5.13: Löschen einer OU



1

2

Set objDomain = GetObject("LDAP://dc=NA,dc=fabrikam,dc=com")

objDomain.Delete "organizationalUnit", "ou=HR"

Die folgenden wichtigen Erkenntnisse können wir aus den Scripten dieses Abschnitts gewinnen:

  • Sie führen alle die gleichen grundlegenden Schritte aus: eine Verbindung mit dem Active Directory-Container aufbauen und ein Objekt löschen.
  • Sie verwenden alle die gleiche Methode (Delete) - egal, welche Klasse das zu löschende Objekt hat.

Vergleich der primären Aufgaben eines ADSI-Scripts

Sie haben inzwischen die vier primären Aufgabenkategorien der Active Directory-Administration kennen gelernt (Erstellen, Lesen, Ändern und Löschen). Die Beispielscripte haben Ihnen gezeigt, wie konsistent die Durchführung dieser Aufgaben in ADSI-Scripten ist. In Abbildung 5.1 sehen Sie noch einmal eine Zusammenfassung der Kategorien und der erforderlichen Schritte.

Dn151181.F0F847414AA4D92DDA0DE86FDBDC93A1(de-de,TechNet.10).png

Abbildung 5.1: Schritte zur Durchführung von grundlegenden Aufgaben über ADSI

Mit Abbildung 5.1 und den zwölf gezeigten Scripten können wir nun die folgenden Regeln im Bezug auf ADSI-Scripte definieren:

  • Unabhängig von der auszuführenden Aufgabe ist Schritt Eins immer die Verbindung (das Binden) mit einem Objekt oder Container.
  • Mit der Methode Create wird ein Active Directory-Objekt erstellt.
  • Mit der Methode Delete wird ein Active Directory-Objekt gelöscht.
  • Mit der Methode Put wird ein Attribut eines Active Directory-Objekts geschrieben.
  • Mit der Methode Get wird ein Attribut eines Active Directory-Objekts gelesen.
  • Mit der Methode SetInfo wird ein neues oder geändertes Attribut eines Objekts an Active Directory übertragen.
  • Die Parameter von Create, Delete, Put und Get sind immer die gleichen.

Das Erstellen von ADSI-Scripten

In den folgenden Abschnitten werden die Grundschritte der vorhergehenden Scriptbeispiele genauer untersucht. Sie erhalten so ein besseres Verständnis darüber, wie Sie Ihre eigenen ADSI-Scripte erstellen können.

Schritt 1: Eine Verbindung aufbauen

Der erste Schritt in den vorherigen Scripten war immer das Aufbauen einer Verbindung zu einem Objekt. Wenn Sie ein Objekt erstellen oder löschen, müssen Sie eine Verbindung zu dem Container aufbauen in dem sich das Objekt befindet. Wenn Sie ein Objekt (beziehungsweise seine Attribute) lesen oder ändern möchten, müssen Sie eine Verbindung direkt zu dem entsprechenden Objekt aufbauen.

Das Active Directory-Objekt für die Bindung auswählen

Wenn Sie eine Bindung aufbauen wollen, dann müssen Sie sich überlegen, welche Aufgabe Sie durchführen wollen (Erstellen, Löschen, Lesen oder Ändern). Außerdem müssen Sie den Typ kennen (Objekt oder Container), und wenn das Objekt ein Container ist, dann müssen Sie gegebenenfalls prüfen, ob der Container leer ist. In Abbildung 5.2 sehen Sie ein Flussdiagramm, das Ihnen bei diesem Vorgang hilft.

Dn151181.F73D8D60291D0E6993485D8BD652F976(de-de,TechNet.10).png

Abbildung 5.2: Überlegungen beim Aufbau einer Bindung

Die beiden folgenden Aufgaben, die ebenfalls über ein Script durchgeführt werden können, sind im Flussdiagramm nicht enthalten:

  • Das Löschen eines Containers, der nicht leer ist.
    Mit der Methode DeleteObject können Sie einen Container löschen, der nicht leer ist. Dies ist jedoch möglicherweise gefährlich - daher sollten Sie hierbei sehr vorsichtig sein.
  • Verschieben von Objekten aus einem Container, bevor dieser gelöscht wird.
    Weitere Informationen zu diesem Vorgang finden Sie im Abschnitt Verschieben und Umbenennen von Objekten weiter unten in diesem Kapitel.

Eine Bindung durchführen

Um eine Bindung an ein Active Directory-Objekt zu erstellen, können Sie die VBScript-Funktion GetObject verwenden. Als Parameter geben Sie den Prefix LDAP: gefolgt von zwei Slash-Zeichen und dem Pfad des Active Directory-Objekts an. Die entsprechenden Zeilen in unseren vier vorhergehenden Beispielscripten sahen so aus:

  • Set objDomain = GetObject("LDAP://dc=NA,dc=fabrikam,dc=com")
    Baut eine Bindung zur Domäne na.fabrikam.com auf.
  • Set objOU = GetObject("LDAP://ou=HR,dc=NA,dc=fabrikam,dc=com")
    Baut eine Bindung zur OU HR in der Domäne na.fabrikam.com auf.
  • Set objUser = _
    GetObject("LDAP://cn=MyerKen,ou=HR,dc=NA,dc=fabrikam,dc=com")
    Baut eine Bindung zum Benutzerobjekt MyerKen in der OU HR in der Domäne na.fabrikam.com auf.
  • Set objGroup = _
    GetObject("LDAP://cn=Atl-Users,ou=HR,dc=NA,dc=fabrikam,dc=com")
    Baut eine Bindung zum Gruppenobjekt Atl-Users in der OU HR der Domäne na.fabrikam.com auf.

Der Parameter ADsPath

In der Terminologie von ADSI nennt sich der Prefix LDAP:, zusammen mit einem Pfad zu einem Active Directory-Objekt ADsPath (Active Directory Service Path - Active Directory-Dienst-Pfad - der Pfad zu einem Active Directory-Objekt). Bei diesem ADsPath - einem Parameter der Funktion GetObject - handelt es sich um einen String. Er muss daher immer in Anführungszeichen eingeschlossen werden.

Angeben des Providers

Der erste Teil von ADsPath gibt einen ADSI-Provider an. Über diesen Provider weiß das ADSI-Script aus welcher Quelle die entsprechenden Daten stammen. Um mit Active Directory oder einem anderen LDAP-Verzeichnis zu kommunizieren, verwenden Sie zum Beispiel den Provider LDAP (Lightweight Directory Access Protocol) von ADSI (Adsldp.dll). Um mit der lokalen SAM-Datenbank (Security Accounts Manager) zu kommunizieren (also mit lokalen Konten, Gruppen, usw. zu arbeiten) verwenden Sie den Provider WinNT (Adsnt.dll).

Warnung


Bei den ADSI-Providern wird zwischen Groß- und Kleinschreibung unterschieden. WinNT und winnt ist also in diesem Fall nicht gleichwertig.

Die Funktion GetObject von VBScript verwendet den Provider, um die richtige ADSI-DLL zu laden - dies ist notwendig, damit das Script auf die entsprechenden Informationen (zum Beispiel in Active Directory oder in der lokalen Sicherheitsdatenbank) zugreifen kann. Wenn die DLL geladen ist, dann wird mit dem zweiten Teil des Parameters ADsPath (dem Pfad zum entsprechenden Objekt) eine Bindung mit dem Objekt aufgebaut.

Angeben des Verzeichnispfades des Objekts

Der zweite Teil von ADsPath gibt wie gesagt den Pfad zum Objekt wieder. ADSI unterstützt mehrere Formate für diesen Objektpfad. In den vorhergehenden Beispielen wurde immer der eindeutige Name (distinguished name - DN) des Objekts verwendet. Dies ist jedoch nur eine Möglichkeit einen Objektpfad anzugeben. Weitere Möglichkeiten finden Sie im Abschnitt Root Directory Service Entry weiter unten in diesem Kapitel

Jedes in Active Directory gespeicherte Objekt hat einen eindeutigen Namen (distinguished name - DN). Stellen Sie sich den DN als LDAP-Version eines vollständigen Dateisystempfades vor. Jede Datei hat einen vollständigen Pfad - dieser setzt sich aus dem Gerät, einem oder mehreren Ordnernamen und dem Namen der Datei selbst zusammen. Genauso ist es bei Active Directory -dieser vollständige Pfad eines Active Directory-Objekts nennt sich DN.

So wie ein Dateipfad mehrere Ordner enthält, die jeweils durch ein Backslash getrennt sind, so setzt sich auch der DN eines Active Directory-Objekts aus mehreren Teilen zusammen - diese werden jeweils in der Form attribut=wert angegeben. Die einzelnen Teile werden durch Kommata getrennt. Jeder Teil (attribut=wert) im DN eines Objekts steht für einen Container in Active Directory.

Beim attribut handelt es sich um den Typ des DN-Teils (diese Typen sind in RFC 2247 und RFC 2253 definiert). Der Type eines Benutzerkontos ist zum Beispiel CN - der Typ eine Organisationseinheit ist OU.

Dn151181.note(de-de,TechNet.10).gifAnmerkung:

Mit Ausnahme des Containers Domain Controllers ist der Typ aller Standardcontainer einer Active Directory-Domäne (zum Bespiel Computer, Benutzer und Built-in) CN und nicht OU.

Den wert der einzelnen Pfadteile (attribut=wert)legen Sie beim Erstellen eines Objekts fest. Nehmen wir zum Beispiel einmal an, wir arbeiten mit dem Benutzer MyerKen in der OU HR in der Domäne na.fabrikam.com. In Tabelle 5.1 sehen Sie die einzelnen Objektklassen, Attributtypen und Werte für den DN dieses Benutzers ("cn=MyerKen,ou=HR,dc=NA,dc=fabrikam,dc=com").

Tabelle 5.1: Objektklassen, Attribute und Werte

Objektklasse

Attributtyp

Wert

User

CN

MyerKen

organizationalUnit

OU

HR

domain

DC

NA

domain

DC

fabrikam

domain

DC

com

Die gesamte Pfadangabe eines DNs gibt die Position des Objekts im Bezug auf den Stamm des Active Directory-Verzeichnisbaums an. Wenn Sie die einzelnen Teile des Pfades von links nach rechts durchgehen, dann gelangen Sie vom Objekt selbst bis zum Stamm der Active Directory-Hierarchie (Abbildung 5.3 verdeutlicht dies).

Dn151181.8FF6EC6CEFC0C8BDE5647EB8BCA8538D(de-de,TechNet.10).png

Abbildung 5.3: Eine Beispielhierarchie für einen DN

Das Benutzerobjekt MyerKen befindet sich in der OU HR in der Unterdomäne NA der Domäne fabricam.com. Der gesamte Parameter ADsPath sieht daher für dieses Benutzerobjekt so aus:

"LDAP://cn=MyerKen,ou=HR,dc=NA,dc=fabrikam,dc=com"
Dn151181.note(de-de,TechNet.10).gifAnmerkung:

Der in Script 5.1 verwendete ADsPath-Parameter unterscheidet sich von den restlichen Beispielen dieses Kapitels - er verwendet ein bestimmtes ADSI-Feature mit dem Namen rootDSE. Weitere Informationen zu diesem Feature finden Sie im Abschnitt Root Directory Service Entry weiter unten in diesem Kapitel.

Eine Objektreferenz auf ein Active Directory-Objekt erstellen

Befassen wir uns nun mit dem Teil, der in einer Bindungsanweisung links vom Gleichheitszeichen steht - dem VBScript-Schlüsselwort Setgefolgt von einem Variablennamen. In den Beispielscripten wurden zum Beispiel die Variablennamen objDomain, objOU, objUser und objGroup verwendet.

Im Gegensatz zu einer Zuweisung eines Strings oder einer Zahl zu einer Variable müssen Sie in diesem Fall das Schlüsselwort Set verwenden. Mit diesem Schlüsselwort weisen Sie der Variablen eine Referenz auf ein Objekt zu (die Funktion GetObject liefert ein Objekt zurück).

Bei ADSI handelt es sich bei dem von GetObject zurückgegebenen Objekt um das in ADsPath angegebene Objekt. Es wird jedoch nicht das Objekt selbst zurückgegeben, sondern nur ein 'virtueller Verweis' auf das Objekt.

Schritt 2: Eine Aufgabe ausführen

Das Erstellen und Löschen von Objekten ist wirklich simpel. Nachdem das Script eine Bindung zum entsprechenden Container aufgebaut hat, können Sie das Objekt in diesem Container erstellen. Auch das Lesen und Schreiben von Objektattributen ist sehr einfach. Sie bauen eine Bindung zum entsprechenden Objekt auf und lesen oder schreiben das Attribut.

Wenn Sie die Methoden Create, Put (Ändern) oder Get (Lesen) verwenden, dann bearbeiten Sie jedoch nicht das Active Directory-Objekt selbst. Stattdessen werden die entsprechenden Vorgänge lokal in einem bestimmten Speicherbereich (dem so genannten local property cache - lokaler Eigenschafts-Zwischenspeicher) durchgeführt. Das oder die Attribute eines Active Directory-Objekts werden in diesem lokalen Zwischenspeicher gespeichert. Alle Änderungen am Objekt, die Sie vornehmen, werden in diesem lokalen Zwischenspeicher vorgenommen. Um die Änderungen für das eigentliche Active Directory-Objekt zu übernehmen, müssen Sie erst den lokalen Zwischenspeicher an Active Directory übermitteln - die machen Sie mit der Methode SetInfo.

Eine Methode, die nicht auf diese Art arbeitet, ist Delete. Sie führt ihre Aktion (das Löschen) direkt in Active Directory aus (es gibt noch einige andere Methoden, die ebenfalls direkt in Active Directory arbeiten).

Scriptcode, um die eigentliche Aufgabe durchzuführen

Wenn Sie sich die Beispielscripte anschauen, dann bemerken Sie, dass für die durchzuführenden Aufgaben jeweils der bei der Bindung erstelle Variablennamen mit einem Punkt und dem Namen der Methode verwendet wird:

  • objVariableName.Create
  • objVariableName.Get
  • objVariableName.Put
  • objVariableName.Delete

Die Methoden Create und Delete sind leicht zu merken, da ihr Name ihrer Aktion entspricht. Mit Get können Sie Attribute lesen und mit Put können Sie Attribute schreiben (beziehungsweise ändern).

Die Parameter der einzelnen Methoden

Parameter von Create

Die Methode Create benötigt zwei Parameter: den Klassennamen und den RDN(relative distinguished name - relativer eindeutiger Name) des zu erstellenden Objekts. Ein RDN ist Teil der DN eines Objekts. Der RDN muss im Container des Objekts eindeutig sein - er setzt sich aus einem Attribut und dem zugewiesenen Wert zusammen.

Sehen wir uns noch einmal die vorherigen Beispielscripte an:

  • Set objOU = objDomain.Create("organizationalUnit", "ou=HR")
    Erstellt eine OU
    Der Klassenname ist organizationalUnit,das Attribut ist ou und der Wert ist HR. Daher lautet der RDN ou=HR.
  • Set objUser = objOU.Create("user", "cn=MyerKen")
    Erstellt ein Benutzerkonto
    Der Klassenname ist user, das Attribut ist cn und der Wert ist MyerKen. Daher lautet der RDN cn=MyerKen.
  • Set objGroup = objOU.Create("group", "cn=Atl-Users")
    Erstellt eine Gruppe
    Der Klassenname lautet group, das Attribut ist cn und der Wert ist Atl-Users. Daher lautet der RDN cn=Atl-Users.

Auch für die Methode Create benötigen Sie das Schlüsselwort Set. Mit diesem weisen Sie die von Create zurückgegebene Objektreferenz zu einer Variablen zu. Denken Sie daran, dass es sich nicht um eine Referenz auf das tatsächliche Objekt, sondern um eine Referenz auf das Objekt im Zwischenspeicher handelt. Nachdem Sie die erforderlichen Aufgaben am Objekt durchgeführt haben, müssen Sie das Objekt aus dem Zwischenspeicher an Active Directory übermitteln. Abbildung 5.4 zeigt noch einmal die einzelnen Teile der Aufrufe von Create in den vorherigen Scripten:

Dn151181.B08EFF0803EDF2B704B452CAAF187437(de-de,TechNet.10).png

Abbildung 5.4: Vergleich der unterschiedlichen Aufrufe der Methode Create

Parametern von Put

Die Methode Put benötigt ebenfalls zwei Parameter: den Namen des Attributes und den Wert, den Sie diesem Attribut zuweisen möchten.

ADSI erwartet einen bestimmten Typ von Attributnamen - den lDAPDisplayName. Der Zugriff auf Attribute ist über einige unterschiedliche Namen möglich. In ADSI-Scripten sollten Sie jedoch den lDAPDisplayName verwenden.

Sehen wir uns erneut die vorherigen Beispielscripte an:

  • objOU.Put "description", "Human Resources"
    Schreibt ein Attribut einer OU
    Der lDAPDisplayName des zu bearbeitenden Attributs ist description. Dem Attribut wird der Wert Human Resources zugewiesen.
  • objUser.Put "description", "HR employee"
    Schreibt ein Attribut eines Benutzerkontos
    Der lDAPDisplayName des zu bearbeitenden Attributs ist description. Dem Attribut wird der Wert HR employee zugewiesen.
  • objOU.Put "description", "Atlanta users"
    Schreibt ein Attribut einer Gruppe
    Der lDAPDisplayName des zu bearbeitenden Attributs ist description. Dem Attribut wird der Wert Atlanta users zugewiesen.

Auch beim Erstellen von Objekten werden möglicherweise Attribute geschrieben. Nämlich dann, wenn das Objekt verpflichtende Attribute verwendet - diesen müssen Sie vor dem Übertragen des Objekts an Active Directory einen Wert zuweisen.

Die folgenden Zeilen aus den vorherigen Beispielscripten schreiben verpflichtende Attribute:

  • objUser.Put "sAMAccountName", "myerken"
    Schreibt das verpflichtende Attribut (sAMAccountName) eines Benutzerkontos.
  • objUser.Put "sAMAccountName", "atl-users"
    Schreibt das verpflichtende Attribut (sAMAccountName) einer Gruppe.

Verpflichtende Attribute werden durch Active Directory definiert. Weitere Informationen zu diesem Thema erhalten Sie im Abschnitt Die Active Directory-Architektur weiter unten in diesem Kapitel.

Parameter von Get

Die Methode Get benötigt nur einen Parameter: den lDAPDisplayName des Attributes, das Sie lesen möchten. In Zeile 2 von Script 5.8 und Zeile 3 von Script 5.9 und Script 5.10 wird das Attribut mit dem Namen description gelesen:

  • Wscript.Echo objOU.Get("description")
    Liest das Attribut description einer OU und zeigt es an.
  • Wscript.Echo objUser.Get("description")
    Liest das Attribut description eines Benutzerkontos und zeigt es an.
  • Wscript.Echo objGroup.Get("description")
    Liest das Attribut description einer Gruppe und zeigt es an.

Parameter von Delete

Wie die Methode Create benötigt auch Delete zwei Parameter: Den Typ des zu löschenden Objekts und den RDN des Objekts.

  • objOU.Delete "group", "cn=Atl-Users"
    Löscht eine Gruppe
    Der Klassenname ist group. Der RDN des Objekts ist cn=Atl-Users.
  • objOU.Delete "user", "cn=MyerKen"
    Löscht ein Benutzerkonto
    Der Klassenname ist user. Der RDN des Objekts ist cn=MyerKen.
  • objDomain.Delete "organizationalUnit", "ou=HR"
    Löscht eine OU
    Der Klassenname ist organizationalUnit. Der RDN des Objekts ist cn=HR.

Schritt 3: Übermitteln an Active Directory

Nach dem Erstellen oder Ändern eines Objekts müssen Sie die vorgenommenen Änderungen an Active Directory übermitteln - dies machen Sie über die Methode SetInfo. Wenn Sie das Übermitteln vergessen, dann wird Ihr ADSI-Script trotzdem korrekt ausgeführt- nur die Änderungen ihres Scripts werden nie in Active Directory auftauchen. Das Übermitteln an Active Directory können Sie sich so vorstellen, wie wenn Sie ein Word-Dokument nach dem Erstellen speichern. Weitere Informationen zum lokalen Zwischenspeicher finden Sie im Abschnitt Schritt 2: Durchführen von Aufgaben weiter oben in diesem Kapitel.

Vielleicht ist Ihnen aufgefallen, dass die Methode SetInfo im Abschnitt Lesen der Attribute von Active Directory-Objekten nicht verwendet wurde. Das liegt daran, dass in diesen Scripten ja nur Informationen aus Active Directory ausgelesen werden - das Objekt wird nicht verändert. Daher ist es auch nicht nötig Informationen aus dem lokalen Zwischenspeicher an Active Directory zu übermitteln.

Auch bei der Verwendung der Methode Delete benötigen Sie SetInfo nicht. Das Löschen von Objekten wird nicht im Zwischenspeicher, sondern direkt in Active Directory durchgeführt.

Mehrere Aufgaben über ein Script durchführen

In vielen produktiven Scripten gibt es eine Menge Code, der nicht direkt etwas mit ADSI zu tun hat - dies ist in den Scripten dieses Buches nicht so. So wird es für Sie einfacher die Scripte nachzuvollziehen. Das Script ListDCs.vbs aus dem Resource Kit ist zum Beispiel 454 Zeilen lang. Von diesen 454 Zeilen haben 400 nichts mit ADSI zu zun. Warum sind sie also da? Sie sind da, weil ListDCs.vbs als Mehrzweckwerkzeug entwickelt wurde - so ähnlich wie ein Kommandozeilenbefehl. Das Script enthält zum Beispiel Code zur Verarbeitung von Argumenten, zur Formatierung von Ausgaben und zur Handhabung von Fehlern. Auch wenn dieser Code wichtig ist, so hat er doch nichts mit ADSI zu tun. Wir vermeiden es in diesem Kapitel solchen Code zu verwenden - so können Sie sich auf den Scriptcode konzentrieren, der für die Arbeit mit ADSI notwendig ist.

Um ein Script zu erstellen, das mehrere Attribute eines Active Directory-Objekts liest und schreibt, können Sie die vorherigen Beispielscripte kombinieren:

  1. Erstellen Sie eine Bindung an ein Objekt - Sie müssen den Pfad des Objekts kennen.
  2. Attribute schreiben oder ändern - hierzu müssen Sie die Eigenschaften und Namen der entsprechenden Attribute kennen. Außerdem müssen Sie die geänderten Attribute danach an Active Directory übermitteln.
  3. Attribute lesen - hierzu benötigen Sie die gleichen Informationen wie zum Schreiben von Attributen.

Vorbereitende Schritte

  1. Starten Sie Notepad.exe und speichern Sie eine Datei mit dem Namen ModifyUser.vbs im Ordner C:\scripts.
    Sie können die Scripte dieses Abschnitts dann jeweils in die Datei einfügen und diese so ausführen.
  2. Prüfen Sie, ob Sie das Benutzerkonto MyerKen schon in Active Directory erstellt haben. Wenn nicht, dann erstellen Sie es jetzt.

Binden an ein Benutzerobjekt

Über einen der folgenden Schritte können Sie in der ersten Zeile Ihres Testscripts ModifyUser.vbs eine Bindung an das Benutzerobjekt aufbauen:

  1. Wenn sich das Kontoobjekt in der OU HR derDomäne na.fabrikam.com befindet, verwenden Sie die folgenden Codezeile:
    Set objUser = _
    GetObject("LDAP://cn=MyerKen,ou=HR,dc=NA,dc=fabrikam,dc=com")
  2. Wenn Sie eine OU mit einem anderen Namen verwenden und keine Domäne mit dem Namen na.fabrikam.com haben, dann ändern Sie den DN auf den Active Directory-Container, in dem sich das Benutzerkonto befindet. Wenn Ihre Domäne zum Beispiel contoso.com heißt und der Name der OU Test lautet, dann sollten Sie die Zeile folgendermaßen umändern:
    Set objUser = _
    GetObject("LDAP://cn=MyerKen,ou=Test,dc=contoso,dc=com")
  3. Wenn Sie das Benutzerkonto im Container User der Domäne erstellt haben, mit der Sie momentan verbunden sind, dann verwenden Sie den folgenden Code:
    Set objRootDSE = GetObject("LDAP://rootDSE")
    Set objUser = GetObject("LDAP://cn=MyerKen,cn=Users," & _
    objRootDSE.Get("defaultNamingContext"))

Attribute schreiben oder ändern

Als Nächstes benötigen Sie die lDAPDisplayNames der Attribute, die Sie schreiben oder ändern möchten. In Abbildung 5.5 sehen Sie die allgemeinen Attribute eines Benutzerkontos und den entsprechenden lDAPDisplayName jedes Attributs.

Dn151181.0390A54E79B7098F28C65EDCF19C17B9(de-de,TechNet.10).png

Abbildung 5.5: Registerkarte Allgemein des Benutzerkontos MyerKen

Wie Sie sehen, stimmt der jeweilige lDAPDisplayName nicht mit den Feldbezeichnungen im Eigenschaftsfenster überein. Sie können dieses also nicht verwenden, um die Attributnamen in Erfahrung zu bringen.

Es gibt noch zwei andere Methoden, über die Sie auf Attribute von Active Directory-Objekten zugreifen können - der Weg über den lDAPDisplayName ist jedoch der konsistenteste Ansatz. Er ist auch der einzige Weg, über den Sie Attribute mit der Methode Put schreiben können.

Um den gesamten gezeigten Vorgang so einfach wie möglich zu halten, verändert das Script keine Attribute, die mehrere Werte enthalten (Multiwert-Attribute). Dies wären zum Beispiel die Attribute otherTelephone und url. Weitere Informationen zu Multiwert-Attributen erhalten Sie im Abschnitt Administration von Multiwert-Attributen weiter unten in diesem Kapitel.

Der Scriptcode zum Schreiben oder Ändern der Attribute eines Benutzerobjekts sieht folgendermaßen aus:

objUser.Put "givenName", "Ken"
objUser.Put "initials", "E."
objUser.Put "sn", "Myer"
objUser.Put "displayName", "Myer, Ken"
objUser.Put "description", "HR employee"
objUser.Put "physicalDeliveryOfficeName", "Room 4358"
objUser.Put "telephoneNumber", "(425) 555-0100"
objUser.Put "mail", "myerken@fabrikam.com"
objUser.Put "wWWHomePage", "http://www.fabrikam.com"

Fügen Sie Ihrem Script diese Zeilen direkt unter der Zeile zum Binden des Objekts hinzu.

Als letztes müssen Sie die Änderungen noch an Active Directory übermitteln. Hierzu fügen Sie die folgende Zeile hinzu:

objUser.SetInfo

Lesen und Anzeigen der geänderten Attribute

Nachdem Ihr Script das Objekt verändert hat, können Sie die entsprechenden Attribute anzeigen lassen.

Den entsprechenden Scriptcode sehen Sie unten. Er liest die einzelnen Attribute in Variablen ein.

strGivenName = objUser.Get("givenName")
strInitials = objUser.Get("initials")
strSn = objUser.Get("sn")
strDisplayName = objUser.Get("displayName")
strPhysicalDeliveryOfficeName = _
    objUser.Get("physicalDeliveryOfficeName")
strTelephoneNumber = objUser.Get("telephoneNumber")
strMail = objUser.Get("mail")
strWwwHomePage = objUser.Get("wWWHomePage")

Nun müssen Sie die Werte in den Variablen nur noch anzeigen lassen:

Wscript.Echo "givenName: " & strGivenName
Wscript.Echo "initials: " & strInitials
Wscript.Echo "sn: " & strSn
Wscript.Echo "displayName: " & strDisplayName
Wscript.Echo "physicalDeliveryOfficeName: " & _
    strPhysicalDeliveryOfficeName
Wscript.Echo "telephoneNumber: " & strTelephoneNumber
Wscript.Echo "mail: " & strMail

Dn151181.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).pngZum Seitenanfang

Fortgeschrittene ADSI-Scripting-Techniken

Neben den grundlegenden Aufgaben (Erstellen, Ändern, Lesen, Löschen) gibt es noch einige andere Administrationsaufgaben. Einige dieser Aufgaben sind zum Beispiel:

  • Administration von Multiwert-Attributen
  • Kopieren, Verschieben und Umbenennen von Objekten
  • Cachen von Daten
  • Suchen
  • Auflisten der Active Directory-Objekte in Containern
  • Verwenden des Root Directory Service Entry.

Administration von Multiwert-Attributen

Die bisherigen Scripte dieses Kapitels haben alle nur Attribute mit Einzelwerten bearbeitet oder gelesen. Multiwert-Attribute enthalten mehrere Werte (wer hätte das gedacht!) - zum Beispiel die Bridgehead-Server der Domäne, die Mitglieder einer Gruppe oder die alternativen Telefonnummern eines Benutzerkontos.

Dn151181.note(de-de,TechNet.10).gifAnmerkung:

Weitere Informationen dazu, wie Sie feststellen können, ob ein Attribut ein Einzel- oder Mutiwert-Attribut ist, finden Sie im Abschnitt Die Active Directory-Architektur weiter unten in diesem Kapitel.

Das Lesen und Ändern eines Multiwert-Attributs funktioniert genau wie das Lesen und Ändern eines Einzelwert-Attributs: das Script erstellt eine Bindung an das Objekt, es verwendet eine Methode zum Ändern oder Lesen des Attributs und übermittelt dann die Änderungen an Active Directory.

Ändern von Multiwert-Attributen

Wenn ein Attribut mehrere Werte enthalten kann, dann gibt es mehrere Möglichkeiten Änderungen vorzunehmen:

  • Alle Einträge löschen - wennSie alle Einträge aus einem Attribut entfernen, entfernen Sie damit das ganze Attribut. Ein Attribut ohne Eintrag ist für ein ADSI-Script nicht länger Teil des Objekts.
  • Alle Einträge aktualisieren - alle vorhandenen Einträge werden durch neue ersetzt.
  • Einen Eintrag hinzufügen - die vorhandenen Einträge bleiben bestehen, ein neuer Eintrag kommt hinzu.
  • Einen Eintrag löschen

Egal welche dieser Aktionen Sie ausführen möchten - Sie verwenden immer die Methode PutEx. Der erste Parameter der Methode ist die Art der Aktualisierung, die Sie vornehmen möchten. Als zweites Argument geben Sie das zu ändernde Attribut an und als drittes Argument die Werte für das Attribut. In Tabelle 5.2 sehen Sie alle Argumente der Methode PutEx.

Tabelle 5.2: Argumente der Methode PutEx

Argument

Typ

Erforderlich

Standardwert

Beschreibung

Control Code

Integer (long)

Ja

Keiner

Mit dem Wert 1 werden alle Einträge gelöscht. Mit 2 werden die Einträge aktualisiert, mit 3 werden ein oder mehrere Einträge angehängt und mit 4 werden ein oder mehrere Einträge gelöscht.

Attribute

String

Ja

Keiner

Der lDAPDisplayName des zu ändernden Attributs.

Value

Variant (array)

Ja

Keiner

Jeder Wert muss in Anführungszeichen eingeschlossen sein. Mehrere Werte müssen durch Kommata getrennt werden. Um das Attribut zu löschen, setzen Sie den Wert auf 0.

Tipp:

  • Um die Arbeit mit ADSI-Scripten einfacher zu gestalten, sollten Sie die Parameterwerte von PutEx als Konstanten anlegen:
  • ADS_PROPERTY_CLEAR = 1
  • ADS_PROPERTY_UPDATE = 2
  • ADS_PROPERTY_APPEND = 3
  • ADS_PROPERTY_DELETE = 4

Im gesamten Rest dieses Kapitels werden diese Konstanten für die Methode PutEx verwendet.

Das Ändern von Multiwert-Attributen wird über drei grundlegende Schritte durchgeführt (das Definieren der Konstanten ist ein optionaler Schritt).

  1. Eine Bindung an das Active Directory-Objekt erstellen, das Sie ändern möchten.
  2. Die entsprechende Aufgabe durchführen.
  3. Die Änderungen an Active Directory übertragen.

Das erste Script im nächsten Abschnitt ändert die Mitglieder einer Gruppe über das Mulitwert-Attribut member der Gruppe. Das Script aktualisiert alle Einträge, fügt einen Eintrag hinzu, löscht einen Eintrag und löscht alle Einträge - und zwar in genau dieser Reihenfolge.

Einschränkungen bei Änderungen über die Methode PutEx

Mit PutEx können Sie keine doppelten Einträge zu einem Multiwert-Attribut hinzufügen. Wenn Sie einen solchen Vorgang versuchen, erhalten Sie keine Fehlermeldung - wenn Sie jedoch später die Methode SetInfo aufrufen, schlägt das Script fehl und teilt Ihnen mit, dass das Objekt bereits vorhanden ist.

Wenn Sie versuchen für ein objektabhängiges Attribut ein nicht vorhandenes Objekt angeben, gibt PutEx eine Fehlermeldung zurück (zum Beispiel, wenn Sie versuchen den DN eines Benutzerkontos zu einer Gruppe hinzuzufügen, das es nicht gibt).

Wenn Sie versuchen einen nicht vorhandenen Eintrag über PutEx zu löschen, kommt es zu keiner Fehlermeldung. Der folgende Aufruf von SetInfo wird dann jedoch einen Fehler generieren.

Sie müssen eine Änderung an einem Attribut erst mit der Methode SetInfo übertragen, bevor Sie eine weitere Änderung an demselben Attribut vornehmen. Sehen Sie sich die folgenden drei Scriptzeilen an:

objUser.PutEx ADS_PROPERTY_DELETE, "otherTelephone", Array("555-1080")
objUser.PutEx ADS_PROPERTY_APPEND, "otherTelephone", Array("555-1010")
objUser.SetInfo

Die Telefonnummer 555-1010 wird zwar zum Attribut otherTelephone hinzugefügt, wenn Sie SetInfo ausführen, aber die Nummer 555-1080 wird nicht gelöscht. Um beide Aktionen durchzuführen, müssen Sie den folgenden Scriptcode verwenden:

objUser.PutEx ADS_PROPERTY_DELETE, "otherTelephone", Array("555-1080")
objUser.SetInfo
objUser.PutEx ADS_PROPERTY_APPEND, "otherTelephone", Array("555-1010")
objUser.SetInfo

Ein weiterer wichtiger Punkt bei der Verwendung von PutEx ist, dass die Einträge in einem Multiwert-Attribut nicht in einer bestimmten Reihenfolge gespeichert werden können. Ihr Script sollte sich also nicht auf eine bestimmte Reihenfolge der Speicherung verlassen.

Löschen von Multiwert- und Einzelwert-Attributen über die Methode PutEx

Mit PutEx können Sie Multiwert- und Einzelwert-Attribute löschen. Dies ist besonders im Zusammenhang mit Einzelwert-Attributen wichtig, da die Methode Put ein Attribut nicht vollständig löschen kann - Sie können es mit ihr nur auf den Wert NULL oder "" setzen.

Aktualisieren eines Multiwert-Attributs einer Gruppe

Script 5.14 ändert das Attribut member der Gruppe Atl-Users so, dass es zwei Mitglieder enthält. Hierzu führt das Script die folgenden Schritte durch:

  1. Es definiert die Konstante ADS_PROPERTY_UPDATE mit dem Wert 2. Diese Konstante wird in den Zeilen 5-9 für die Methode PutEx verwendet.
    Der Wert 2 bedeutet, dass die Einträge eines Multiwert-Attributs aktualisiert werden.
  2. Es baut eine Bindung zur Gruppe Atl-Users in der OU HR der Domäne na.fabrikam.com auf.
  3. Es aktualisiert das Attribut member des Gruppeobjekts mit den DNs von MyerKen und LewJudy. Da PutEx mit Multiwert-Attributen arbeitet, müssen diese beiden DNs als Array übergeben werden.
    Beachten Sie, dass sich das Benutzerkonto MyerKen in der OU HR und das Benutzerkonto LewJudy in der OU Sales befindet - beide OUs befinden sich in der Domäne na.fabrikam.com.
  4. Es überträgt die Änderungen an der Gruppe an Active Directory.
    Da PutEx mit dem Parameter 2 (aktualisieren) aufgerufen wurde, werden die vorhandenen Gruppenmitglieder der Gruppe Atl-Users durch die neuen Mitglieder ersetzt.

Script 5.14: Aktualisieren des Attributs member einer Gruppe



1

2

3

4

5

6

7

8

9

Const ADS_PROPERTY_UPDATE = 2

Set objGroup = GetObject _

("LDAP://cn=Atl-Users,ou=HR,dc=NA,dc=fabrikam,dc=com")


objGroup.PutEx ADS_PROPERTY_UPDATE, _

"member", Array("cn=MyerKen,ou=HR,dc=NA,dc=fabrikam,dc=com", _

"cn=LewJudy,ou=Sales,dc=NA,dc=fabrikam,dc=com")


objGroup.SetInfo

Einen Einträg zu einem Multiwert-Attribut einer Gruppe hinzufügen

Vorausgesetzt, das Script 5.14 ausgeführt wurde, hängt Script 5.15 einen Eintrag an das Attribut member an, so das die Gruppe nun drei Mitglieder hat. Hierzu führt das Script die folgenden Schritte aus:

  1. Es definiert die Konstante ADS_PROPERTY_APPEND auf den Wert 3 (anhängen).
  2. Es baut eine Bindung zur Gruppe Atl-Users in der OU HR der Domäne na.fabrikam.com auf.
  3. Es hängt einen Eintrag an das Attribut member an. Hierzu verwendet es die Konstante ADS_PROPERTY_APPEND und den DN des Benutzerobjekts YoungRob.
    Das Benutzerobjekt YoungRob befindet sich in der OU R&D der Domäne na.fabrikam.com.
  4. Es übermittelt die Änderung an Active Directory.
    Da der Eintrag nur angehängt wurde, bleiben alle bisherigen Einträge im Attribut members der Gruppe ebenfalls erhalten.

Script 5.15: Anhängen eines Eintrags im Attribut member einer Gruppe



1

2

3

4

5

6

7

8

Const ADS_PROPERTY_APPEND = 3

Set objGroup = GetObject _

("LDAP://cn=Atl-Users,ou=HR,dc=NA,dc=fabrikam,dc=com")


objGroup.PutEx ADS_PROPERTY_APPEND, _

"member", Array("cn=YoungRob,ou=R&D,dc=NA,dc=fabrikam,dc=com")


objGroup.SetInfo

Einen Eintrag aus einem Multiwert-Attribut einer Gruppe löschen

Vorausgesetzt, dass Script 5.14 und Script 5.15 ausgeführt wurde, löscht Script 5.16 einen Eintrag aus dem Attribut member der Gruppe. Die Gruppe hat danach nur noch zwei Mitglieder. Hierzu führt das Script die folgenden Schritte aus:

  1. Es definiert die Konstante ADS_PROPERTY_DELETE auf den Wert 4 (löschen).
  2. Es baut eine Bindung zur Gruppe Atl-Users in der OU HR der Domäne na.fabrikam.com auf.
  3. Es löscht einen Eintrag aus dem Attribut. Hierzu verwendet es die Konstante ADS_PROPERTY_DELETE und den DN des Benutzerobjekts MyerKen.
  4. Es übermittelt die Änderung an Active Directory.
    Da nur der eine Eintrag gelöscht wurde, bleiben alle anderen Einträge im Attribut members der Gruppe erhalten.

Script 5.16: Löschen eines Eintrags aus dem Attribut member einer Gruppe



1

2

3

4

5

6

7

8

Const ADS_PROPERTY_DELETE = 4

Set objGroup = GetObject _

("LDAP://cn=Atl-Users,OU=HR,dc=NA,dc=fabrikam,dc=com")


objGroup.PutEx ADS_PROPERTY_DELETE, _

"member", Array("cn=MyerKen,ou=HR,dc=NA,dc=fabrikam,dc=com")


objGroup.SetInfo

Löschen eines Multiwert-Attributs einer Gruppe

Script 5.17 löscht das Attribut member der Gruppe Atl-Users. Hierzu geht das Script folgendermaßen vor:

  1. Es definiert die Konstante ADS_PROPERTY_CLEAR auf den Wert 4 (löschen).
  2. Es baut eine Bindung zur Gruppe Atl-Users in der OU HR der Domäne na.fabrikam.com auf.
  3. Es löscht das Attribut. indem es alle Einträge entfernt. Hierzu verwendet es die Konstante ADS_PROPERTY_CLEAR und den Wert 0.
  4. Es übermittelt die Änderung an Active Directory.

Script 5.17: Löschen des Attributs member einer Gruppe



1

2

3

4

5

6

7

Const ADS_PROPERTY_CLEAR = 1

Set objGroup = GetObject _

("LDAP://cn=Atl-Users,ou=HR,dc=NA,dc=fabrikam,dc=com")


objGroup.PutEx ADS_PROPERTY_CLEAR,"member", 0


objGroup.SetInfo

Multiwert-Attribute eines Benutzerkontos aktualisieren

Die Änderung von Multiwert-Attributen eines Active Directory-Objekts funktioniert unabhängig vom Typ des Objekts immer gleich. Um dies zu demonstrieren, aktualisiert Script 5.18 die Multiwert-Attribute url und otherTelephone des Benutzerkontos MyerKen. Hierzu führt das Script die folgenden Schritte durch:

  1. Es definiert die Konstante ADS_PROPERTY_UPDATE mit dem Wert 2. Diese Konstante wird später für die Methode PutEx verwendet.
    Der Wert 2 bedeutet, dass die Einträge eines Multiwert-Attributs aktualisiert werden.
  2. Es baut eine Bindung zum Benutzerobjekt MyerKen in der OU HR der Domäne na.fabrikam.com auf.
  3. Es aktualisiert die Attribute url und otherTelephone. Im Gegensatz zum Attribut member einer Gruppe können Sie in diese beiden Attribute beliebige Werte schreiben.
  4. Es überträgt die Änderungen an der Gruppe an Active Directory.
    Da PutEx mit dem Parameter 2 (aktualisieren) aufgerufen wurde, werden die vorhandenen Einträge die neuen ersetzt.

Script 5.18: Aktualisieren der Attribute url und otherTelephone eines Benutzerkontos



1

2

3

4

5

6

7

8

9

10

11

12

Const ADS_PROPERTY_UPDATE = 2

Set objGroup = GetObject _

("LDAP://cn=MyerKen,ou=HR,dc=NA,dc=fabrikam,dc=com")


objGroup.PutEx ADS_PROPERTY_UPDATE, _

"url", Array("http://www.microsoft.com", _

"http://www.fabrikam.com/na","http://www.contoso.com")


objGroup.PutEx ADS_PROPERTY_UPDATE, _

"otherTelephone", Array("555-0180", "555-0182", "555-0183")


objGroup.SetInfo

Lesen von Multiwert-Attributen

Da ein Multiwert-Attribut mehr als einen Eintrag haben kann, müssen Sie die Methode GetEx zum Lesen der Einträge verwenden. Die Einträge werden als Array vom Typ Variant zurückgeben. Der Datentyp Variant kann jede beliebige Art von Daten enthalten.

Wichtig


Auch die Methode Get kann Einträge eines Multiwert-Attributs zurückgeben. Trotzdem sollten Sie es nur für Einzelwert-Attribute verwenden. Weitere Informationen zu diesem Thema finden Sie im Abschnitt Cachen von Daten.

Um die Inhalte eines Arrays anzuzeigen, benötigen Sie Scriptcode, der die Elemente des Arrays durchgeht. Eine For-Each-Schleife ist hierzu ideal geeignet.

Wenn wir die benötigte Schleife einmal außer Acht lassen, benötigen Sie zwei Schritte, um einen Multiwert-Attribut auszulesen:

  1. Verbinden mit dem Active Directory-Objekt, dessen Attribute Sie lesen möchten.
  2. Lesen von einem oder mehreren Attributen.
    Der Unterschied in diesem Schritt liegt in der Verwendung der Methode GetEx statt Get wie bei einem Einzelwert-Attribut. Außerdem wird eine For-Each-Schleife verwendet, um den zurückgegebenen Array durchzugehen und dessen Inhalte anzuzeigen.

Lesen eines Multiwert-Attributs einer Gruppe

Script 5.19 liest die Elemente des Multiwert-Attributs member der Gruppe Atl-Users aus und zeigt diese an. Bevor Sie das Script ausführen, sollten Sie noch einmal Script 5.14 ausführen (um sicherzustellen, dass die Gruppe auch Mitglieder hat). Das Script geht folgendermaßen vor:

  1. Es baut eine Bindung mit dem Gruppenobjekt Atl-Users in der OU HR der Domäne na.fabrikam.com auf.
  2. Es verwendet eine For-Each-Schleife, um die Elemente des Attributs zu lesen und auszugeben.

Script 5.19: Auslesen des Attributs member einer Gruppe



1

2

3

4

5

6

Set objGroup = GetObject _

("LDAP://cn=Atl-Users,ou=HR,dc=NA,dc=fabrikam,dc=com")


For Each Member in objGroup.GetEx("member")

Wscript.Echo Member

Next

Wenn Sie das Script in der Domäne na.fabrikam.com ausführen, sollte es die folgenden Informationen ausgeben:

CN=LewJudy,OU=Sales,dc=NA,DC=fabrikam,DC=com
CN=MyerKen,OU=HR,dc=NA,DC=fabrikam,DC=com

Lesen von Multiwert-Attributen eines Benutzerkontos

Script 5.20 liest die Einträge url und otherTelephone des Benutzerkontos MyerKen.

  1. Es baut eine Bindung zum Benutzerkonto MyerKen in der OU HR der Domäne na.fabrikam.com auf.
  2. Es verwendet eine For-Each-Schleife, um alle Elemente des Attributs url auszugeben.
  3. Es verwendet eine weitere Schleife, um alle Elemente des Attributs otherTelephone auszugeben.

Script 5.20: Auslesen der Attribute url und otherTelephone eines Benutzerkontos



1

2

3

4

5

6

7

8

9

10

Set objGroup = GetObject _

("LDAP://cn=MyerKen,ou=HR,dc=NA,dc=fabrikam,dc=com")


For Each url in objGroup.GetEx("url")

Wscript.Echo url

Next


For Each otherTelephone in objGroup.GetEx("otherTelephone")

Wscript.Echo otherTelephone

Next

Wenn Sie das Script in der Domäne na.fabrikam.com ausführen, erhalten Sie die folgende Ausgabe:

https://www.contoso.com
http://www.fabrikam.com/na
https://www.microsoft.com
555-0183
555-0182
555-0180

Die folgenden wichtigen Erkenntnisse können wir aus den Scripten dieses Abschnittes gewinnen:

  • Sie führen alle die gleichen grundlegenden Schritte aus: Aufbau einer Bindung und Ausgeben der Elemente über die For-Each-Schleife.
  • Sie verwenden alle die gleiche Methode (GetEx) - egal um was für ein Objekt es sich handelt.

Das Cachen von Daten

Bis jetzt haben Sie relativ wenig über den lokalen Zwischenspeicher (Cache) erfahren, in dem ADSI die Eigenschaften hinterlegt, beziehungsweise ändert. Sie wissen, dass die Methoden Get und GetEx Attribute lesen. Beide Methoden verwenden in Hintergrund jedoch die Methode GetInfo um die Attributwerte aus Active Directory in den lokalen Zwischenspeicher zu laden. Auch Sie können die Methode GetInfo (beziehungsweise GetInfoEx) verwenden - so können Sie steuern, welche Werte sich im Zwischenspeicher befinden. Weitere Informationen über den Zwischenspeicher finden Sie im Abschnitt Schritt 2: Ausführen von Aufgaben dieses Kapitels. Wenn Sie verstehen, wie der lokale Zwischenspeicher arbeitet, wird dies verhindern, dass Sie versehentlich falsche Attributwerte auslesen.

Wie die Methode Get Attributwerte abfragt

Get fragt Attribute aus dem lokalen Zwischenspeicher entweder als String oder als Variant-Array ab - abhängig vom Typ des Attributs und seinen Inhalten:

  • Einzelwert-Attribute - Get gibt einen String zurück.
  • Multiwert-Attribut mit einem Eintrag -Get gibt einen String zurück.
  • Multiwert-Attribut mit mehreren Einträgen -Get gibt einen Variant-Array zurück.

Wichtig


Ein Attribut, das keinen Wert enthält, wird von ADSI nicht berücksichtigt. Daher werden solche Attribute niemals in den lokalen Zwischenspeicher eingelesen.

In allen bisherigen Beispielen wurde vorgeschlagen, für Einzelwert-Attribute die Methode Get und für Multiwert-Attribute die Methode GetEx zu verwenden. Mit dieser Methode müssen Sie nicht erst prüfen, ob es sich beim Rückgabewert um einen String oder um ein Variant-Array handelt. Wenn Sie jedoch wissen, dass das abzufragende Attribut ein Einzelwert-Attribut ist oder wenn es sich um ein Multiwert-Attribut handelt, bei dem Sie die Anzahl der Einträge kennen, dann ist die Methode Get deutlich effizienter als die Methode GetEx.

Wenn ein Attribut noch nicht in den lokalen Zwischenspeicher geladen wurde, dann ruft die Methode Get bei ihrer Verwendung explizit die Methode GetInfo auf. Als Ergebnis lädt GetInfo die meisten Attribute in den lokalen Zwischenspeicher - mit Ausnahme von operativen Attributen und Attributen, die sich bereits im Zwischenspeicher befinden.

Operative Attribute sind die Attribute, deren Werte nicht gespeichert sind, sondern erst dann vom Domänencontroller berechnet werden, wenn Sie abgefragt werden - das Attribut canonicalName ist zum Beispiel ein solches Attribut.

Wenn Sie die Methode Get danach erneut verwenden, dann wird das gelesene Attribut aus dem Zwischenspeicher gelesen - GetInfo wird nicht erneut aufgerufen.

Wie die Methode GetEx Attribute abfragt

Die Methode GetEx gibt die Werte des abgefragten Attributs immer als Variant-Array zurück. Daher müssen Sie auch immer eine For-Each-Schleife zur Abfrage der Werte verwenden. Wenn Sie nicht wissen, ob Sie es mit einem Einzelwert- oder Multiwert-Attribut zu tun haben, dann kann es einfacher sein, die Methode GetEx statt Get zu verwenden. Sie erhalten dann alle Attributwerte als Variant-Array und können alle Aufrufe gleich handhaben.

Wenn sich das Attribut noch nicht im Zwischenspeicher befindet, ruft auch die Methode GetEx intern die Methode GetInfo auf. Attribute, die sich bereits im Zwischenspeicher befinden, werden auch durch einen expliziten Aufruf von GetInfo nicht überschrieben.

Die Methode GetInfo explizit aufrufen

Sie können den lokalen Zwischenspeicher über die Methode GetInfo explizit neu laden oder aktualisieren. Wenn Sie die Methode aufrufen, lädt sie alle Attribute (außer den operativen Attributen) in den Zwischenspeicher. Sie sollten die Methode selbst aufrufen, wenn Sie sicher sein wollen, dass im Zwischenspeicher die aktuellsten Werte vorhanden sind.

Die Syntax der Methode GetInfo sieht folgendermaßen aus:

object.GetInfo

Script 5.21 lädt die meisten Attribute des Gruppenobjekts Atl-Users in den lokalen Zwischenspeicher.

  1. Es baut eine Bindung an die Gruppe Atl-Users in der OU HR der Domäne na.fabrikam.com auf.
  2. Es verwendet die Methode GetInfo, um die Attribute des Gruppenobjekts in den lokalen Zwischenspeicher zu laden.

Script 5.21: Expliziter Aufruf von GetInfo



1

2

3

Set objGroup = _

GetObject("LDAP://cn=Atl-Users,ou=HR,dc=NA,dc=fabrikam,dc=com")

objGroup.GetInfo

Sie sollten mit dem Aufruf von GetInfo vorsichtig sein – alle Änderungen, die im Zwischenspeicher an Attributen vorgenommen wurden und die noch nicht an Active Directory übermittelt wurden, gehen mit dem Aufruf verloren. Sie sollten also sicherstellen, dass Sie vor dem Aufruf von GetInfo alle Änderungen mit SetInfo übermittelt haben. In Zeile 2 des folgenden Codes wird das Attribut description auf den Wert Human Resources gesetzt (natürlich nur im lokalen Zwischenspeicher). In Zeile 3 wird dann der lokale Zwischenspeicher an Active Directory übertragen.



1

2

3

Set objOU = GetObject("LDAP://ou=HR,dc=NA,dc=fabrikam,dc=com")

objOU.Put "description", "Human Resources"

objOU.SetInfo

Sehen Sie sich im Gegensatz dazu das folgende Script an:



1

2

3

4

Set objOU = GetObject("LDAP://ou=HR,dc=NA,dc=fabrikam,dc=com")

objOU.Put "description", "Human Resources"

objOU.GetInfo

objOU.SetInfo

In Zeile 2 wird weiterhin der Wert Human Resources in das Attribut description geschrieben. In Zeile 3 wird dann jedoch der lokale Zwischenspeicher explizit neu geladen - daher wird der Wert des Attributs überschrieben (wenn die Methode GetInfo von Get oder GetEx aufgerufen wird, ist dies nicht weiter schlimm - hier wird der Wert nur dann geladen, wenn er im Zwischenspeicher noch nicht vorhanden ist).

Die Methode GetInfoEx

Statt alle Attribute neu in den Zwischenspeicher zu laden, können Sie sich auf die gewünschten Attribute beschränken - hierzu verwenden Sie die Methode GetInfoEx. Über diese Methode können Sie übrigens auch die operativen Attribute abfragen. Auch wenn Sie die Last auf dem Domänencontroller gering halten möchten, dann ist GetInfoEx hierzu ideal geeignet.

Die Syntax der Methode sieht folgendermaßen aus:

object.GetInfoEx Attributes, 0

Der Parameter Attributes ist ein Array mit dem lDAPDisplayName der Attribute, die Sie neu laden möchten. Der zweite Parameter (0) ist reserviert. Er muss bei jedem Aufruf der Methode GetInfoEx angegeben werden.

Um die Attribute an die Methode GetInfoEx zu übergeben, erstellen Sie einen Array aus den entsprechenden lDAPDisplayName-Werten dieser Attribute. Script 5.22 lädt auf diese Weise zwei Attribute neu: description und dnsHostName.

  1. Es baut eine Bindung zum Computerobjekt SEA-SQL-01 im Container Computers der Domäne na.fabrikam.com auf.
  2. Es initialisiert eine Variable mit dem Namen arrAttributes mit einem Array mit den lDAPDisplayName-Werten der beiden Attribute (description und dnsHostName).
  3. Es verwendet die Methode GetInfoEx, um explizit die beiden Attribute neu zu laden.

Script 5.22: Attribute über GetInfoEx neu laden



1

2

3

4

Set objComputer = GetObject _

("LDAP://cn=SEA-SQL-01,cn=Computers,dc=NA,dc=fabrikam,dc=com")

arrAttributes = Array("description", "dnsHostName")

objComputer.GetInfoEx arrAttributes, 0

Wie bei der Methode GetInfo müssen Sie auch bei der Methode GetInfoEx vorsichtig sein, wenn Sie Attribute ändern. Vergessen Sie nicht die geänderten Attribute über SetInfo an Active Directory zu übermitteln, bevor Sie sie neu laden. Ansonsten gehen die Änderungen verloren.

In den Zeilen 3 und 4 des folgenden Scripts werden zum Beispiel die Werte der Attribute description und dnsHostName im lokalen Zwischenspeicher geändert. Wenn die gleichen Attribute in Zeile 7 über GetInfoEx neu geladen werden, sind die geänderten Werte verloren. In Zeile 9 werden so mit SetInfo die alten (neu geladenen) Werte zurück an Active Directory übermittelt.



1

2

3

4

5

6

7

8

Set objComputer = GetObject _

("LDAP://cn=SEA-SQL-01,cn=Computers,dc=NA,dc=fabrikam,dc=com")

objComputer.Put "description", "SQL Computer 1"

objComputer.Put "dnsHostName", "sea-sql-01.na.fabrikam.com"


arrAttributes = Array("description", "dnsHostName")

objComputer.GetInfoEx arrAttributes, 0

objComputer.SetInfo

Das Problem umgehen Sie, wenn Sie die Zeile 8 (den Aufruf von SetInfo) in Zeile 5 verschieben.

Kopieren, Verschieben und Umbenennen von Objekten

Kopieren von Objekten

Um ein Objekt zu kopieren, benötigen Sie zuerst eine Quelle [aus der?] die Sie kopieren können. Außerdem müssen Sie festlegen, welche Attribute des Objekts Sie kopieren möchten.

Um ein Objekt zu kopieren, kombinieren Sie einfach mehrere Aufgaben, die Sie bereits weiter oben in diesem Kapitel kennen gelernt haben:

  1. Erstellen Sie als erstes das Zielobjekt.
    Weitere Informationen hierzu finden Sie im Abschnitt Erstellen von Active Directory-Objekten weiter oben in diesem Kapitel.
  2. Lesen Sie die Attribute des Quellobjekts aus, die auf das Zielobjekt kopiert werden sollen.
    Weitere Informationen hierzu finden Sie in den Abschnitten Lesen von Attributen von Active Directory-Objekten und Lesen von Multiwert-Attributen weiter oben in diesem Kapitel.
  3. Schreiben Sie die Attributwerte in das Zielobjekt.
    Weitere Informationen finden Sie in den Abschnitten Ändern eines Active Directory-Objekts und Ändern von Multiwert-Attributen weiter oben in diesem Kapitel.

Die Scripte in diesem Abschnitt zeigen Ihnen, wie Sie ein Objekt kopieren können. Das erste Beispiel kopiert zum Beispiel ein Computerobjekt.

Kopieren eines Computerobjekts

Script 5.23 kopiert ausgewählte Attribute eines Computerobjekts mit dem Namen SEA-PM-01 in ein neues Computerobjekt mit dem Namen SEA-SQL-01. Das Computerobjekt, dass als Vorlage verwendet wird (SEA-PM-01) befindet sich im Container Computers der Domäne na.fabrikam.com. Das neue Computerobjekt wird ebenfalls im Container Computers erstellt.

  1. Das Script baut eine Bindung auf den Container Computers der Domäne na.fabrikam.com auf.
    Achten Sie darauf, dass der Container Computers den Typ CN hat (Außer dem Container Domain Controllers haben alle Container direkt unter der Domäne das Attribut CN).
  2. Es erstellt ein Computerobjekt mit den Namen sea-sql-01.
  3. Es setzt das verpflichtende Attribut sAMAccountName des neuen Objekts auf den Wert sea-sql-01.
  4. Es überträgt das neue Computerobjekt an Active Directory.
    Hiermit ist das neue Computerobjekt fertig.
  5. Das Script baut eine Bindung auf das Computerobjekt SEA-PM-01 in dem Container Computers der Domäne na.fabrikam.com auf.
    Dieses Computerobjekt dient als Vorlage des Kopiervorgangs auf das neue Computerobjekt.
  6. Es erstellt einen Array mit dem Namen arrAttributes, das die lDAPDisplayNames der optionalen Attribute enthält, die auf das neue Computerobjekt kopiert werden sollen.
  7. Es verwendet eine For-Each-Schleife, um das Array durchzugehen.
    • Es liest jedes Attribut aus dem Vorlagen-Computerobjekt aus.
    • Es schreibt das ausgelesene Attribut in das neue Computerobjekt.
  8. Es überträgt die Änderungen am neuen Computerobjekt an Active Directory.

Script 5.23: Kopieren eines Computerobjekts



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

Set objCompt = GetObject("LDAP://cn=Computers,dc=NA,dc=fabrikam,dc=com")

Set objComptCopy = objCompt.Create("computer", "cn=SEA-SQL-01")

objComptCopy.Put "sAMAccountName", "sea-sql-01"

objComptCopy.SetInfo


Set objComptTemplate = _

GetObject("LDAP://cn=SEA-PM-01,cn=Computers,dc=NA,dc=fabrikam,dc=com")

arrAttributes = Array("description", "location")


For Each strAttrib in arrAttributes

strValue = objComptTemplate.Get(strAttrib)

objComptCopy.Put strAttrib, strValue

Next


objComptCopy.SetInfo

Auch wenn in Script 5.23 nur zwei Attribute kopiert werden, können Sie natürlich so viele Attribute kopieren, wie Sie möchten.

Kopieren eines Benutzerkontos

Script 5.24 kopiert ausgewählte Einzelwert- und Multiwert-Attribute vom Benutzerkonto HuffArlene auf ein neues Benutzerkonto mit den Namen BarrAdam. Das Benutzerkonto, das als Vorlage verwendet wird (HuffArlene), befindet sich in der OU HR der Domäne na.fabrikam.com. Das neue Benutzerkonto (BarrAdam) wird ebenfalls in der OU HR erstellt. Das Script geht hierbei folgendermaßen vor:

  1. Es definiert die Konstante ADS_PROPERTY_UPDATE mit dem Wert 2 (diese wird später von der Methode PutEx verwendet, um einen Eintrag in einem Multiwert-Attribut zu ändern (in Zeile 21).
  2. Es baut eine Bindung auf die OU HR in der Domäne na.fabrikam.com auf.
  3. Es erstellt ein Benutzerkonto mit dem Namen BarrAdam.
  4. Es setzt das verpflichtende Attribut sAMAccountName auf den Wert barradam.
  5. Es übermittelt das neue Benutzerkonto an Active Directory.
  6. Es baut eine Bindung auf das Benutzerkonto HuffArlene in der OU HR der Domäne na.fabrikam.com auf.
  7. Es erstellt ein Array mit dem Namen arrSVAttributes, das die lDAPDisplayNames-Werte der optionalen Einzelwert-Attribute enthält, die auf das neue Benutzerkonto kopiert werden sollen.
  8. Es erstellt ein weiteres Array mit dem Namen arrMVAttributes, das die lDAPDisplayNames-Werte der optionalen Multiwert-Attribute enthält, die auf das neue Benutzerkonto kopiert werden sollen.
  9. Es verwendet eine For-Each-Schleife, um das Array arrSVAttributes durchzugehen.
    In der Schleife verwendet es die Methode Get, um die einzelnen Attribute aus dem Benutzerkonto auszulesen, das als Vorlage dient und die Methode Put, um diese Attribute in das neue Benutzerkonto zu schreiben.
  10. Es verwendet eine weitere For-Each-Schleife, um den Vorgang mit dem Array arrMVAttributes und den Multiwert-Attributen zu wiederholen.
  11. Es übermittelt die Änderungen an dem neuen Benutzerkonto an Active Directory.

Script 5.24: Kopieren eines Benutzerkontos



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

Const ADS_PROPERTY_UPDATE = 2

Set objOU = GetObject("LDAP://OU=HR,dc=NA,dc=fabrikam,dc=com")

Set objUserCopy = objOU.Create("user", "cn=BarrAdam")

objUserCopy.Put "sAMAccountName", "barradam"

objUserCopy.SetInfo


Set objUserTemplate = _

GetObject("LDAP://cn=HuffArlene,ou=HR,dc=NA,dc=fabrikam,dc=com")


arrSVAttributes = Array("description", "department", _

"company", "wWWHomePage")

arrMVAttributes = Array("url", "otherTelephone")


For Each strAttrib in arrSVAttributes

strValue = objUserTemplate.Get(strAttrib)

objUserCopy.Put strAttrib, strValue

Next


For Each strAttrib in arrMVAttributes

arrValue = objUserTemplate.GetEx(strAttrib)

objUserCopy.PutEx ADS_PROPERTY_UPDATE, strAttrib, arrValue

Next


objUserCopy.SetInfo

Aus den Scripten dieses Abschnitts können wir die folgenden wichtigen Schlussfolgerungen ziehen:

  • Zum Kopieren von Active Directory-Objekten sind drei Schritte nötig: ein Objekt erstellen, Attribute aus dem Vorlagen-Objekt lesen und die Attribute in das neue Objekt schreiben.
  • Es gibt keine Methode, um eine direkte Kopie zu erstellen.

Verschieben und Umbenennen von Objekten

Zum Umbenennen und zum Verschieben wird dieselbe Methode verwendet: MoveHere. Im Gegensatz zum Kopieren ist das Verschieben und Umbenennen über ein ADSI-Script relativ einfach. Mit der Methode sind die folgenden Aktionen möglich:

  • Verschieben eines Objekts in einen anderen Container in der gleichen Domäne.
  • Umbenennen eines Objekts im gleichen Container .
  • Umbenennen und Verschieben eines Objekts in einen anderen Container der gleichen Domäne.
  • Verschieben eines Objekts in eine andere Domäne.
  • Umbenennen und Verschieben eines Objekts in eine andere Domäne.

Das Verschieben in eine andere Struktur oder Gesamtstruktur ist mit der Methode MoveHere nicht möglicht.

Bedingungen für das Verschieben über Domänengrenzen hinweg

Es gibt einige objektspezifische Einschränkungen beim Verschieben über Domänengrenzen hinweg. Die folgenden Bedingungen müssen erfüllt sein, damit dies möglich ist:

  • Die Zieldomäne muss im nativen Modus ausgeführt werden.
  • Sowohl Ziel- als auch Quelldomäne müssen die Kerberos-Authentifizierung verwenden.
  • Die Verschieben-Operation muss von der Quelldomäne aus durchgeführt werden.
  • Sie benötigen die entsprechenden Berechtigungen, um das Objekt aus der Quelldomäne zu entfernen und in der Zieldomäne anzulegen.
  • Das Verschieben von Containern mit Inhalten ist nicht möglich.
  • Security-Principals wie zum Beispiel Benutzer, Gruppe und Computer können nicht in eine andere Domäne verschoben werden, wenn sie Mitglieder einer oder mehrerer globaler Gruppen sind.

Die Methode MoveHere erwartet zwei Argumente. Beim ersten Argument handelt es sich um den ADsPfad des zu verschiebenden oder umzubenennenden Objekts. Der DN im ADsPfad legt fest, wo sich das Objekt im Moment befindet. Das zweite Argument ist der RDN des zu verschiebenden Objekts oder den neuen Namen des umzubenennenden Objekts. Wenn Sie das Objekt nur verschieben und nicht umbenennen möchten, dann können Sie als zweiten Parameter die Konstante vbNullString angeben. In Tabelle 5.3 sind die Argumente der Methode MoveHere noch einmal zusammengefasst.

Tabelle 5.3: Argumente der Methode MoveHere

Argument

Type

Erforderlich

Standardwert

Beschreibung

ADsPath

String

Ja

Keiner

Name des Providers und der DN des Quellobjekts, das verschoben oder umbenannt werden soll.

RelativeDistinguishedName

String

Ja

Keiner

Das Attribut (cn=name) des Objekts, das verschoben wird oder der neue Name des umzubenennenden Objekts. Wenn das Objekt nicht umbenannt werden soll, verwenden Sie die Konstante vbNullString.

Unabhängig ob Sie ein Objekt umbenennen oder verschieben wollen, müssen Sie zwei grundlegende Schritte durchführen:

  1. Eine Bindung an den Active Directory-Container aufbauen, der als Ziel für die Verschiebe- oder Umbenenn-Operation dienen soll.
  2. Verschieben oder Umbenennen des Objekts.

Wie die Methode Delete, arbeitet auch die Methode MoveHere direkt in Active Directory. Daher ist es nicht notwendig die Methode SetInfo aufzurufen.

Das Ziel der drei Scripte in diesem Abschnitt ist das Umbenennen eines veröffentlichten Druckers, das Verschieben einer Gruppe in eine OU der gleichen Domäne und das Verschieben eine OU in eine andere Domäne.

Umbenennen eines veröffentlichten Druckers

Script 5.25 benennt den Drucker Printer1 in HRPrn1 um. Der Drucker bleibt in der OU HR der Domäne na.fabrikam.com.

  1. Das Script baut eine Bindung zur OU HR in der Domäne na.fabrikam.com auf.
    Hierdurch wird die OU HR zum Zielcontainer der Umbenenn-Operation.
  2. Es benennt den Drucker Printer1 in HRPrn1 um.
    Als erster Parameter der Methode MoveHere wird der ADsPfad des umzubenennenden Objekts angegeben (der LDAP-Provider und der DN des Druckers Printer1). Der zweite Parameter ist der neue Name des Druckers.

Script 5.25: Umbenennen eines veröffentlichten Druckers



1

2

3

4

Set objOU = GetObject("LDAP://ou=HR,dc=NA,dc=fabrikam,dc=com")


objOU.MoveHere _

"LDAP://cn=Printer1,ou=HR,dc=NA,dc=fabrikam,dc=com", "cn=HRPrn1"

Verschieben einer Gruppe von einem Container in einen anderen

Script 5.26 verschiebt die Gruppe Atl-Users aus der OU HR in den Container Users der Domäne na.fabrikam.com. Beachten Sie, dass die Gruppe nicht verändert wird - sie wird nicht umbenannt und die Gruppenmitgliedschaften werden nicht verändert.

  1. Das Script baut eine Bindung auf den Container Users der Domäne na.fabrikam.com auf.
    Der Container Users wird somit zum Ziel der Verschiebeoperation.
  2. Es verschiebt die Gruppe Atl-Users aus der OU HR in den Container Users in derselben Domäne.
    Der erste Parameter der Methode MoveHere ist der ADsPfad des zu verschiebenden Objekts - der LDAP-Provider und der DN der Gruppe Atl-Users group. Da keine Umbenennung durchgeführt werden soll, ist der zweite Parameter die Konstante vbNullString.

Script 5.26: Verschieben einer Gruppe innerhalb der gleichen Domäne



1

2

3

4

Set objOU = GetObject("LDAP://cn=Users,dc=NA,dc=fabrikam,dc=com")


objOU.MoveHere "LDAP://cn=Atl-Users,ou=HR,dc=NA,dc=fabrikam,dc=com", _

vbNullString

Verschieben einer OU von einer Domäne in eine andere

Script 5.27 verschiebt die OU Management aus der Domäne fabrikam.com in die Domäne na.fabrikam.com.

  1. Das Script baut eine Bindung an die Domäne na.fabrikam.com auf.
    Diese Bindung dient als Ziel für die Verschiebeoperation.
  2. Es verschiebt die OU in die Domäne na.fabrikam.com.

Script 5.27: Verschieben einer OU über eine Domänengrenze hinweg



1

2

3

4

Set objDomain = GetObject("LDAP://dc=NA,dc=fabrikam,dc=com")


objDomain.MoveHere "LDAP://ou=Management,dc=fabrikam,dc=com", _

vbNullString

Auch wenn Script 5.27 nützlich sein könnte, so ist es in dieser Form unsinnig. Das Verschieben zwischen Domänen ist nur für leere Containerobjekte möglich. Daher muss die OU geleert werden, bevor sie verschoben wird.

Wir können die folgenden wichtigen Erkenntnisse aus den Scripten dieses Abschnitts ziehen:

  • Sie führen alle die gleichen grundlegenden Schritte durch: eine Bindung an den Zielcontainer aufbauen und die Methode MoveHere ausführen, um das Objekt zu verschieben oder umzubenennen.
  • Sie verwenden alle die gleiche Methode (MoveHere) - egal um welchen Objekttyp es sich handelt.

Suchen

Unter VBScript steht Ihnen als Abfragetechnologie ADO (ActiveX® Data Objects) zur Verfügung. ADO verwendet den ADSI OLE DB-Provider, um Informationen ausActive Directory zu lesen. OLE DB ist eine Schnittstellensammlung, die einen Zugriff auf viele unterschiedliche Datenbanken - inklusive Active Directory - ermöglicht. Die Informationen, die von ADO über den ADSI-OLE DB-Provider zurückgegeben werden, können nur gelesen werden - das Schreiben ist nicht möglich. Trotzdem können Sie natürlich mit den Informationen, die Sie über ADO erhalten, weitere ADSI-Methoden zur Änderung von Active Directory-Daten verwenden.

An einer Abfrage sind normalerweise drei ADO-Objekte beteiligt:

  • Connection - Dieses Objekt stellt über den ADSI-OLE DB-Provider eine Verbindung zwischen dem ADSI-Script und Active Directory zur Verfügung.
  • Command - Dieses Objekt ermöglicht es dem Script eine Abfrage gegen Active Directory durchzuführen.
  • RecordSet - Dieses Objekt nimmt die Abfrageergebnisse vom Command-Objekt entgegen.

Suchen in Active Directory

Das Ziel einer Suche ist die Rückgabe eine Ergebnissatzes mit keinem oder mehreren Einträgen. Auch ein Ergebnissatz ohne Einträge kann nützlich sein - er zeigt Ihnen, dass ein Objekt nicht vorhanden ist.

Das Suchen nach Active Directory-Objekten umfasst die folgenden Schritte:

  1. Erstellen eines ADO-Connection-Objekts und die Verwendung der Methode Open dieses Objekts, um über den ADSI-OLE DB-Provider auf Active Directory zuzugreifen.
  2. Erstellen eines ADO-Command-Objekts und zuweisen der Eigenschaft ActiveConnection des Objekts zum Connection-Objekt.
    Dieser Schritt ist notwendig, da das Command-Objekt sowohl die Verbindung als auch den Abfragestring enthält.
  3. Zuweisen einer Suchanfrage (Abfragestring) zur Eigenschaft CommandText des Command-Objekts.
    Sie können entweder eine SQL-Syntax oder einen LDAP-Dialekt verwenden. Alle Beispiel in diesem Kapitel verwenden den LDAP-Dialekt. Weitere Informationen über die SQL-Syntax finden Sie unter dem Link Active Directory Programmer's Guide unter https://www.microsoft.com/windows/reskits/webresources (englischsprachig).
  4. Ausführen der Methode Execute des Command-Objekts, um die Abfrage auszuführen und die Ergebnisse in einem RecordSet-Objekt zu speichern.
  5. Verwenden der Eigenschaften des RecordSet-Objekts, um Informationen aus dem Ergebnissatz zu lesen.
  6. Verwenden der Methode Close des Connection-Objekts, um die Verbindung wieder zu schließen.
    Dieser letzte Schritt ist optional - Sie sollten ihn allerdings auf jeden Fall durchführen. Bei größeren Scripten sparen Sie so Ressourcen.

Ziel der Scripte in diesem Abschnitt ist es, Ihnen zu zeigen, wie Active Directory-Suchen über ADO und den ADSI-OLE DB-Provider durchgeführt werden. Die oben beschrieben Schritte werden von allen Scripten durchgeführt.

Erstellen eines einfachen Suchscripts

Script 5.28 gibt als Ergebnissatz die Namen aller Objekte in der Domäne na.fabrikam.com zurück.

Hierzu führt das Script die folgenden Schritte aus:

  1. Erstellen eines ADO-Connection-Objekts und die Verwendung der Methode Open dieses Objekts, um über den ADSI-OLE DB-Provider auf Active Directory zuzugreifen.
  2. Erstellen eines ADO-Command-Objekts und zuweisen der Eigenschaft ActiveConnection des Objekts zum Connection-Objekt.
    Dieser Schritt ist notwendig, da das Command-Objekt sowohl die Verbindung als auch den Abfragestring enthält.
  3. Zuweisen einer Suchanfrage (Abfragestring) zur Eigenschaft CommandText des Command-Objekts.
    Sie können entweder eine SQL-Syntax oder einen LDAP-Dialekt verwenden. Alle Beispiele in diesem Kapitel verwenden den LDAP-Dialekt. Weitere Informationen über die SQL-Syntax finden Sie unter dem Link Active Directory Programmer's Guide unter https://www.microsoft.com/windows/reskits/webresources (englischsprachig).
  4. Ausführen der Methode Execute des Command-Objekts, um die Abfrage auszuführen und die Ergebnisse in einem RecordSet-Objekt zu speichern.
  5. Verwenden der Eigenschaften des RecordSet-Objekts, um Informationen aus dem Ergebnissatz zu lesen.
  6. Verwenden der Methode Close des Connection-Objekts, um die Verbindung wieder zu schließen.
    Dieser letzte Schritt ist optional - Sie sollten ihn allerdings auf jeden Fall durchführen. Bei größeren Scripten sparen Sie so Ressourcen.
  7. Erstellen eines ADO-Connection-Objekts und die Verwendung der Methode Open dieses Objekts, um über den ADSI-OLE DB-Provider auf Active Directory zuzugreifen.
    In Zeile 1 wird ein Connection-Objekt erstellt. In Zeile 2 wird das Connection-Objekt über den ADSI-OLE DB-Provider geöffnet (der Name - beziehungsweise die ProgID - des ADSI-OLE DB-Providers lautet ADsDSOObject).
  8. Erstellen eines ADO-Command-Objekts und Zuweisen der Eigenschaft ActiveConnection zum Connection-Objekt (Zeilen 4 und 5).
  9. Zuweisen des Abfragestrings zur Eigenschaft CommandText des Command-Objekts.
    Zeile 7 und 8 definiert die Suchbasis, das zurückzugebende Attribut und den Suchbereich.
    • Die Suchbasis - in eckigen Klammern ( ) eingeschlossen - definiert den Startpunkt der Suche. In diesem Fall ist dies der ADsPfad der Domäne na.fabrikam.com.

    • Das zurückzugebende Attribut - direkt nach dem doppelten Semikolon - definiert den lDAPDisplayName der Attribute, die die Abfrage zurückgeben soll. In diesem Fall ist nur ein Attribut (name) angegeben.Wenn Sie mehrere Attribute angeben, trennen Sie diese mit Kommata.

    • Der Suchbereich - am Ende des Abfragestrings - definiert, wo die Abfrage durchgeführt wird. Mit dem Wert subtree wird eine Suche in der gesamten Hierarchie durchgeführt.

  10. Ausführen der Abfrage über die Methode Execute des Command-Objekts und Zuweisen des Rückgabewerts an das RecordSet-Objekt (Zeile 9).
    Der Abfragestring gibt Einträge mit einem einzelnen Feld (dem Feld name) zurück.
  11. Verwenden einer While-Wend-Schleife, um alle Elemente des Objekts objRecordSet anzuzeigen. Um jeweils zum nächsten Element des RecordSet-Objekts zu gelangen, wird die Methode MoveNext verwendet.
  12. Schließen des Connection-Objekts.

Script 5.28: Suchen nach den Namen aller Objekt in der Domäne



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

Set objConnection = CreateObject("ADODB.Connection")

objConnection.Open "Provider=ADsDSOObject;"


Set objCommand = CreateObject("ADODB.Command")

objCommand.ActiveConnection = objConnection


objCommand.CommandText = _

"<LDAP://dc=NA,dc=fabrikam,dc=com>;;name;subtree"

Set objRecordSet = objCommand.Execute


While Not objRecordSet.EOF

Wscript.Echo objRecordSet.Fields("name")

objRecordSet.MoveNext

Wend


objConnection.Close

Wenn Sie das Script in der Domäne na.fabrikam.com ausführen, gibt es die Namen aller Objekte der Domäne aus. Die Ausgabe sollte also ungefähr so aussehen:

na
Builtin
Administrators
Users
...
S-1-5-11
Program Data
Microsoft

Die vom Script zurück gelieferten Informationen sind jedoch aus den folgenden Gründen nur von eingeschränktem Nutzen.

  • Es werden die Namen aller Objekte in der Domäne na.fabrikam.com zurückgegeben.
  • Es wird nicht deutlich, wo in der Domäne sich die einzelnen Objekte befinden.
  • Es wird nicht deutlich, was für einen Typ die einzelnen Objekte haben.
  • Der Ergebnissatz ist zu groß oder zu klein - je nach Ihren Anforderungen.

Damit die Ergebnisse brauchbarer werden, können Sie das Script folgendermaßen ändern:

  • Sie ändern den Abfragestring - Über den Abfragestring können Sie die zurückzugebenden Attribute und die Suchbasis angeben. Außerdem können Sie Filter definieren und den Suchbereich festlegen.
  • Sie geben zusätzliche Suchoptionen über das Command-Objekt an - Über das Command-Objekt können Sie viele weitere Aspekte der Suche kontrollieren - zum Beispiel die Sortierung, die Menge der zurückgegebenen Ergebnisse oder die maximale Dauer der Suche.
Dn151181.note(de-de,TechNet.10).gifAnmerkung:

Eine komplette Liste der Suchoptionen und der anderen Eigenschaften von ADO finden Sie unter dem Link Active Directory Programmer's Guide unter https://www.microsoft.com/windows/reskits/webresources.

Zurückgeben mehrerer Attribute über die Suche

Script 5.28 hat nur einen einzelnen Wert zurückgegeben - das Attribut name. Mit weiteren Attributen wird das Ergebnis wahrscheinlich aussagekräftiger. Wenn Sie zum Beispiel das Attribut distinguishedName mit anzeigen, dann können Sie feststellen, wo sich das Objekt in Active Directory befindet.

Script 5.29 gibt einen Ergebnissatz zurück, in dem die Attribute name und distinguishedName aller Objekte der Domäne na.fabrikam.com enthalten sind. Das Script arbeitet bis auf die folgenden zwei Änderungen genauso wie das vorhergehende Script:

  • Das Attribut distinguishedName wurde in den Abfragestring aufgenommen (Zeile 8).
  • Der Wert des Attributs distinguishedName wird in der Kommandozeile ausgegeben (Zeilen 14 und 15).

Script 5.29: Suchen nach den Namen und DNs aller Objekte eine Domäne



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

Set objConnection = CreateObject("ADODB.Connection")

objConnection.Open "Provider=ADsDSOObject;"


Set objCommand = CreateObject("ADODB.Command")

objCommand.ActiveConnection = objConnection


objCommand.CommandText = _

"<LDAP://dc=NA,dc=fabrikam,dc=com>;;distinguishedName,name;subtree"


Set objRecordSet = objCommand.Execute


While Not objRecordSet.EOF

Wscript.Echo objRecordSet.Fields("Name")

Wscript.Echo "[" & _

objRecordSet.Fields("distinguishedName") & "]"

objRecordSet.MoveNext

Wend


objConnection.Close

Wenn Sie das Script in der Domäne na.fabrikam.com ausführen, dann gibt es die Namen und den DN aller Objekte in der Domäne aus. Die Ausgabe sollte ungefähr so aussehen:

na
[dc=NA,DC=fabrikam,DC=com]
Builtin
[CN=Builtin,dc=NA,DC=fabrikam,DC=com]
Administrators
[CN=Administrators,CN=Builtin,dc=NA,DC=fabrikam,DC=com]
Users
[CN=Users,CN=Builtin,dc=NA,DC=fabrikam,DC=com]
...
S-1-5-11
[CN=S-1-5-11,CN=ForeignSecurityPrincipals,dc=NA,DC=fabrikam,DC=com]
Program Data
[CN=Program Data,dc=NA,DC=fabrikam,DC=com]
Microsoft
[CN=Microsoft,CN=Program Data,dc=NA,DC=fabrikam,DC=com]

Die Suche auf einen bestimmten Objekttyp einschränken

Wenn Sie die Suche einschränken möchten, dann sollten Sie die Attribute objectClass oder objectCategory verwenden.

Jedes Active Directory-Objekt verfügt über ein Einzelwert-Attribut mit dem Namen objectCategory. In diesem Attribut ist der DN der Klasse hinterlegt, von der das Objekt abgeleitet wurde. Das Attribut objectCategory einer Gruppe hat zum Beispiel den Wert cn=Group,cn=Schema,cn=Configuration,dc=fabrikam,dc=com. Um mit dem Ergebnissatz nur Gruppenobjekte zurückzuerhalten, geben Sie die Filterbedingung (objectCategory=Group) im Filter-Teil des Suchstrings mit an.

Außerdem verfügt jedes Active Directory-Objekt über ein Multiwert-Attribut mit dem Namen objectClass. Dieses Attribut enthält eine sortierte Liste der gesamten Klassenhierarchie, von der das Active Directory-Objekt abgeleitet wurde. Um zum Beispiel die Abfrage auf Computer- und Benutzerobjekte einzuschränken, können Sie den Filter objectClass=user verwenden. Warum auch Computerobjekte? In der Active Directory-Hierarchie ist die Klasse Computer eine Unterklasse der Klasse user.

Da das Attribut objectCategory nur ein Einzelwert-Attribut ist, ist es besser für Suchanfragen geeignet. Wenn möglich, sollten Sie also dieses Attribut verwenden.

Dn151181.note(de-de,TechNet.10).gifAnmerkung:

Informationen zu Active Directory-Klassen finden Sie im Abschnitt Die Active Directory-Architektur weiter unten in diesem Kapitel.

Script 5.30 demonstriert, wie Sie einen Ergebnissatz auf eine bestimmte Kategorie (Computer) einschränken können. Das Script gibt die Attribute name und distinguishedName aller Computerobjekte der Domäne na.fabrikam.com zurück. Das Script arbeitet genau wie die beiden vorherigen Scripte. Als einzige Änderung wurde der Filter objectCategory=computer zum Abfragestring hinzugefügt.

Script 5.30: Suchen nach den Namen und den DNs aller Computerobjekt in der Domäne



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

Set objConnection = CreateObject("ADODB.Connection")

objConnection.Open "Provider=ADsDSOObject;"


Set objCommand = CreateObject("ADODB.Command")

objCommand.ActiveConnection = objConnection


objCommand.CommandText = _

"<LDAP://dc=NA,dc=fabrikam,dc=com>;(objectCategory=computer)" & _

";distinguishedName,name;subtree"


Set objRecordSet = objCommand.Execute


While Not objRecordSet.EOF

Wscript.Echo objRecordSet.Fields("Name")

Wscript.Echo "[" & _

objRecordSet.Fields("distinguishedName") & "]"

objRecordSet.MoveNext

Wend


objConnection.Close

Wenn Sie das Script in der Domäne na.fabrikam.com ausführen, gibt es die Namen und die DNs aller Computerobjekte in der Kommandozeile aus. Diese Ausgabe sieht ungefähr so aus:

SEA-DC-02
[CN=SEA-DC-02,OU=Domain Controllers,dc=NA,DC=fabrikam,DC=com]
SEA-DC-03
[CN=SEA-DC-02,OU=Domain Controllers,dc=NA,DC=fabrikam,DC=com]
...
SEA-PM-01
[CN=SEA-PM-01,cn=Computers,dc=NA,DC=fabrikam,DC=com]
SEA-SQL-01
[CN=SEA-SQL-01,cn=Computers,dc=NA,DC=fabrikam,DC=com]

Filter können auch kombiniert werden - außerdem werden Wildcards unterstützt. Weitere Informationen finden Sie unter dem Link Active Directory Programmer's Guide unter https://www.microsoft.com/windows/reskits/webresources. Suchen Sie hier nach dem Text "Search Filter Syntax."

Angeben des globalen Katalog-Servers in der Suchbasis

Nehmen wir einmal an, Sie möchten die Namen und die DNs aller Computer der Gesamtstruktur abfragen. Hierzu können Sie den globalen Katalog-Server der Stammdomäne abfragen - dieser speichert unter anderem die beiden gesuchten Attribute. Ein globaler Katalog-Server speichert Teile der Informationen aus allen Domänen. Um den globalen Katalog-Server abzufragen, ändern Sie den LDAP-Moniker in der Suchbasis auf GC und ändern Sie den DN auf den der Stammdomäne. Sie ändern also den ADsPfad von

<LDAP://dc=NA,dc=fabrikam,dc=com>

auf

<GC://dc=fabrikam,dc=com>

Script 5.31 demonstriert diesen Vorgang. Es arbeitet genau wie die vorherigen Scripte - nur der Suchstring wurde geändert (Zeile 8).

Script 5.31: Suchen nach den Namen und DNs aller Computerobjekte in der Gesamtstruktur



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

Set objConnection = CreateObject("ADODB.Connection")

objConnection.Open "Provider=ADsDSOObject;"


Set objCommand = CreateObject("ADODB.Command")

objCommand.ActiveConnection = objConnection


objCommand.CommandText = _

"<GC://dc=fabrikam,dc=com>;(objectCategory=computer)" & _

";distinguishedName,name;subtree"


Set objRecordSet = objCommand.Execute


While Not objRecordSet.EOF

Wscript.Echo objRecordSet.Fields("Name")

Wscript.Echo "[" & _

objRecordSet.Fields("distinguishedName") & "]"

objRecordSet.MoveNext

Wend


objConnection.Close

Wenn Sie das Script in der Stammdomäne fabrikam.com ausführen, gibt es die Namen und die DNs aller Computerobjekte der Gesamtstruktur aus. Diese Ausgabe sieht ungefähr so aus:

SEA-DC-01
[CN=SEA-DC-01,OU=Domain Controllers,DC=fabrikam,DC=com]
SEA-DC-04
[CN=SEA-DC-04,OU=Domain Controllers,DC=fabrikam,DC=com]
SEA-DC-02
[CN=SEA-DC-02,OU=Domain Controllers,dc=NA,DC=fabrikam,DC=com]
SEA-DC-03
[CN=SEA-DC-03,OU=Domain Controllers,dc=NA,DC=fabrikam,DC=com]
...
SEA-PM-01
[CN=SEA-PM-01,cn=Computers,dc=NA,DC=fabrikam,DC=com]
SEA-SQL-01
[CN=SEA-SQL-01,cn=Computers,dc=NA,DC=fabrikam,DC=com]

Den Ergebnissatz über die Nachverfolgung erweitern

Wenn ein Domänencontroller einer übergeordneten Domäne (zum Beispiel der Stammdomäne) einen Ergebnissatz zusammenstellt, dann gibt er eine Liste der untergeordneten Domänen an den Clientcomputer, der das Script ausführt. Der Clientcomputer kontaktiert dann jede der untergeordneten Domänen, so dass diese den Ergebnissatz vervollständigen können. Dieser Prozess heißt Nachverfolgung.

Die Nachverfolgung erhöht den Netzwerkverkehr und die Last auf den Domänencontrollern. Und zwar deshalb, weil ja nicht nur der globale Katalog-Server, sondern auch die Domänencontroller abgefragt werden.

Sie können die Nachverfolgung explizit aktivieren, indem Sie die Eigenschaft Chase Referrals auf den Wert &h20 setzen - Script 5.32 demonstriert dies. Es arbeitet (abgesehen von vier kleinen Änderungen) genau so wie die vorhergehenden Scripte dieses Abschnitts.

Bei den Änderungen handelt es sich um die folgenden:

  • Die Konstante ADS_CHASE_REFERRALS_SUBORDINATE wird mit dem Wert &h20 definiert (Zeile 1).
  • Die Nachverfolgung wird aktiviert, indem die Eigenschaft Chase Referrals des Command-Objekts auf den Wert der Konstante ADS_CHASE_REFERRALS_SUBORDINATE gesetzt wird (Zeilen 8 und 9).
  • Das Attribut isCriticalSystemObject wird mit in den Abfragestring aufgenommen. Dieses Attribut wird nicht im globalen Katalog-Server gespeichert und muss daher über die Nachverfolgung von den untergeordneten Domänen abgefragt werden (Zeile 13).
  • Der Wert des Attributs isCriticalSystemObject wird zusätzlich ausgegeben (Zeilen 19 und 20).

Script 5.32: Verwenden der Nachverfolgung bei einer Suche



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

ADS_CHASE_REFERRALS_SUBORDINATE = &h20

Set objConnection = CreateObject("ADODB.Connection")

objConnection.Open "Provider=ADsDSOObject;"


Set objCommand = CreateObject("ADODB.Command")

objCommand.ActiveConnection = objConnection


objCommand.Properties("Chase Referrals") = _

ADS_CHASE_REFERRALS_SUBORDINATE


objCommand.CommandText = _

"<LDAP://dc=fabrikam,dc=com>;(objectCategory=computer);" & _

"distinguishedName,name,isCriticalSystemObject;subtree"


Set objRecordSet = objCommand.Execute


While Not objRecordSet.EOF

Wscript.Echo objRecordSet.Fields("Name")

Wscript.Echo "isCriticalSystemObject: " & _

objRecordSet.Fields("isCriticalSystemObject")

Wscript.Echo "[" & _

objRecordSet.Fields("distinguishedName") & "]"

objRecordSet.MoveNext

Wend


objConnection.Close

Wenn Sie das Script in der Stammdomäne (fabrikam.com) ausführen, gibt es die Namen, den DN und den Boolean-Wert von isCriticalSystemObject jedes Computerobjekts in der Gesamtstruktur aus. Die Ausgabe könnte zum Beispiel so aussehen:

SEA-DC-01
isCriticalSystemObject: True
[CN=SEA-DC-01,OU=Domain Controllers,DC=fabrikam,DC=com]
SEA-DC-04
isCriticalSystemObject: True
[CN=SEA-DC-04,OU=Domain Controllers,DC=fabrikam,DC=com]
SEA-DC-02
isCriticalSystemObject: True
[CN=SEA-DC-02,OU=Domain Controllers,dc=NA,DC=fabrikam,DC=com]
SEA-DC-03
isCriticalSystemObject: True
[CN=SEA-DC-03,OU=Domain Controllers,dc=NA,DC=fabrikam,DC=com]
...
SEA-PM-01
isCriticalSystemObject: False
[CN=SEA-PM-01,cn=Computers,dc=NA,DC=fabrikam,DC=com]
SEA-SQL-01
isCriticalSystemObject: False
[CN=SEA-SQL-01,cn=Computers,dc=NA,DC=fabrikam,DC=com]

Den Suchbereich definieren

Stellen Sie sich vor, Sie möchten nur die Computer im Container Computers einer bestimmten Domäne abfragen. Nehmen wir außerdem einmal an, der Container enthält noch weitere Untercontainer. Um eine Suche so einzuschränken, können Sie den DN im ADsPfad (die Suchbasis) folgendermaßen ändern:

cn=Computers,dc=NA,dc=fabrikam,dc=com

Ein möglicher Abfragestring könnte zum Beispiel so aussehen:

"<GC://cn=Computers,dc=NA,dc=fabrikam,dc=com>" & _
    ";(objectCategory=computer)" & _
        ";distinguishedName,name;subtree"

Mit diesem Abfragestring werden die Attribute DN und name aller Computerobjekte im Container Computers der Domäne na.fabrikam.com abgefragt. Da der Abfragestring mit dem Wert subtree endet (der Suchbereich), werden auch die untergeordneten Container durchsucht.

Die möglichen Werte für den letzten Teil des Abfragestrings (den Suchbereich) sind:

  • Base - Sucht nur an der durch den DN definierten Stelle.
  • Onelevel - Sucht auch in allen unmittelbaren Untercontainern.
  • Subtree - Sucht in den unmittelbaren Untercontainern und in allen weiteren Untercontainern. Wenn Sie den Bereich nicht angeben, wird dieser Wert standardmäßig verwendet.

Script 5.33 demonstriert eine Suche ausschließlich im durch den DN angegebenen Container. Um die Suche auf die gewünschten Objekte einzuschränken, geht das Script folgendermaßen vor:

  1. Es gibt den Container Computers der Domäne na.fabrikam.com als Suchbasis an.
  2. Es gibt als Suchbereich onelevel an.

Script 5.33: Einschränken der Suche durch den Bereich



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

Set objConnection = CreateObject("ADODB.Connection")

objConnection.Open "Provider=ADsDSOObject;"


Set objCommand = CreateObject("ADODB.Command")

objCommand.ActiveConnection = objConnection


objCommand.CommandText = _

"<GC://cn=Computers,dc=NA,dc=fabrikam,dc=com>" & _

";(objectCategory=computer)" & _

";distinguishedName,name;onelevel"


Set objRecordSet = objCommand.Execute


While Not objRecordSet.EOF

Wscript.Echo objRecordSet.Fields("Name")

Wscript.Echo "[" & _

objRecordSet.Fields("distinguishedName") & "]"

objRecordSet.MoveNext

Wend


objConnection.Close

Wenn Sie das Script in der Domäne na.fabrikam.com ausführen, gibt es die Attribute DN und name aller Computerobjekte im Container Computers der Domäne aus. Die Ausgabe könnte zum Beispiel so aussehen:

SEA-PM-01
[CN=SEA-PM-01,cn=Computers,dc=NA,DC=fabrikam,DC=com]
SEA-SQL-01
[CN=SEA-SQL-01,cn=Computers,dc=NA,DC=fabrikam,DC=com]
...

Die Ergebnisse der Suche sortieren

Eine Sortierung können Sie über die Eigenschaft Sort On des Command-Objekts durchführen. Die Sortierung wird dann bereits auf dem Server ausgeführt - und zwar bevor er die Daten an den Clientcomputer zurückgibt, der das Script ausführt.

Der Eigenschaft Sort On weisen Sie den lDAPDisplayName eines Attributs zu. Nach diesem Attribut wird die Sortierung vorgenommen.

Dn151181.note(de-de,TechNet.10).gifAnmerkung:

Eine Sortierung nach einem Attribut, dass einen DN speichert ist, nicht möglich. Wenn Sie dies versuchen, erhalten Sie einen leeren Ergebnissatz.

Script 5.34 demonstriert die Sortierung des Ergebnissatzes. Es fragt die Attribute name, distinguishedName und whenCreated aller Computerobjekte der Gesamtstruktur ab und sortiert die Ergebnisliste nach dem Attribut whenCreated.

Die folgenden Änderungen wurden gegenüber den bisherigen Scripten dieses Abschnitts vorgenommen:

  • Der Eigenschaft Sort On wird der Wert whenCreated zugewiesen (Zeile 7).
  • Das Attribute whenCreated wird mit in den Abfragestring aufgenommen (Zeile 11).
    Beachten Sie, dass das Script den Moniker GC verwendet. Dies funktioniert nur deshalb, weil die abgefragten drei Attribute alle vom globalen Katalog-Server gespeichert werden.

Script 5.34: Sortieren der Computerobjekte nach dem Erstellungsdatum



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

Set objConnection = CreateObject("ADODB.Connection")

objConnection.Open "Provider=ADsDSOObject;"


Set objCommand = CreateObject("ADODB.Command")

objCommand.ActiveConnection = objConnection


objCommand.Properties("Sort On") = "whenCreated"


objCommand.CommandText = _

"<GC://dc=fabrikam,dc=com>;(objectCategory=Computer);" & _

"distinguishedName,name,whenCreated;subtree"


Set objRecordSet = objCommand.Execute


While Not objRecordSet.EOF

Wscript.Echo objRecordSet.Fields("Name")

Wscript.Echo "[" & _

objRecordSet.Fields("distinguishedName") & "]"

Wscript.Echo objRecordSet.Fields("whenCreated") & VbCrLf

objRecordSet.MoveNext

Wend


objConnection.Close

Wenn das Script in der Domäne na.fabrikam.com ausgeführt wird, dann gibt es die Attribute name, DN und whenCreated aller Computerobjekte der Domäne aus. Der Ergebnissatz ist nach dem Attribut whenCreated sortiert (vom ältesten bis zum jüngsten). Die Ausgabe könnte folgendermaßen aussehen:

SEA-DC-01
[CN=SEA-DC-01,OU=Domain Controllers,DC=fabrikam,DC=com]
8/14/2002 9:59:12 AM

SEA-DC-02
[CN=SEA-DC-02,OU=Domain Controllers,dc=NA,DC=fabrikam,DC=com]
8/21/2002 1:53:24 PM

SEA-DC-03
[CN=SEA-DC-03,OU=Domain Controllers,dc=NA,DC=fabrikam,DC=com]
8/27/2002 9:53:24 AM

SEA-PM-01
[CN=SEA-PM-01,cn=Computers,dc=NA,DC=fabrikam,DC=com]
8/27/2002 11:53:24 AM

...

SEA-SQL-01
[CN=SEA-SQL-01,cn=Computers,dc=NA,DC=fabrikam,DC=com]
8/27/2002 4:06:30 PM

SEA-DC-04
[CN=SEA-DC-04,OU=Domain Controllers,DC=fabrikam,DC=com]
9/03/2002 2:00:03 PM

Multiwert-Attribute über eine Suche abfragen

Einige Active Directory-Objekte stellen Multiwert-Attribute zur Verfügung. Auch diese Attribute können Sie über den Ergebnissatz zurückgeben lassen (zum Beispiel das Attribut member eines Gruppenobjekts).

Script 5.35 gibt einen solchen Ergebnissatz zurück. Es fragt die Einzelwert-Attribute name und distinguishedName und das Multiwert-Attribut member aller Gruppen in der Domäne na.fabrikam.com ab. Hierzu wurden die folgenden Änderungen an dem vorherigen Scripten vorgenommen:

  1. Im Abfragestring wird die Ergebnismenge über den Filter objectCategory=Group auf Gruppenobjekte eingeschränkt. Außerdem wird das Multiwert-Attribut member mit aufgenommen (Zeile 9).
    Da in diesem Script die Domäne na.fabrikam.com und der Moniker GC verwendet wird, muss sich in der Domäne auch ein globaler Katalog-Server befinden. Wenn es keinen globalen Katalog-Server gibt, dann müssen Sie den Moniker LDAP verwenden.
  2. Es wird eine Variable mit dem Namen arrMembers mit den Inhalten des Attributs member initialisiert (diese stammen aus der Eigenschaft fields des RecordSet-Objekts (Zeile 19).
  3. Mit der VBScript-Funktion IsArray wird geprüft, ob das Attribut member ein Array ist (Zeile 22).
    Wenn das Ergebnis dieser Prüfung False ist, dann ist das Attribut leer.
  • Wenn der Rückgabewert von IsArray den Wert True hat, dann wird eine For-Each-Schleife verwendet, um die Mitglieder der Gruppe auszugeben (Zeilen 23-25).
  • Wenn der Rückgabewert von IsArrayFalse ist, dann wird das Wort Keine ausgegeben (Zeile 27).

Script 5.35: Suchen nach dem Namen und DNs aller Objekte der Domäne



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

Set objConnection = CreateObject("ADODB.Connection")

objConnection.Open "Provider=ADsDSOObject;"


Set objCommand = CreateObject("ADODB.Command")

objCommand.ActiveConnection = objConnection


objCommand.CommandText = _

"<GC://dc=NA,dc=fabrikam,dc=com>;(objectCategory=Group);" & _

"distinguishedName,name,member;subtree"


Set objRecordSet = objCommand.Execute


While Not objRecordSet.EOF

Wscript.Echo objRecordSet.Fields("Name")

Wscript.Echo "[" & _

objRecordSet.Fields("distinguishedName") & "]"

Wscript.Echo "Group Member(s):"

arrMembers = objRecordSet.Fields("member")

If IsArray(objRecordSet.Fields("member")) Then

For Each strMember in arrMembers

Wscript.Echo vbTab & strMember

Next

Else

Wscript.Echo vbTab & "Keine"

End If

Wscript.Echo VbCrLf

objRecordSet.MoveNext

Wend


objConnection.Close

Wenn Sie das Script in der Domäne na.fabrikam.com ausführen, gibt es den Namen, den DN und die Mitglieder aller Gruppenobjekte der Domäne aus:

Administrators
[CN=Administrators,CN=Builtin,DC=na,DC=fabrikam,DC=com]
Group Member(s):
   CN=Enterprise Admins,CN=Users,DC=fabrikam,DC=com
   CN=Domain Admins,CN=Users,DC=na,DC=fabrikam,DC=com
   CN=Administrator,CN=Users,DC=na,DC=fabrikam,DC=com

Users
[CN=Users,CN=Builtin,DC=na,DC=fabrikam,DC=com]
Group Member(s):
   CN=Domain Users,CN=Users,DC=na,DC=fabrikam,DC=com
   CN=S-1-5-11,CN=ForeignSecurityPrincipals,DC=na,DC=fabrikam,DC=com
   CN=S-1-5-4,CN=ForeignSecurityPrincipals,DC=na,DC=fabrikam,DC=com

...

Pre-Windows 2000 Compatible Access
[CN=Pre-Windows 2000 Compatible Access,CN=Builtin,DC=na,DC=fabrikam,DC=com]
Group Member(s):
   None

Atl-Users
[CN=Atl-Users,CN=Users,DC=na,DC=fabrikam,DC=com]
Group Member(s):
   CN=LewJudy,OU=Sales,DC=na,DC=fabrikam,DC=com
   CN=HuffArlene,OU=HR,DC=na,DC=fabrikam,DC=com
   CN=MyerKen,OU=HR,DC=na,DC=fabrikam,DC=com

Teile von Multiwert-Attributen über die Eigenschaft Range abfragen

Wenn ein Multiwert-Attribut viele Einträge hat, dann können Sie über die Eigenschaft Range nur Teile dieser Einträge abfragen. Die Last auf dem abgefragten Domänencontroller wird so geringer - daher wird auch die Abfrage schneller. Wenn ein Multiwert-Attribut mehr als 1.000 Einträge hat, dann müssen Sie die Abfrage auf Teile der Einträge beschränken. Ansonsten kann es sein, dass die Abfrage nicht korrekt durchgeführt wird.

Script 5.36 gibt einen Ergebnissatz mit den ersten 1.000 Einträgen des Multiwert-Attributs member der Gruppe Atl-Users in der Domäne na.fabrikam.com zurück.

Dn151181.note(de-de,TechNet.10).gifAnmerkung:

Wenn es weniger als 1.000 Mitglieder in der Gruppe gibt, schlägt das Script fehl. Es muss bei jeder Abfrage mehr Einträge geben, als in der Eigenschaft Range definiert sind (in diesem Fall 999).

Um die Anzahl der Einträge einzugrenzen, geht das Script folgendermaßen vor:

  1. Das Schlüsselwort Range wurde mit in den Abfragestring aufgenommen (Zeile 9). Mit dem Wert 0-999 werden die ersten 1.000 Einträge des Attributs member der Gruppe zurückgegeben.
  2. Es gibt den Text "Die ersten 1000 Mitglieder:" aus (Zeile 13).
  3. Es initialisiert eine Variable mit den Namen arrMembers mit den Inhalten des Attributs member über die Eigenschaft fields des RecordSet-Objekts.
    Auch für die Eigenschaft Fields muss der Wert Range angegeben werden - und zwar exakt so, wie sie im Abfragestring angegeben wurde.

Script 5.36: Einschränken der Einträge in Multiwert-Attributen über die Eigenschaft Range



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

Set objConnection = CreateObject("ADODB.Connection")

objConnection.Open "Provider=ADsDSOObject;"


Set objCommand = CreateObject("ADODB.Command")

objCommand.ActiveConnection = objConnection


objCommand.CommandText = _

"<LDAP://cn=Atl-Users,cn=Users,dc=NA,dc=fabrikam,dc=com>;;" & _

"member;Range=0-999;base"


Set objRecordSet = objCommand.Execute


Wscript.Echo "First 1000 Member(s):"

arrMembers = objRecordSet.Fields("member;Range=0-999")

For Each strMember in arrMembers

Wscript.Echo vbTab & strMember

Next


objConnection.Close

Wenn Sie das Script in der Domäne na.fabrikam.com ausführen, gibt es die ersten 1.000 Mitglieder der Gruppe Atl-Users aus:

First 1000 Member(s):
        CN=UserNo988,CN=Users,DC=na,DC=fabrikam,DC=com
        CN=UserNo987,CN=Users,DC=na,DC=fabrikam,DC=com
        CN=UserNo986,CN=Users,DC=na,DC=fabrikam,DC=com
              ...
        CN=HuffArlene,OU=HR,DC=na,DC=fabrikam,DC=com
        CN=MyerKen,OU=HR,DC=na,DC=fabrikam,DC=com

Aus den Scripten in diesem Abschnitt können wir die folgenden wichtigen Erkenntnisse gewinnen:

  • Sie führen alle die gleichen grundlegenden Schritte aus:
    1. Erstellen eines ADO-Connection-Objekts unter Verwendung des ADSI-OLE DB-Providers.
    2. Erstellen eines ADO-Command-Objekts und Verbinden dieses Objekts mit dem Connection-Objekt.
    3. Verwenden des Command-Objekts, um einen Abfragestring zu erstellen.
    4. Erstellen eines RecordSet-Objekts, um die Abfrage auszuführen und den Ergebnissatz zu speichern.
    5. Verwenden des RecordSet-Objekts, um die Elemente des RecordSet auszulesen.
    6. Schließen des Connection-Objekts.
  • Mit Ausnahme von Script 5.36 werden die Einträge des RecordSet-Objekts in einer While-Wend-Schleife ausgegeben. In Script 5.36 ist dieser Schritt nicht notwendig, da es nur einen einzelnen Eintrag zurückgibt.
  • Das Zurückgeben eines Ergebnissatzes ist der grundlegende Zweck der Suche. Andere Aufgaben, die Sie über eine Suche durchführen können, finden Sie im Abschnitt Administrative Aufgaben über einen Ergebnissatz durchführen weiter unten in diesem Kapitel.

Optimieren der Suchleistung

Um eine Suche optimieren zu können, sind Kenntnisse über Active Directory notwendig. Auch von der Verwendung der Objekte in Ihrem Script wird die Suchleistung beeinflusst.

Konsolidierung von Abfragestrings

Wenn Sie ein Script schreiben, in dem viele Suchoperationen durchgeführt werden, dann überlegen Sie, wie Sie die Suchen zusammenfassen können. Schreiben Sie zum Beispiel einen Abfragestring, der mehrere Attribute zurückgibt, statt zwei oder mehr separate Suchen zu verwenden.

Einschränken des Ergebnissatzes

Schränken Sie den Bereich Ihrer Suche so weit wie möglich ein. Wenn Sie zum Beispiel einen Ergebnissatz mit allen Objekten einer OU benötigen, dann geben Sie als Suchbasis diesen Container an. Wenn Sie die Objekte in dem Untercontainer nicht benötigen, dann verwenden Sie zusätzlich die Eigenschaft onelevel.

Verwenden Sie Suchfilter. Geben Sie zum Beispiel die Eigenschaft objectCategory=class type an - class type ist in diesem Fall der Typ des zu suchenden Objekts. Verwenden Sie eher objectCategory statt objectClass. Bei objectCategory handelt es sich um einen Einzelwert, der für Suchanfragen besser geeignet ist. Im Gegensatz zu objectClass wird objectCategory auf den globalen Katalog-Servern gespeichert und indiziert.

Geben Sie Filter an (zum Beispiel cn=SEA*, der den Ergebnissatz auf Objekt beschränkt, die mit den Buchstaben SEA anfangen). Wenn Sie das Wildcard-Zeichen * verwenden, dann jedoch nur am Ende - ansonsten erzeugen Sie noch mehr Last auf dem Domänencontroller der die Anfrage verarbeitet.

Schränken Sie die Suche noch weiter ein, indem Sie Filter kombinieren. Der folgende Filter schränkt die Suche zum Beispiel auf alle Computerobjekte ein, die mit SEA anfangen:

(&(objectCategory=computer)(cn=SEA*))

Über die Eigenschaft Range können Sie die Zahl der zurückgegebenen Einträge von Multiwert-Attributen einschränken.

Zusätzliche Eigenschaften des Command-Objekts

Es gibt eine Menge Eigenschaften des Command-Objekst, die die Suchoperation beeinflussen. Diese Eigenschaften sind besonders im Umgang mit großen Ergebnisätzen sehr nützlich. In Tabelle 5.4 sehen Sie einige dieser Optionen.

Tabelle 5.4: Optionen zur Verbesserung der Leistung bei großen Ergebnissätzen

Option

Beschreibung

Standardwert

Syntax

Page Size (paging)

Weist den Domänencontroller an, eine bestimmte Anzahl von Einträgen zu verarbeiten und diese dann vor der weiteren Verarbeitung an den Client zurückzugeben.

Deaktiviert


objCommand.Properties _
("Page Size")= Records
Records ist die Anzahl der zu erzeugenden Einträge.

Size Limit

Gibt die Größe des Ergebnissatzes an. Wenn der Domänencontroller diese Grenze erreicht, wird der Ergebnissatz sofort an den Client zurückgegeben und die Suche ist beendet.

1.000


objCommand.Properties _
("Size Limit")= Records
Records ist die Anzahl der Einträge, bei der der Domänencontroller die Suche beendet.

Time Limit

Gibt die maximale Dauer der Suche an. Nach diesem Zeitraum gibt der Domänencontroller einen Ergebnissatz zurück - auch dann, wenn dieser noch nicht alle Ergebnisse enthält.

Keiner


objCommand.Properties _
("Time Limit")= Time
Time ist der maximale Zeitraum (in Sekunden), nach dem der Ergebnissatz zurückgegeben wird.

Timeout

Gibt den Zeitraum an, den der Client auf einen Ergebnissatz wartet, bevor er die Suche abbricht.

Keiner


objCommand.Properties _
("Timeout")= Time
Timeout ist der Zeitraum (in Sekunden) den der Client auf den Ergebnissatz wartet.

Cache Results (caching)

Gibt an, ob der Ergebnissatz auf dem Client zwischengespeichert werden soll. Bei sehr großen Ergebnissätzen kann der Speicherverbrauch auf dem Client durch das Deaktivieren des Zwischenspeicherns verringert werden.

True


objCommand.Properties _
("Cache Results"= Boolean
Wenn der Wert auf False gesetzt wird, ist das Zwischenspeichern deaktiviert.

Asynchronous

Gibt an, ob der Domänencontroller die Einträge im Ergebnissatz einzeln (asynchron) oder komplett nach der Suche (synchron) senden soll.

False


objCommand.Properties _
("Asynchronous"= Boolean
Wenn der Wert auf True gesetzt wird, dann sendet der Domänencontroller die Einträge asynchron.

Verwenden des globalen Katalog-Servers für Suchoperationen

Wenn alle Attribute einer Suchoperation auf dem globalen Katalog-Server gespeichert werden, dann verwenden Sie das Prefix GC statt LDAP. Dies ist ganz besonders wichtig, wenn Sie Ergebnisse aus mehr als einer Domäne abfragen. Wenn Sie den globalen Katalog-Server verwenden, muss nur dieser die Anfrage bearbeiten - andernfalls werden möglicherweise sehr viele Domänencontroller mit in die Suche einbezogen. Wenn Sie den globalen Katalog-Server nicht verwenden, dann müssen Sie die Option Nachverfolgen zur Abfrage von Objekten aus mehreren Domänen verwenden. Sie sollten dies jedoch wenn möglich vermeiden.

Wenn Sie einen Ergebnissatz sortieren müssen, dann sortieren Sie nach Attributen, die indiziert und auf dem globalen Katalog-Server gespeichert sind. Informationen dazu, wie Sie feststellen, ob ein Attribut indiziert und auf dem globalen Katalog-Server gespeichert ist, finden Sie im Abschnitt Die Active Directory-Archiektur weiter unten in diesem Kapitel.

Weniger Objekte verwenden

Erstellen Sie nur ein Connection-Objekt und verwenden Sie dies im gesamten Script (dies gilt auch für alle anderen Objekte).

Administrative Aufgaben über einen Ergebnissatz ausführen

Mit dem ADSI-OLE DB-Provider ist nur ein Lesezugriff auf Active Directory möglich - Sie können also keine Objekte direkt ändern. Sie können jedoch über den Ergebnissatz und weitere ADSI-Methoden Änderungen durchführen. Beispiele hierfür sind:

  • Nach dem Attribut sAMAccountName eines Objekts suchen. Wenn der Ergebnissatz leer ist, dann können Sie das Objekt gefahrlos über die Methode Create erstellen.
  • Über das Attribut objectCategory nach allen Computerobjekten suchen und die Objekte dann über die Methode Put ändern.
  • Nach den Objekten suchen, bei denen das Attribut description zeigt, dass sie zu einer bestimmten Abteilung gehören. Diese Objekte können Sie dann zum Beispiel zur Konsolidierung in einen bestimmten Container verschieben.

Die beiden Scripte in diesem Abschnitt demonstrieren solche Vorgänge.

Ein Attribut bei vielen Objekten ändern

Script 5.37 ändert das Attribut location aller Computer der Domäne, deren Name mit ATL beginnt, auf den Wert Atlanta, Georgia. Die hierzu erforderlichen Schritte sind:

  1. Verwenden einer ADS-Abfrage, die alle Computerobjekte zurückgibt, deren Name mit ATL anfängt.
  • In Zeile 9 werden zwei Filter kombiniert: objectCategory=Computer und cn=ATL*. Der zweite Filter verwendet ein Wildcard-Zeichen (*), um alle Computer zu finden, deren Name mit ATL beginnt.
  • In Zeile 10 wird das Attribut ADsPath jedes Computers im Ergebnissatz zurückgegeben.
  1. Verwenden einer While-Wend-Schleife und der Methode MoveNext, um die einzelnen Einträge des RecordSet-Objekts durchzugehen.
  • Für jeden Eintrag im Ergebnissatz wird eine Bindung an das entsprechende Active Directory-Objekt aufgebaut. Dann wird das Attribut location geändert und die Änderung wird an Active Directory übermittelt (Zeilen 15-18).
  • Die Anzahl der geänderten Einträge wird über die Eigenschaft RecordCount des RecordSet-Objekts ausgegeben (Zeilen 21 und 22).

Script 5.37: Ändern eines Attributs von mehreren Computerobjekten



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

Set objConnection = CreateObject("ADODB.Connection")

objConnection.Open "Provider=ADsDSOObject;"


Set objCommand = CreateObject("ADODB.Command")

objCommand.ActiveConnection = objConnection


objCommand.CommandText = _

"<LDAP://dc=NA,dc=fabrikam,dc=com>;" & _

"(&(objectCategory=Computer)(cn=ATL*));" & _

"ADsPfad;subtree"

Set objRecordSet = objCommand.Execute


While Not objRecordSet.EOF

strADsPfad = objRecordSet.Fields("ADsPfad")

Set objComputer = GetObject(strADsPfad)

objComputer.Put "location", "Atlanta, Georgia"

objComputer.SetInfo

objRecordSet.MoveNext

Wend

Wscript.Echo objRecordSet.RecordCount & " computers objects modified."


objConnection.Close

Verschieben von Objekten, abhängig vom Wert eines bestimmten Attributs

Script 5.38 verschiebt die Benutzerobjekte in die OU HR, derenAttribut department den Wert Human Resources hat. Die hierzu erforderlichen Schritte sind:

  1. Verwenden einer ADO-Abfrage für alle Benutzerkonten, deren Attribut department den Wert Human Resources hat.
  • In Zeile 9 und 10 werden drei Filter kombiniert: objectCategory=person, objectClass=user und department=Human Resources. Beachten Sie die hierbei verwendeten Klammern und die kaufmännischen Und-Zeichen (&). Das Script verwendet die Eigenschaften objectCategory und objectClass - so werden alle Benutzerkonten zurückgegeben, die Sicherheitsprinzipale sind. Weitere Informationen über diese Filterkombination finden Sie im Abschnitt Active Directory-Benutzer in diesem Buch.
  • In Zeile 10 werden die Attribute ADsPath, distinguishedName und name aller Benutzerkonten zurückgegeben, die mit den Filterbedingungen übereinstimmen.
  1. Es wird eine Bindung zur Ziel-OU für die Verschieben-Operation aufgebaut (Zeile 14).
    Diese Bindung könnte auch für jedes zu verschiebende Objekt in der While-Wend-Schleife neu aufgebaut werden. Es ist jedoch deutlich effizienter, die Bindung nur einmal vor der Schleife aufzubauen und diese dann in der Schleife mehrmals zu verwenden.
  2. Es wird eine While-Wend-Schleife verwendet, um die Einträge im RecordSet-Objekt zu lesen (Zeile 16).
  • Die Variable strADsPath wird über die Eigenschaft field mit dem ADsPath initialisiert.
  • Es werden zwei weitere Variablen initialisiert: strDNRecord und strDNCompare. strDNRecord speichert den Wert aus dem Attribut distinguishedName, und strDNCompare speichert den Wert distinguishedName (wird aus dem Attribut DN und dem Pfad zur OU HR zusammengesetzt). Über die Variable strDNCompare wird festgestellt, ob sich das Benutzerkonto aus strDNRecord im Moment in der OU HR befindet.
  • Wenn das Benutzerkonto noch nicht in der OU ist (wenn also strDNRecord nicht gleich strDNCompare ist), dann wird die Methode MoveHere verwendet, um das Konto in die OU zu verschieben.
    Als Letztes wird das Attribut distinguishedName des Benutzerkontos ausgegeben.

Script 5.38: Verschieben von mehreren Benutzerkonten mit Hilfe des Ergebnissatzes einer Suche



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

Set objConnection = CreateObject("ADODB.Connection")

objConnection.Open "Provider=ADsDSOObject;"


Set objCommand = CreateObject("ADODB.Command")

objCommand.ActiveConnection = objConnection


objCommand.CommandText = _

"<LDAP://dc=NA,dc=fabrikam,dc=com>;" & _

"(&(&(objectCategory=person)(objectClass=user)" & _

"(department=Human Resources)));" & _

"ADsPath,distinguishedName,name;subtree"

Set objRecordSet = objCommand.Execute


Set objOU = GetObject("LDAP://ou=HR,dc=NA,dc=fabrikam,dc=com")


While Not objRecordSet.EOF

strADsPath = objRecordSet.Fields("ADsPath")

strDNRecord=LCase(objRecordSet.Fields("distinguishedName"))

strDNCompare=LCase("cn=" & objRecordSet.Fields("name") & _

",ou=HR,dc=NA,dc=fabrikam,dc=com")


If strDNRecord <> strDNCompare Then

objOU.MoveHere strADsPath, vbNullString

Wscript.Echo objRecordSet.Fields("distinguishedName") & " Moved."

Else

Wscript.Echo objRecordSet.Fields("distinguishedName") & " Not Moved."

End If

objRecordSet.MoveNext

Wend


objConnection.Close

Aus den Scripten dieses Abschnitts können wir die folgenden wichtigen Erkenntnisse gewinnen:

  • Beide Scripte führen die gleichen grundlegenden Schritte durch: Sie verwenden ADO, um ein Connection-, Command- und ein RecordSet-Objekt zu erstellen. Dann lesen Sie die einzelnen Einträge im RecordSet-Objekt aus.
  • Sie verwenden die Elemente aus dem Ergebnissatz, um administrative Aufgaben durchzuführen.

Auflisten der Active Directory-Objekte in Containern

Der Weg über ADO und den ADSI-OLE DB-Provider ist nicht der einzige Weg, um Informationen über einen Container zu erhalten. Sie können die Inhalte eines Containers auch über ADSI auflisten - dieser Weg ist jedoch nicht so effizient wie die Auflistung über ADO (vor allem bei vielen Objekten). Die Auflistung ist jedoch einfacher zu implementieren als die Suchabfrage über ADO.

Auflisten von Containerinhalten

Um die Inhalte eines Active Directory-Containers aufzulisten, müssen Sie drei grundlegende Schritte durchführen:

  1. Erstellen Sie eine Bindung an den Active Directory-Container, für den Sie die Inhalte auflisten möchten.
    Normalerweise handelt es sich hier um eine OU.
  2. Schränken Sie den Ergebnissatz über die Eigenschaft Filter ein.
    Dieser Schritt ist optional, bei vielen Objekten kann er jedoch sehr nützlich sein.
  3. Erstellen Sie eine Schleife, in der Sie weitere Aktionen mit den Objekten im Container durchführen.

Script 5.39 listet die Untercontainer des Containers Configuration auf. Der Container Configuration befindet sich unter dem Stamm der Domäne fabrikam.com. Das Script geht hierzu in zwei Schritten vor:

  1. Es baut eine Bindung an den Container Configuration in der Domäne auf.
  2. Es verwendet eine For-Each-Schleife, um die Namen der Untercontainer auszugeben.

Script 5.39: Auflisten der Untercontainernamen eines Containers



1

2

3

4

5

6

Set objConfiguration = GetObject _

("LDAP://cn=Configuration,dc=fabrikam,dc=com")


For Each objContainer in objConfiguration

Wscript.Echo objContainer.Name

Next

Wenn sie das Script in der Gesamtstruktur fabrikam.com ausführen, gibt es alle Untercontainer des Containers Configuration aus:

CN=DisplaySpecifiers
CN=Extended-Rights
CN=ForestUpdates
CN=LostAndFoundConfig
CN=Partitions
CN=Physical Locations
CN=Services
CN=Sites
CN=WellKnown Security Principals

Das Script kann aus jeder Domäne der Gesamtstruktur ausgeführt werden.

Administrative Aufgaben mit Hilfe der Auflistung durchführen

Script 5.40 listet den Container Partitions auf, der sich im Container Configuration der Stammdomäne fabrikam.com befindet. Während der Auflistung werden zwei Einträge im Multiwert-Attribut upnSuffixes aktualisiert und das Script gibt die Werte in diesem Attribut aus. Es geht folgendermaßen vor:

  1. Es definiert die Konstante ADS_PROPERTY_APPEND mit dem Wert 3. Diese wird später für die Methode PutEx verwendet (Ändern von Einträgen).
  2. Es baut eine Bindung an den Container Partitions im Container Configuration der Stammdomäne auf.
  3. Es fügt zwei Einträge zum Attribut upnSuffixes hinzu.
  4. Es verwendet eine For-Each-Schleife, um die Einträge im Attribut upnSuffixes des Containers Partitions auszugeben.

Script 5.40: Auflisten des Containers Partitions, um das Attribut upnSuffixes zu lesen und zu schreiben



1

2

3

4

5

6

7

8

9

10

11

Const ADS_PROPERTY_APPEND = 3

Set objPartitions = GetObject _

("LDAP://cn=Partitions,cn=Configuration,dc=fabrikam,dc=com")


objPartitions.PutEx ADS_PROPERTY_APPEND, upnSuffixes", _

Array("sa.fabrikam.com","corp.fabrikam.com")

objPartitions.SetInfo


For Each Suffix in objPartitions.GetEx("upnSuffixes")

Wscript.Echo Suffix

Next

Wenn Sie das Script in der Stammdomäne fabrikam.com ausführen fügt es zum Attribut upnSuffixes zwei Einträge hinzu und gibt dann die Inhalte des Attributs aus:

corp.fabrikam.com
sa.fabrikam.com

Script 5.40 funktioniert standardmäßig nur dann, wenn Ihr Benutzerkonto Mitglied der globalen Gruppe Domänen-Admins der Stammdomäne oder der Gruppe Organisations-Admins ist. Nur diese Gruppen haben das Recht, den Container Partitions zu bearbeiten.

Einschränken der aufgelisteten Container auf einen bestimmten Objekttyp

Script 5.41 listet die Inhalte des Containers Users der Domäne na.fabrikam.com auf und verwendet die Eigenschaft Filter, um die Auflistung auf Objekte vom Typ user einzuschränken. Das Script gibt dann das Attribut primaryGroupID und alle Einträge im Attribut memberOf aus. Weitere Informationen über die Eigenschaft Filter finden Sie im Abschnitt ADSI-Schnittstellen weiter unten in diesem Kapitel. Das Script geht folgendermaßen vor:

  1. Es verwendet den Befehl On Error Resume Next.
    Mit dem Befehl werden alle Laufzeitfehler unterdrückt. In diesem Fall sollen die Fehler unterdrückt werden, die auftreten, wenn ein Attribut nicht im lokalen Zwischenspeicher gefunden werden kann.
  2. Es definiert die Konstante E_ADS_PROPERTY_NOT_FOUND mit dem Wert &h8000500D. Diese wird später (in Zeile 15) für die Feststellung des ADSI-Fehlercodes verwendet (der Fehler tritt auf, wenn das Attribut memberOf nicht im lokalen Zwischenspeicher gefunden werden kann).
  3. Es baut eine Bindung an den Container Users der Domäne na.fabrikam.com auf.
  4. Es setzt die Eigenschaft Filter, um nur Benutzerobjekte zurückzugeben (Zeile 6).
  5. Es verwendete eine For-Each-Schleife, um Informationen über die einzelnen Benutzerkonten auszugeben. In der Schleife passiert folgendes:
  1. Über die Methode Get wird der Wert des Attributs primaryGroupID abgefragt und ausgegeben (Zeile 11).
  2. Über die Methode GetEx wird das Array arrMemberOf mit den Einträgen des Attributs memberOf initialisiert (Zeile 13).
    Wenn das Attribut memberOf nicht vorhanden ist, dann tritt ein Fehler mit der Fehlernummer aus E_ADS_PROPERTY_NOT_FOUND auf. In diesem Fall wird eine Meldung ausgegeben und das Err-Objekt wird zurückgesetzt (Zeilen 19-21).
    Wenn das Attribut vorhanden ist, dann werden die einzelnen Elemente des Arrays arrMemberOf ausgegeben (Zeilen 15-18).

Script 5.41: Einschränken der Auflistung auf Benutzerkonten über die Eigenschaft Filter



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

On Error Resume Next

Const E_ADS_PROPERTY_NOT_FOUND = &h8000500D

Set objOU = GetObject _

("LDAP://cn=Users,dc=NA,dc=fabrikam,dc=com")

ObjOU.Filter= Array("user")


For Each objUser in objOU

Wscript.Echo objUser.cn & " ist Mitglied von: "

Wscript.Echo vbTab & "Primary Group ID: " & _

objUser.Get("primaryGroupID")

arrMemberOf = objUser.GetEx("memberOf")

If Err.Number <> E_ADS_PROPERTY_NOT_FOUND Then

For Each Group in arrMemberOf

Wscript.Echo vbTab & Group

Next

Else

Wscript.Echo vbTab & "Attribut memberOf ist nicht vorhanden"

Err.Clear

End If

Wscript.Echo VbCrLf

Next

Wenn Sie das Script in der Domäne na.fabrikam.com ausführen, gibt es das Attribut primaryGroupID und die Einträge des Multiwert-Attributs memberOf aller Benutzerkonten aus:

        Primary Group ID: 513
        CN=Richtlinien-Ersteller-Besitzer,CN=Users,DC=TestOrga,DC=com
        CN=Domänen-Admins,CN=Users,DC=TestOrga,DC=com
        CN=Organisations-Admins,CN=Users,DC=TestOrga,DC=com
        CN=Schema-Admins,CN=Users,DC=TestOrga,DC=com
        CN=Administratoren,CN=Builtin,DC=TestOrga,DC=com

Gast ist Mitglied von:
        Primary Group ID: 514
        CN=Gäste,CN=Builtin,DC=TestOrga,DC=com

Remoterouter ist Mitglied von:
        Primary Group ID: 513
        Attribut memberOf ist nicht vorhanden

SUPPORT_388945a0 ist Mitglied von:
        Primary Group ID: 513
        CN=Hilfedienstgruppe,CN=Users,DC=TestOrga,DC=com

Root Directory Service Entry

Ein Element, das zur Erstellung eines ADsPfads eines Objekts verwendet werden kann, ist der Root Directory Service Entry (rootDSE). Der rootDSE ist der Stamm des Verzeichnisses - er ist ein nützliches ADSI-Feature, da er es einem Script ermöglicht, wichtige Informationen über das Stammverzeichnis abzurufen. So sind Sie in der Lage, keine DNs fest in das Script eintragen zu müssen.

Bis jetzt haben alle Scripte in diesem Kapitel ein ADSI-Feature verwendet, das sich serverlose Bindung nennt. Serverlose Bindung bedeutet, dass im Script kein Name eines Domänencontrollers eingetragen werden muss. Stattdessen sucht ADSI einen Domänencontroller der Standarddomäne, der die Bindungsanfrage verarbeiten kann. Bei der Standarddomäne handelt es sich normalerweise um die Domäne, an der Sie angemeldet sind.

Bisher musste in allen Scripte in diesem Kapitel aufgrund der serverlosen Bindung der DN in den ADsPfaden fest eingetragen werden .Die Scripte arbeiten daher nur in der Gesamtstruktur fabrikam.com. Mit dem rootDSE können Sie die Scripte so ändern, dass sie auch in anderen Gesamtstrukturen arbeiten.

Verwendung des rootDSE

Zu Verwendung des rootDSE sind drei grundlegende Schritte erforderlich.

  1. Eine Bindung zum rootDSE aufbauen.
  2. Verwenden der Methode Get, um Attribute des rootDSE zu lesen.
  3. Verwenden der Attribute zum Erstellen des ADsPfads, um eine Bindung an einen Container oder ein Objekt zu erstellen.
    Die Schritte 2 und 3 werden oft in einem Schritt kombiniert.

Die vier Scripte in diesem Abschnitt sollen die Verwendung des rootDSE verdeutlichen.

Binden an die aktuelle Domäne

Script 5.42 baut mit Hilfe des Attributs defaultNamingContext des rootDSE eine Bindung an die aktuelle Domäne auf. Die aktuelle Domäne ist die, an der der Client angemeldet ist. Indem Sie die Bindung verändern, können Sie auch eine Bindung an einem bestimmten Container der Methode aufbauen (zum Beispiel Users). Das Script führt die folgenden Schritte durch:

  1. Es baut eine Bindung zum rootDSE auf.
  2. Es erstellt den ADsPfad der aktuellen Domäne.
  3. Es verwendet die Variable strADsPath für die Bindung an das Zielobjekt.

Script 5.42: Erstellen des ADsPfads mit Hilfe des rootDSE



1

2

3

Set objRootDSE = GetObject("LDAP://rootDSE")

strADsPath = "LDAP://" & objRootDSE.Get("defaultNamingContext")

Set objDomain = GetObject(strADsPath)

In der Domäne na.fabrikam.com enthält die Variable strADsPath den Wert:

LDAP://DC=na,DC=fabrikam,DC=com

Binden an die Stammdomäne

Script 5.43 baut eine Bindung an die Stammdomäne auf - hierbei ist es egal, an welcher Domäne der Client angemeldet ist.

Script 5.43: Erstellen des ADsPfads der Stammdomäne über den rootDSE



1

2

3

Set objRootDSE = GetObject("LDAP://rootDSE")

strADsPath = "LDAP://" & objRootDSE.Get("rootDomainNamingContext")

Set objRootDomain = GetObject(strADsPath)

Wenn Sie das Script in einer Domäne in der Gesamtstruktur fabrikam.com ausführen, enthält die Variable strADsPath den Wert:

LDAP://DC=fabrikam,DC=com

Binden an den Container Configuration

Script 5.44 baut eine Bindung an den Container configuration der Gesamtstruktur auf.

Script 5.44: Erstellen des ADsPfads des Containers Configuration mit dem rootDSE



1

2

3

Set objRootDSE = GetObject("LDAP://rootDSE")

strADsPath = "LDAP://" & objRootDSE.Get("configurationNamingContext")

Set objConfiguration = GetObject(strADsPath)

Wenn das Script in einer Domäne der Gesamtstruktur fabrikam.com ausgeführt wird, dann enthält die Variable strADsPath den Wert:

LDAP://CN=Configuration,DC=fabrikam,DC=com

Binden an den Container Schema

Script 5.45 baut eine Bindung an den Container schema der Gesamtstruktur auf.

Script 5.45: Erstellen des ADsPfads des Containers Schema mit dem rootDSE



1

2

3

Set objRootDSE = GetObject("LDAP://rootDSE")

strADsPath = "LDAP://" & objRootDSE.Get("schemaNamingContext")

Set objSchema = GetObject(strADsPath)

Wenn das Script in einer Domäne der Gesamtstruktur fabrikam.com ausgeführt wird, dann enthält die Variable strADsPath den Wert:

LDAP://CN=Schema,CN=Configuration,DC=fabrikam,DC=com
Dn151181.note(de-de,TechNet.10).gifAnmerkung:

Eine vollständige Liste der Eigenschaften des rootDSE finden Sie unter dem Link Active Directory Programmer's Guide unter https://www.microsoft.com/windows/reskits/webresources.

Dn151181.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).pngZum Seitenanfang

Die Active Directory-Architektur

Ein grundlegendes Verständnis der physikalischen und logischen Active Directory-Struktur hilft Ihnen bei der erfolgreichen Erstellung von ADSI-Scripten. Wenn Sie zum Beispiel wissen, wie Sie herausfinden, welche Attribute ein Objekt verwendet, dann können Sie auch über ein Script auf diese Attribute zugreifen. Außerdem sollten Sie wissen, welche Attribute auf dem globalen Katalog-Server gespeichert und indiziert werden.

Die physikalische Struktur von Active Directory gibt wieder, wo die Elemente gespeichert werden und über welche Komponenten auf diese Elemente zugegriffen werden kann. Die logische Struktur definiert, wie Active Directory über ADSI und andere Werkzeuge verwaltet wird.

Die physikalische Architektur

Active Directory setzt sich aus zwei primären Komponenten zusammen: dem Active Directory-Speicher und den Komponenten, über auf Active Directory zugegriffen werden kann (DLLs).

Der Active Directory-Speicher stellt einen sicheren, durchsuchbaren und hierarchischen Speicher für Objekte (Benutzer, Computer, Drucker, Anwendungen, usw.) zur Verfügung. Der Active Directory-Speicher befindet sich in einer Datei mit dem Namen Ntds.dit (Windows NT® Directory Services Directory Information Tree).

Bei den erforderlichen Komponenten zum Zugriff auf Active Directory handelt es sich um:

  • Die Extensible Storage Engine - Schreibt und liest Daten aus dem Active Directory-Speicher (Ntds.dit). Die Extensible Storage Engine (ESE) führt Schreiboperationen als direkte Transaktionen durch. Sie sichert die Ntds.dit über Protokolldateien - über diese können Transaktionen rückgängig gemacht werden und Wiederherstellungen der Datenbank durchgeführt werden.
  • Eine Datenbankschicht - Stellt eine objektsorientierte, hierarchische Ansicht der Daten im Active Directory-Speicher zur Verfügung.
  • Den DSA (Directory System Agent) - ADSI-Provide und andere Schnittstellen verwenden den DAS, um eine Verbindung mit der Datenbankschicht aufzubauen und auf den Active Directory-Speicher zuzugreifen. Der DSA arbeitet als Vermittler und stellt sicher, dass die Clientaktionen mit den Regeln für die entsprechenden Active Directory-Objekte übereinstimmen. Ungültige Aktionen (zum Beispiel das Schreiben eines zu langen Werts in ein Attribut oder das Erstellen eines Objekts ohne alle verpflichtenden Attribute zu definieren) lässt der DSA nicht zu. Der DSA ist außerdem ein integraler Bestandteil der Active Directory-Replikation
  • Das LDAP-Protokoll (Lightweight Directory Access Protocol) - Eine Protokollschicht, die zur Kommunikation mit LDAP-fähigen Verzeichnisdiensten wie Active Directory verwendet werden kann.

Die logische Struktur

Wenn Sie einen Computer unter Windows 2000 Server zu einem Domänencontroller machen, dann wird der Active Directory-Speicher auf diesem Domänencontroller eingerichtet - vor der vollständigen Einrichtung müssen Sie die Beziehung des neuen Domänencontrollers zu den vorhandenen Domänencontrollern angeben. Der Domänencontroller kann für eine neue Domäne oder für eine vorhandene Domäne konfiguriert werden.

Um skalierbar zu sein, kann Active Directory Tausende von Domänen unterstützen. Alle Domänen können in Form einer Hierarchie verbunden werden. Eine einzelne Hierarchie wird Struktur genannt. Mehrere Strukturen sind eine Gesamtstruktur.

Klassen und Attribute

In jeder Active Directory-Gesamtstruktur gibt es ein Schema. Beim Schema handelt es sich um eine Bibliothek, in der alle Objekte hinterlegt sind, die in Active Directory erstellt werden können. Sie können sich das Schema als Sammlung von Vorlagen vorstellen. Das Schema enthält Klassen und Attribute.Klassen werden von Active Directory zur Erstellung von Objekten verwendet. Die Klassen setzen sich aus einzelnen Attributen zusammen. Die Objekte, die aufgrund einer Klasse erstellt werden, verwenden daher alle Attribute der Klasse. Bei den Objekten handelt es sich um die logischen Gegenstücke zu den tatsächlichen Objekten im Netzwerk (zum Beispiel Computer, Benutzer oder Drucker). In Abbildung 5.6 sehen Sie die Beziehungen zwischen den Attributen und Klassen im Schema und den aus diesen erstellten Objekten (Instanzen).

Dn151181.5F49E644D386AD35C567E25E0E432A21(de-de,TechNet.10).png

Abbildung 5.6: Attribute, Klassen und Objekte und deren Beziehungen

Wenn ein Objekt auf Grundlage einer Klasse erstellt wird, dann wird dieser Vorgang Instanzierung genannt. Ein Objekt, das Aufgrund einer Klasse erstellt wurde, wird Instanz genannt. Jede Klasse definiert einen Objekttyp. Die Attribute in einer Klasse beschreiben diese Klasse (bzw. den aus ihr zu erstellenden Objekttyp). Die Klasse Computer enthält zum Beispiel das Attribut cn mit dem Wert Computer und das Attribut lDAPDisplayName mit dem Wert computer. Jedes der beiden Attribute hat eine Funktion. Sie haben zum Beispiel gesehen, dass das Attribut lDAPDisplayName vom LDAP-Provider zum Zugriff auf das Objekt verwendet wird.

Verpflichtende (Mandatory) und optionale Attribute

Zwei weitere Attribute einer Klasse sind systemMustContain und systemMayContain. Diese Attribute definieren, welche Attribute eines Objekts verpflichtend (systemMustContain) und welche Attribute optional sind.

Script 5.46 liest alle verpflichtenden und optionalen Attribute der Klasse Computer aus. Hierzu führ das Script die folgenden Schritte durch:

  1. Es verwendet den Befehl On Error Resume Next.
  2. Es definiert die Konstante E_ADS_PROPERTY_NOT_FOUND mit dem Wert &h8000500D. Diese wird später verwendet, um festzustellen, ob die Attribute systemMustContain oder systemMayContain vorhanden sind (Zeilen 10 und 21).
  3. Es verwendet den rootDSE, um den Wert des Attributs schemaNamingContext abzufragen.
    Weitere Informationen über den rootDSE finden Sie im Abschnitt Root Directory Service Entry weiter oben in diesem Kapitel.
  4. Es baut über die Funktion GetObject und den Provider LDAP eine Bindung zur Klasse computer im Container schema auf.
  5. Es initialisiert die Variable arrMandatoryAttributes mit dem Attribut systemMustContain (Zeile 9).
  • Wenn hier der Fehlerwert aus der Konstante E_ADS_PROPERTY_NOT_FOUND zurückgegeben wird, dann gibt das Script eine Nachricht aus ("Keine verpflichtenden Attribute").
  • Andernfalls wird eine For-Each-Schleife verwendet, um die Namen aller verpflichtenden Attribute der Klasse computer zu lesen und auszugeben.
  1. Es initialisiert die Variable arrOptionalAttributes mit dem Wert des Attributs systemMayContain (Zeile 20).
  • Wenn hier der Fehlerwert aus der Konstante E_ADS_PROPERTY_NOT_FOUND zurückgegeben wird, dann gibt das Script eine Nachricht aus ("Keine optionalen Attribute").
  • Andernfalls wird eine For-Each-Schleife verwendet, um die Namen aller optionalen Attribute der Klasse computer zu lesen und auszugeben.

Script 5.46: Auslesen der verpflichtenden und optionalen Attribute der Klasse computer



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

On Error Resume Next

Const E_ADS_PROPERTY_NOT_FOUND = &h8000500D

strClassName = "cn=Computer"


Set objRootDSE = GetObject("LDAP://rootDSE")

Set objSchemaClass = GetObject("LDAP://" & strClassName & "," & _

objRootDSE.Get("schemaNamingContext"))


arrMandatoryAttributes = objSchemaClass.GetEx("systemMustContain")

If Err.Number = E_ADS_PROPERTY_NOT_FOUND Then

Wscript.Echo "Keine verpflichtenden Attribute"

Err.Clear

Else

Wscript.Echo "Verpflichtende Attribute"

For Each strAttribute in arrMandatoryAttributes

Wscript.Echo strAttribute

Next

End If


arrOptionalAttributes = objSchemaClass.GetEx("systemMayContain")

If Err.Number = E_ADS_PROPERTY_NOT_FOUND Then

Wscript.Echo "Keine optionalen Attribute"

Err.Clear

Else

Wscript.Echo VbCrLf & "Optionale Attribute "

For Each strAttribute in arrOptionalAttributes

Wscript.Echo strAttribute

Next

End If

Wenn Sie das Script ausführen, gibt es die Nachricht "Keine verpflichtenden Attribute" aus und dann die optionalen Attribute:

Keine verpflichtenden Attribute

Optionale Attribute
volumeCount
siteGUID
rIDSetReferences
...
dNSHostName
defaultLocalPolicyObject
cn
catalogs

Wenn Sie ein Computerobjekt erstellen, müssen Sie einen Wert für das Attribut sAMAccountName festlegen - es handelt sich hier um ein verpflichtendes Attribut der Klasse computer. Das vorhergehende Script gibt jedoch an, dass keine verpflichtenden Attribute vorhanden sind. Das Script hat hier Recht. Die Klasse computer erbt Attribute von den in der Active Directory-Hierarchie übergeordneten Klassen (dies gilt auch für viele andere Klassen). Daher verwendet die Klasse computer zwar das verpflichtende Attribut sAMAccountName, es wird jedoch nicht in der Klasse selbst definiert.

Vererbung und Kategorisierung von Klassen

Nicht nur Active Directory verwendet eine hierarchische Struktur (Domänen sind in Strukturen und Gesamtstrukturen zusammengefasst), sondern auch die Klassen im Schema. Einige Attribute werden in dieser Hierarchie von einer Klasse zur anderen vererbt - andere Attribute werden direkt in den Klassen definiert. Das Objekt, das aus einer Klasse erstellt wird, enthält dann alle Attribute - die geerbten und die in der Klasse definierten.

Ein Computerobjekt erbt zum Beispiel Attribute von der Klasse user. Wenn wir die Klassenhierarchie weiter nach oben gehen, werden Attribute von den Klassen organizationalPerson, person und top geerbt. Die Klasse user enthält auch Attribute, die direkt über die Klassen mailRecipient und securityPrincipal angewandt werden. Die Klasse securityPrincipal enthält wiederum das Attribut sAMAccountName - dieses ist für alle Klassen, die das Attribut erben, verpflichtend. Daher erbt auch die Klasse computer das verpflichtende Attribut sAMAccountName.

Es gibt noch weitere Informationen, die Sie der Klassenhierarchie entnehmen können. Die Klasse contact ist zum Beispiel kein Sicherheitsprinzipal- und zwar darum, weil die Klasse securityPrincipal nicht auf die Klasse contact angewandt wird und diese daher nicht die Attribute der Klasse securityPrincipal erbt.

Klassen sind in die Kategorien Abstract, Structural, Auxiliary und 88 aufgeteilt. Die Kategorie wird im Attribut objectClassCategory einer Klasse als Integer-Wert gespeichert.

  • Abstract - Die Attribute dieser Klassen werden in der Hierarchie vererbt. Es können jedoch keine Objekte aus diesen Klassen erstellt werden. Der Integer-Wert für diese Klasse ist 2.
  • Auxiliary - Die Attribute dieser Klasse erweitern eine Klasse vom Typ Structural. Es kann jedoch keine Klasse von Typ Structural oder ein Objekt aus dieser Klasse erstellt werden. Der Integer-Wert für diese Klasse ist 3.
  • Structural - Aus dieser Klasse können neue Instanzen von Objekten erstellt werden. Diese Klasse kann Attribute enthalten, die nicht von anderen Klassen geerbt werden. Der Integer-Wert für diese Klasse ist 1.
  • 88 - Diese Klassen wurden definiert, bevor es Klassenkategorien gab. Sie verhalten sich wie Klassen der Kategorie Structural - aus ihnen können Instanzen von Objekten erstellt werden. Der Integer-Wert für diese Klasse ist 0.

Active Directory ist kompatibel mit dem X.500-Standard. Daher müssen auch die 1993 in diesem Standard definierten Kategorien verwendet werden. Alle Klassen, die vor 1993 definiert wurden, entsprechen dem X.500-Standard von 1988. Dieser enthält keine Kategorien. Daher enthält die Kategorie 88 alle Klassen, die bis 1993 definiert wurden.

Script 5.47 liest das Attribut objectClassCategory der Klassen Top, Mail-Recepient, Security-Principal, Person, Organizational-Person, Contact, User, Computer und Organizational-Unit. Hierzu führt das Script die folgenden Schritte durch:

  1. Es initialisiert ein Array mit den allgemeinen Namen (CNs) der Klassen.
    Die Funktion GetObject benötigt den CN der Klasse - nicht den lDAPDisplayName.
  2. Es verwendet den rootDSE, um den Wert des Attributs schemaNamingContext abzufragen.
  3. Es verwendete eine For-Each-Schleife, um über die Funktion GetObject und den Provider LDAP eine Bindung an die einzelnen Klassen im Container Schema aufzubauen.
  4. Es initialisiert die Variable intClassCategory mit dem Integer-Wert des Attributs objectClassCategory.
  5. Es verwendet eine Select-Case-Anweisung, um den Wert der Variable intClassCategory zu prüfen und den Typ der jeweiligen Klasse anzuzeigen.

Script 5.47: Lesen des Attributs objectClassCategory mehrerer Klassen



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

arrClassNames = Array _

("cn=top","cn=mail-Recipient", "cn=security-Principal", _

"cn=person", "cn=Organizational-Person", _

"cn=contact", "cn=user", "cn=computer", "cn=organizational-Unit")


Set objRootDSE = GetObject("LDAP://rootDSE")

For Each ClassName in arrClassNames

Set objSchemaClass = GetObject("LDAP://" & ClassName & "," & _

objRootDSE.Get("schemaNamingContext"))

intClassCategory = objSchemaClass.Get("objectClassCategory")

WScript.STDOUT.Write ClassName & " is "

Select Case intClassCategory

Case 0

Wscript.Echo "88"

Case 1

Wscript.Echo "Structural"

Case 2

Wscript.Echo "Abstract"

Case 3

Wscript.Echo "Auxiliary"

End Select

Next

Wenn Sie das Script ausführen, zeigt es die Klassenkategorien einzelner Klassen an:

cn=top is abstract
cn=mail-Recipient is auxiliary
cn=security-Principal is auxiliary
cn=person is 88
cn=Organizational-Person is 88
cn=contact is structural
cn=user is structural
cn=computer is structural
cn=organizational-Unit is structural

Das Attribut systemAuxiliaryClass jeder Klasse gibt die Klassen vom Typ Auxiliary an, die direkt auf die Klasse angewandt werden. Script 5.48 liest das Attribut für mehrere Klassen aus:

  1. Es verwendet den Befehl On Error Resume Next und definiert die Konstante E_ADS_PROPERTY_NOT_FOUND mit dem Wert &h8000500D. Über diese Konstante wird später geprüft, ob das Attribut systemAuxiliaryClass leer ist.
  2. Es initialisiert ein Array mit den CNs der Klassen.
  3. Es verwendet den rootDSE, um den Wert des Attributs schemaNamingContext abzufragen.
  4. Es verwendet eine For-Each-Schleife, um über die Funktion GetObject und dem Provice LDAP eine Bindung zu den einzelnen Klassen im Container Schema aufzubauen.
  5. Es initialisiert die Variable arrSystemAuxiliaryClass mit dem Attribut systemAuxiliaryClass (Zeilen 15 und 16).
  • Wenn hier der Fehlerwert in E_ADS_PROPERTY_NOT_FOUND zurückgegeben wird, dann wird eine entsprechende Meldung ausgegeben.
  • Andernfalls wird eine For-Each-Schleife verwendet, um die Liste der zur Klasse zugewiesenen Klassen vom Typ Auxiliary anzuzeigen.

Script 5.48_ Lesen des Attributs systemAuxiliaryClass mehrerer Klassen



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

On Error Resume Next

Const E_ADS_PROPERTY_NOT_FOUND = &h8000500D

arrClassNames = Array _

("cn=top","cn=mail-Recipient", "cn=security-Principal", _

"cn=person", "cn=Organizational-Person", _

"cn=contact", "cn=user", "cn=computer", "cn=organizational-Unit")


Set objRootDSE = GetObject("LDAP://rootDSE")

For Each ClassName in arrClassNames

Set objSchemaClass = GetObject("LDAP://" & ClassName & "," & _

objRootDSE.Get("schemaNamingContext"))


arrSystemAuxiliaryClass = _

objSchemaClass.GetEx("systemAuxiliaryClass")


If Err.Number = E_ADS_PROPERTY_NOT_FOUND Then

Wscript.Echo "Keine Klassen vom Typ Auxiliary " & _

" assigned to " & ClassName

Err.Clear

Else

Wscript.Echo "Auxiliary-Klassen in " & ClassName & ":"

For Each strAuxiliaryClass in arrSystemAuxiliaryClass

Wscript.Echo vbTab & strAuxiliaryClass

Next

Wscript.Echo

End If

Next

Wenn sie das Script ausführen, gibt es eine Meldung aus, die anzeigt, das die Auxiliary-Klasse mailRecipient auf die Klassen contact und user angewandt wird, und dass die Auxiliary-KlasesecurityPrincipal auf die Klasse user angewandt wird:

No auxiliary classes assigned to cn=top.
No auxiliary classes assigned to cn=mail-Recipient.
No auxiliary classes assigned to cn=security-Principal.
No auxiliary classes assigned to cn=person.
No auxiliary classes assigned to cn=Organizational-Person.
Auxiliary classes in cn=contact:
        mailRecipient

Auxiliary classes in cn=user:
        securityPrincipal
        mailRecipient

No auxiliary classes assigned to cn=computer.
No auxiliary classes assigned to cn=organizational-Unit.

Wenn Sie die Klassenvererbung verstehen, dann hilft Ihnen das dabei Scripte zu schreiben, die auch die erwarteten Objekte zurückgeben. Wenn Sie zum Beispiel eine Suche nach allen Objekten durchführen, deren Attribut objectClass den Wert user enthält, dann sind Sie sicher überrascht, dass Sie auch Objekte zurückerhalten, die aus der Klasse computer erstellt wurden.

Die Beziehungen zwischen den Klassen können Sie auch über ein Script anzeigen lassen. Das Attribut subClassOf gibt die übergeordnete Klasse an, von der die Klasse abgeleitet ist. Script 5.49 zeigt, wie Sie dieses Attribut abfragen. Seine Arbeitsweise entspricht den vorherigen beiden Scripten.

Script 5.49: Lesen des Attributs subClassOf einer Klasse



1

2

3

4

5

6

7

8

9

strClassName = "cn=computer"


Set objRootDSE = GetObject("LDAP://rootDSE")

Set objSchemaClass = GetObject("LDAP://" & strClassName & "," & _

objRootDSE.Get("schemaNamingContext"))


strSubClassOf = objSchemaClass.Get("subClassOf")

Wscript.Echo "Die Klasse " & strClassName & _

" ist eine untergeordnete Klasse von " & strSubClassOf

Wenn Sie das Script ausführen, erhalten Sie die folgende Ausgabe:

Die Klasse cn=computer ist eine untergeordnete Klasse von user

Snap-Ins zum Anzeigen und Konfigurieren von Attributen, Klassen und Objekten

Klassen und Attribute des Schemas können Sie auch über ein MMC-Snap-In anzeigen lassen. Die beiden Snap-Ins hierzu heißen Active Directory Schema und ADSI Edit. Mit dem Snap-In Active Directory Schema steht Ihnen eine grafische Schnittstelle für den Zugriff auf Klassen und Attribute zur Verfügung. Mit ADSI Edit können Sie außerdem auch noch auf alle Active Directory-Objekte zugreifen.

Das Snap-In Active Directory Schema

Auf der linken Seite des Snap-Ins sehen Sie zwei Listen:

  • Die Klassenliste mit allen Klassen des Active Directory-Schemas
  • Die Attributliste mit allen Attributen des Schemas

Über die Klassenliste können Sie die von einer bestimmten Klasse verwendeten Attribute und die hierarchischen Beziehungen zwischen den Klassen sehen. Über die Attributliste können Sie feststellen, wie ein Attribut definiert ist (zum Beispiel, ob das Attribut auf den globalen Katalog-Server repliziert werden soll, ob es sich um ein Einzelwert- oder Multiwert-Attribut handelt, usw.).

Das Snap-In Active Directory Schema müssen Sie vor der ersten Verwendung registrieren:

  1. Geben Sie in der Eingabeaufforderung den Befehl regsvr32 schmmgmt ein.
    (Dieser Schritt muss nur einmal auf jedem Computer durchgeführt werden.)
  2. Starten sie eine MMC-Konsole Start MMC, indem Sie MMC in der Eingabeaufforderung oder im Feld Ausführen eingeben.
  3. Klicken Sie auf Datei, Snap-In hinzufügen/entfernen und klicken Sie auf Hinzufügen.
  4. Klicken Sie auf Active Directory Schema und dann auf Hinzufügen.

Das Snap-In ADSI Edit

Das Snap-In ADSI Edit zeigt nicht nur Informationen über das Schema, sondern auch über die Objekte der Domäne an. Wahrscheinlich finden Sie die Informationen über das Schema jedoch im Snap-In Active Directory Schema übersichtlicher.

Nachdem Sie das Snap-In ADSI Edit geladen haben, können Sie auswählen, wie Sie sich mit Active Directory verbinden möchten. Die Standard-Verbindungspunkte sind:

  • LDAP://domain_controller_name/Domain - Informationen über die Objekte der Domäne.
  • LDAP://domain_controller_name/Configuration - Informationen über die Konfigurationspartition der Gesamtstruktur.
  • LDAP://domain_controller_name/RootDSE - Informationen über die Attribute des RootDSE-Objekts.
  • LDAP://domain_controller_name/Schema - Informationen über den Schemacontainer der Gesamtstruktur.
Dn151181.note(de-de,TechNet.10).gifAnmerkung:

Sie können natürlich auch eine Verbindung mit einem globalen Katalog-Server aufbauen und dessen Partitionen anzeigen.

Das Snap-In ADSI Edit installieren Sie folgendermaßen:

  1. Installieren Sie die SupportTtools (SupTools.msi) von der Windows 2000 Server-Installations-CD (die Support Tools befinden sich im Ordner Support\Tools).
  2. Starten Sie eine MMC-Konsole Start MMC, indem Sie MMC in der Eingabeaufforderung oder im Feld Ausführen eingeben.
  3. Klicken Sie auf Datei, Snap-In hinzufügen/entfernen und klicken Sie auf Hinzufügen.
  4. Klicken Sie auf ADSI Edit und dann auf Hinzufügen.
  5. Klicken Sie auf der linken Seite mit der rechten Maustaste auf ADSI Edit und wählen Sie Connect to.
  6. Übernehmen Sie im Fenster Connection Settings die Standardeinstellungen und klicken Sie auf OK.

Active Directory-Replikation und -Indizierung

Daten werden in Active Directory repliziert. Das bedeutet, dass die Änderungen auf einem Domänencontroller an alle anderen Domänencontroller übertragen werden.

Ein kritischer Teil der Verwaltung von Active Directory über ADSI-Scripte ist die Replikation. Um den Replikationsaufwand zu verringern, ist Active Directory in Partitionen aufgeteilt. Diese Partitionen werden entweder vollständig oder teilweise repliziert. Partitionen mit einer vollständigen Replikation werden an alle Domänencontroller in der Domäne oder der Gesamtstruktur übertragen. Sie können also von jedem Domänencontroller in der Domäne oder Gesamtstruktur gelesen oder geschrieben werden. Partitionen mit einer teilweisen Replikation werden nur an bestimmte Domänencontroller übertragen. Sie enthalten nur Teile von Active Directory und können nur gelesen werden.

Partitionen

Es gibt drei vollständig replizierte Partitionen auf jedem Domänencontroller.

  • Die Schemapartition - Diese Partition enthält alle Klassen und Attribute der Gesamtstruktur.
  • Die Konfigurationspartition - Diese Partition enthält Informationen über die Konfiguration des Gesamtstruktur (zum Beispiel Domänennamen und Standorte).
  • Die Domänenpartition - Diese Partition enthält alle Objekte der jeweiligen Domäne des Domänencontrollers. Im Gegensatz zu den anderen beiden Partitionen ist die Domänenpartition für jede Domäne unterschiedlich. Schema- und Konfigurationspartition werden von allen Domänen der Gesamtstruktur gemeinsam verwendet.

Attribute, die zum globalen Katalog-Server repliziert werden

Alle Domänencontroller, die als globaler Katalog-Server konfiguriert sind, speichern eine teilweise Replik aller Domänenpartitionen der Domänen der Gesamtstruktur. Diese Teilreplik - der globale Katalog - enthält zwar alle Objekte der jeweiligen Domänenpartitionen, aber nur einen Teil der Attribute dieser Objekte. Wenn Sie effiziente Scripte schreiben möchten, dann sollten Sie wissen, um welche Attribute es sich handelt. Wenn Sie ohne einen globalen Katalog-Server Informationen über mehrere Domäne der Gesamtstruktur abfragen möchten, dann müssen Sie die Eigenschaft Nachverfolgen (chasing) verwenden. Diese sorgt jedoch für eine höhere Last auf den beteiligten Domänencontrollern. Sie sollten also versuchen jene Attribute zu verwenden, die auf den globalen Katalog-Server repliziert werden.

Das Attribut isMemberOfPartialAttributeSet eines Attributs im Schema speichert einen Boolean-Wert. Dieser zeigt, ob das entsprechende Attribut an den globalen Katalog-Server repliziert wird. In Script 5.50 sehen Sie, wie Sie dieses Attribut abfragen können.

  1. Es initialisiert eine Variable mit dem Namen strAttributeName mit dem CN eines Attributs.
    In diesem Beispiel wird das Attribut given-name verwendet.
  2. Es verwendet den rootDSE, um den Wert des Attributs schemaNamingContext abzufragen.
  3. Es baut über die Funktion GetObject und den Provider LDAP eine Bindung an das Attribut im Container schema auf.
  4. Es initialisiert die Variable blnInGC mit dem Boolean-Wert des Attributs isMemberOfPartialAttributeSet.
  • Wenn blnInGC den Wert True hat, dann wird das Attribut an den globalen Katalog-Server repliziert. Eine entsprechende Meldung wird ausgegeben.
  • Andernfalls wird das Attribut nicht repliziert. Auch hier wird eine Meldung ausgegeben.

Script 5.50: Lesen des Attributs isMemberOfPartialAttributeSet eines Attributs



1

2

3

4

5

6

7

8

9

10

11

12

13

14

strAttributeName = "cn=given-name"


Set objRootDSE = GetObject("LDAP://rootDSE")

Set objSchemaAttribute = GetObject("LDAP://" & strAttributeName & "," & _

objRootDSE.Get("schemaNamingContext"))


blnInGC = objSchemaAttribute.Get("isMemberOfPartialAttributeSet")

If blnInGC Then

Wscript.Echo strAttributeName & _

" wird an den globalen Katalog-Server repliziert."

Else

Wscript.Echo "The " & strAttributeName & _

" wird nicht an den globalen Katalog-Server repliziert."

End If

Wenn Sie das Script ausführen, erhalten Sie die folgende Ausgabe:

cn=given-name wird an den globalen Katalog-Server repliziert.

Nachdem Sie festgestellt haben, dass ein Attribut an den globalen Katalog-Server repliziert wird, können Sie den Provider GC statt LDAP verwenden.

In Script 5.50 ist Ihnen möglicherweise aufgefallen, dass das Script nach einem Attribut (isMemberOfPartialAttributeSet) eines Attributs sucht. Auch Attribute haben Attribute. Wenn Sie sich ein Attribut über das Snap-In ADSI Edit anschauen, dann werden Sie sehen, dass die Attribute und Klassen hier als Objekte angezeigt haben - und wie Sie wissen, haben Active Directory-Objekte nun einmal Attribute.

Indizierung von Attributen

Ein weiterer wichtiger Aspekt bei der Leistung von Suchen ist, ob das entsprechende Attribut indiziert wird. Indizierte Attribute sind bereits sortiert - hierdurch wird die Verarbeitungslast auf dem Domänencontroller verringert.

Das Attribut searchFlags eines Attributs enthält einen Integer-Wert, der unter anderem anzeigt, ob das Attribut indiziert wird. Script 5.51 zeigt, wie Sie das Attribut abfragen können. Das Script entspricht zum größten Teil Script 5.50. Es geht folgendermaßen vor:

  1. Es definiert die Konstante IS_INDEXED mit dem Wert 1, um später feststellen zu können, ob das Attribut indiziert wird.
  2. Es verwendet den rootDSE, um den Wert des Attributs schemaNamingContext abzufragen.
  3. Es baut über die Funktion GetObject und den Provider LDAP eine Bindung an das Attribut im Container schema auf.
  4. Es initialisiert die Variable intSearchFlags mit dem Integer-Wert des Attributs searchFlags (Zeile 8).
  5. Es verwendet den logischen Operator AND, um den Attributwert mit der konstante IS_INDEXED zu vergleichen.
  • Wenn der Vergleich den Wert True zurückgibt, dann wird das Attribut indiziert. Dies wird mit einer entsprechenden Ausgabe quittiert.
  • Andernfalls wird das Attribut nicht indiziert. Auch dies wird mit einer Ausgabe bestätigt.

Script 5.51: Lesen des Attributs searchFlags, um festzustellen, ob ein Attribut indiziert wird



1

2

3

4

5

6

7

8

9

10

11

12

13

Const IS_INDEXED = 1

strAttributeName = "cn=given-name"


Set objRootDSE = GetObject("LDAP://rootDSE")

Set objSchemaAttribute = GetObject("LDAP://" & strAttributeName & "," & _

objRootDSE.Get("schemaNamingContext"))


intSearchFlags = objSchemaAttribute.Get("searchFlags")

If IS_INDEXED AND intSearchFlags Then

Wscript.Echo strAttributeName & " is indexed."

Else

Wscript.Echo strAttributeName & " not indexed."

End If

Wenn Sie das Script ausführen, sehen Sie die folgende Ausgabe:

cn=given-name is indexed.

Attribute, die sowohl zum globalen Katalog-Server repliziert als auch indiziert werden

Im Idealfall sollten Suchoperationen Attribute verwenden, die zum globalen Katalog-Server repliziert und indiziert werden.

Warnung


Sie können die Attribute des Schemas auch von Hand so konfigurieren, dass Sie zum globalen Katalog-Server repliziert oder indiziert werden - zum Beispiel über das Snap-In Active Directory Schema. Sie sollten jedoch bei der Änderung des Schemas Vorsicht walten lassen. Wenn Sie das Schema beschädigen, dann kann es zu schweren Fehlern in Active Directory kommen.

Script 5.52 zeigt, wie Sie eine Suchoperation durchführen, mit der Sie alle Attribute zurückerhalten, die sowohl indiziert als auch zum globalen Katalog-Server repliziert werden. Das Script geht hierzu folgendermaßen vor:

  1. Es definiert die Konstante IS_INDEXED mit dem Wert 1, um später feststellen zu können, ob das Attribut indiziert wird.
  2. Es verwendet den rootDSE, um die Variable strADsPath mit dem Wert des Attributs schemaNamingContext zu initialisieren.
  3. Es verwendet ADO, um alle AttributeSchema-Objekte abzufragen und für diese die Attribute lDAPDisplayName, isMemberOfPartialAttributeSet und searchFlags zurückzugeben.
    Der Filter objectCategory=AttributeSchema gibt alle Schema-Attribute zurück.
  4. Es verwendet eine While-Wend-Schleife, um alle Einträge des Ergebnissatzes zu lesen.
  5. Bei jedem Eintrag im Ergebnissatz wird festgestellt, ob das Attribut an die globalen Katalog-Server repliziert wird und ob es indiziert wird (Zeilen 20 und 21).
    Wenn beide Bedingungen den Rückgabewert True haben, dann wird das Attribut lDAPDisplayName des Attributs ausgegeben (aus der Variable strAttribute).

Script 5.52: Attribute auflisten, die indiziert und zum globalen Katalog repliziert werden



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

Const IS_INDEXED = 1


Set objConnection = CreateObject("ADODB.Connection")

objConnection.Open "Provider=ADsDSOObject;"


Set objCommand = CreateObject("ADODB.Command")

objCommand.ActiveConnection = objConnection


Set objRootDSE = GetObject("LDAP://rootDSE")

strADsPath = "<LDAP://" & objRootDSE.Get("schemaNamingContext") & ">"

objCommand.CommandText = strADsPath & _

";(objectCategory=AttributeSchema);" & _

"lDAPDisplayName,isMemberOfPartialAttributeSet,searchFlags;onelevel"


Set objRecordSet = objCommand.Execute

Wscript.Echo "Attribute die indiziert und zum GC repliziert werden: "

While NOT objRecordSet.EOF

strAttribute = objRecordSet.Fields("lDAPDisplayName")

If objRecordSet.Fields("isMemberOfPartialAttributeSet") AND _

(IS_INDEXED AND objRecordSet.Fields("searchFlags")) Then

Wscript.Echo strAttribute

End If

objRecordSet.MoveNext

Wend

objConnection.Close

Wenn Sie das Script ausführen, erhalten Sie eine Ausgabe wie die folgende:

Attribute die indiziert und zum GC repliziert werden:
AltSecurityIdentities
cn
displayName
mail
...
name
sAMAccountName
sAMAccountType
servicePrincipalName
sIDHistory
sn

Operative Attribute

Nicht alle Attributwerte werden im Verzeichnisdienst gespeichert. Einige Attributwerte werden erst dann berechnet, wenn Sie abgefragt werden. Diese Attribute nennt man operative Attribute. Sie werden wie alle anderen Attribute auch im Schema definiert.

Sie sollten wissen, welche Attribute operative Attribute sind, da Sie diese Attribute nicht in den lokalen Zwischenspeicher laden können, bevor Sie nicht explizit die Methoden GetInfo oder GetInfoEx aufgerufen haben.

Script 5.53 fragt ab, welche Attribute im Schema operativ sind. Hierzu geht es folgendermaßen vor:

  1. Es definiert die Konstante ADS_SYSTEMFLAG_ATTR_IS_CONSTRUCTED mit dem Wert &h4.
  2. Es verwendet den rootDSE, um die Variable strADsPath mit dem Attribut schemaNamingContext zu initialisieren.
  3. Es verwendet ADO, um alle Objekte vom Typ AttributeSchema abzufragen und die Attribute lDAPDisplayName und systemFlags dieser Attribute zurückzugeben.
  4. Es verwendet eine While-Wend-Schleife, um jeden Eintrag im Ergebnissatz durchzugehen.
  5. Für jeden Eintrag im Ergebnissatz stellt es fest, ob das Attribut operativ ist (Zeilen 19 und 20).
  • Wenn das der Fall ist, dann zeigt es dass Attribut lDAPDisplayName des Attributs an (aus der Variable strAttribute).

Script 5.53: Prüfen, ob ein Attribut operativ ist



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

Const ADS_SYSTEMFLAG_ATTR_IS_CONSTRUCTED = &h4


Set objConnection = CreateObject("ADODB.Connection")

objConnection.Open "Provider=ADsDSOObject;"


Set objCommand = CreateObject("ADODB.Command")

objCommand.ActiveConnection = objConnection


Set objRootDSE = GetObject("LDAP://rootDSE")

strADsPath = "<LDAP://" & objRootDSE.Get("schemaNamingContext") & ">"

objCommand.CommandText = strADsPath & _

";(objectCategory=AttributeSchema);" & _

"lDAPDisplayName,systemFlags;onelevel"


Set objRecordSet = objCommand.Execute

Wscript.Echo "Operative Attribute: "

While NOT objRecordSet.EOF

strAttribute = objRecordSet.Fields("lDAPDisplayName")

If ADS_SYSTEMFLAG_ATTR_IS_CONSTRUCTED AND _

objRecordSet.Fields("systemFlags") Then

Wscript.Echo strAttribute

objRecordSet.MoveNext

End If

Wend

objConnection.Close

Wenn Sie das Script ausführen, erhalten Sie eine Ausgabe wie die folgende:

Operative Attribute:
allowedAttributes
allowedAttributesEffective
allowedChildClasses
allowedChildClassesEffective
aNR
attributeTypes
canonicalName
createTimeStamp
...

Dn151181.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).pngZum Seitenanfang

Die ADSI-Architektur

Wenn Sie saubere ADSI-Scripte schreiben möchten, dann ist es wichtig, dass Sie die Architektur von Active Directory kennen und verstehen. Auch das ADSI-Objektmodell sollten Sie kennen - inklusive der ADSI-Dateien, der logischen Komponenten, der verfügbaren ADSI-Provider und der möglichen Schnittstellen.

Das ADSI-Objektmodell

ADSI ist eine Sammlung von DLLs (Dynamic Link Libraries), die von Clientanwendungen wie zum Beispiel dem Windows Script Host (WSH) und dem Snap-In Active Directory Benutzer und Computer zum Zugriff auf Active Directory genutzt werden können.

Wenn Sie eine Bindung in einem ADSI-Script einrichten, verwendet das Script den Moniker im ADsPfad, um die entsprechende ADSI-Provider-DLL zu laden (wenn Sie zum Beispiel den Moniker LDAP angegeben, wird die LDAP-DLL geladen - Adsidp.dll). Die ADSI-Provider-DLL erstellt ein COM-Objekt (Component Object Model). Das COM-Objekt wird dem Script als Referenz zurückgegeben und diese wird über den Befehl Set einer Variablen zugewiesen.

Jedes Objekt stellt Schnittstellen zur Verfügung. Eine Schnittstelle ist eine Gruppe von Methoden. Mit diesen Methoden können Sie bestimmte Aufgaben durchführen. Um Active Directory zu bearbeiten, haben Sie zum Beispiel die Methoden Create, Put, Get und Delete verwendet - diese Methoden werden alle über eine Schnittstelle mit dem Namen IADs zur Verfügung gestellt. In Abbildung 5.7 sehen Sie die Zusammenhänge zwischen einer Bindung, einem Provider, einem COM-Objekt, seinen Schnittstellen und Active Directory.

Dn151181.A33B84A80B555F4878A9A7BDA08C618F(de-de,TechNet.10).png

Abbildung 5.7: Ein COM-Objekt zum Zugriff auf ein Active Directory-Objekt erstellen

In Abbildung 5.7 sehen Sie, wie der LDAP-Provider eine Instanz eines COM-Objekts erstellt. Der Provider stellt fest, dass MyerKen in der OU HR der Domäne na.fabrikam.com ein Benutzerobjekt ist. Daher erstellt er ein COM-Objekt mit den Schnittstellen zur Arbeit mit Benutzerobjekten. In der Abbildung sind nur drei Schnittstellen zu sehen. IADs und IADsUser sind zwei Schnittstellen, die ADSI-Scripte bei der Arbeit mit Benutzerobjekten verwenden, und die Schnittstelle IUnknown wird an jedes COM-Objekt angehängt - sie ist die Basisschnittstelle für alle anderen Schnittstellen..

Mit dem Befehl Set erhalten Sie in der Variable objUser eine Referenz auf das neue Objekt.

ADSI-Komponenten

Unter Windows NT-basierten Computern finden Sie ADSI im Ordner systemroot\System32. Es setzt sich aus den Dateien ActiveDS.dll, ActiveDS.tlb und DLLs (alle DLLs, deren Name mit ads anfängt - zum Beispiel Adsldp.dll). Außerdem werden bei der Installation von ADSI einige andere DLLs aktualisiert - zum Beispiel Wldap32.dll.

ADSI ist eine Systemkomponente von Windows 2000, Windows XP und Windows Server 2003. Unter diesen Betriebssystem muss also nichts installiert werden. Unter den Betriebssystemen Windows® 95, Windows® 98, Windows® Millennium Edition (Me) oder Windows NT 4.0 sieht das anders aus. Informationen zur Installation von ADSI unter diesen Betriebssystemen finden Sie unter dem Link Active Directory Service Interfaces unter https://www.microsoft.com/windows/reskits/webresources (englischsprachig).

ADSI-Schichten

Die ADSI-Architektur können Sie sich als fünf Schichten vorstellen:

  • Verzeichnis oder Namespace
  • ADSI-Provider
  • ADSI-Router und Registrierung
  • Eigenschafts-Zwischenspeicher
  • ADSI-Anwendung

Dn151181.60EFDBD809902AC82BCB929BF944B544(de-de,TechNet.10).png

Abbildung 5.8: Die ADSI-Architektur

Die fünf Schichten aus Abbildung 5.8 finden sich auf zwei Seiten wieder. Die unterste Schicht (Verzeichnis oder Namespace) befindet sich auf den Computern, die Active Directory zur Verfügung stellen (den Domänencontrollern), und die restlichen Schichten befinden sich auf den Clients.

Verzeichnis oder Namespace

Der Verzeichnisdienst (Active Directory) speichert Informationen und stellt diese Informationen Benutzern und Anwendungen zur Verfügung. Beim Verzeichnisdienst handelt es sich um eine Datenbank.

Ein Namespace ist ein Bereich, in dem Namen aufgelöst werden können. Der DNS-Namespace (Domain Name System) ist zum Beispiel ein Domänenbaum, der Hostnamen und IP-Adressen speichert. Die Clientcomputer verwenden den DNS-Namespace, um Hostnamen in IP-Adressen aufzulösen. Ein Verzeichnis-Namespace ist ein Bereich, in dem die Namen von Verzeichniselementen in die entsprechenden Objekte aufgelöst werden können. Bei Active Directory handelt es sich beim Namespace um die Gesamtstruktur. Die Namen der einzelnen Active Directory-Objekte können über diesen Namespace in Objekte (zum Beispiel Domänen, Benutzerkonten, OUs und Computer) aufgelöst werden.

Der Provider

ADSI ist kein Teil von Active Directory selbst. Es stellt nur die Schnittstellen zu Active Directory und dessen Namespace zur Verfügung. Über die folgenden Namespaces können Sie auf Active Directory zugreifen:

  • LDAP
  • SAM-Datenbank (Security Accounts Manager)
  • IIS-Metabase (Internet Information Services)
  • NDS (Novell NetWare Directory Services)
  • NetWare Bindery

ADSI-Provider greifen auf den Namespace zu und erstellen virtuelle Gegenstücke für die Objekte, die Sie über die ADSI-Schnittstellen bearbeiten wollen. Unter den ADSI-DLLs gibt es hierzu einige Provider-DLLs (Tabelle 5.5).

Tabelle 5.5: ADSI-Provider und die Verzeichnisdienste, auf die sie zugreifen

Provider

Zugriff auf

LDAP

LDAP-Verzeichnisse der Versionen 2 und 3 - inklusive Active Directory.

GC

Globaler Katalog der Active Directory-Domäne. Der Provider GC entspricht dem Provider LDAP - er verwendet jedoch die TCP-Portnummern 3268.

ADSI OLE DB

Active Directory für Suchoperationen.

WinNT

Windows NT-Domänen und die lokale Kontendatenbank unter Windows NT/Windows 2000/Windows XP/Windows Server 2003.

IIS

IIS-Metabase

NDS

Novell NetWare Directory Services.

NWCOMPAT

Novell Netware Bindery.

ADSI-Provider arbeiten als Vermittler zwischen einem Verzeichnis-Namespace und einer ADSI-Anwendung. Alle Scripte in diesem Kapitel bauen eine Bindung an den LDAP-Provider oder den GC-Provider auf.

Dn151181.note(de-de,TechNet.10).gifAnmerkung:

Bei den Providernamen wird zwischen Groß- und Kleinbuchstaben unterschieden. Achten daher Sie besonders beim Provider WinNT auf die korrekte Schreibweise.

Die Bindung an ein Verzeichnis unterscheidet sich bei den unterschiedlichen Providern. Sie beginnt jedoch immer mit dem Namen des Providers, gefolgt von einem Doppelpunkt und zwei Slash-Zeichen. Danach muss der Pfad zu dem Verzeichnis angegeben werden, zu dem Sie die Bindung aufbauen möchten.

Wie bereits weiter oben in diesem Kapitel erklärt, handelt es sich beim ADsPfad (AdsPath) um den Namen des Providers und den Pfad zum Verzeichnisobjekt. Beispiele für ADsPfade sind:

  • LDAP-Provider mit dem Pfad zu einem Domänencontroller der Domäne na.fabrikam.com:
    LDAP://dc=NA,dc=fabrikam,dc=com.
    Beachten Sie, dass in diesem Beispiel kein bestimmter Domänencontroller angegeben wird sondern nur der Name der Domäne selbst. Diese Art der Bindung wird serverlose Bindung genannt.
  • GC-Provider mit Pfad zu einem globalen Katalog-Server der Domäne na.fabrikam.com:
    GC://dc=NA,dc=fabrikam,dc=com.
  • WinNT-Provider mit Pfad zu einem Domänencontroller der Domäne na.fabrikam.com:
    WinNT://NA.
  • IIS-Provider mit Pfad zum IIS-Server sea-dc-01.na.fabrikam.com:
    IIS://sea-dc-01.na.fabrikam.com.
  • NDS-Provider mit Pfad zum Verzeichnisserver der Domäne na.fabrikam.com:
    NDS://server01/o=org01/dc=com/dc=fabrikam/dc=na.
  • NWCOMPAT-Provider mit Pfad zu einem Bindery-Server:
    NWCOMPAT://server01.

Der Provider ADSI OLE DB verwendet dieselbe Syntax für den ADsPfad wie die Provider LDAP und GC - nur mit einigen weiteren Parametern. Diese Parameter definieren die zurückzugebenden Suchergebnisse.

Tipp


Verwenden Sie den rootDSE, damit Sie keine DNs in den ADsPfad eintragen müssen.

Es gibt noch einen besonderen Provider mit dem Namen ADSI-Namespace. Mit diesem Provider können Sie eine Liste aller anderen Provider zurückgeben. Script 5.54 demonstriert dies.

Script 5.54: Eine Liste der installierten ADSI-Provider anzeigen



1

2

3

4

Set objProvider = GetObject("ADs:")

For Each Provider In objProvider

Wscript.Echo Provider.Name

Next

Wenn Sie das Script ausführen, erhalten Sie eine Liste der installierten ADSI-Provider. Die folgende Ausgabe wurde zum Beispiel auf einem Computer unter Windows 2000 Professional generiert:

WinNT:
NWCOMPAT:
NDS:
LDAP:
IIS:

Warnung


Auch wenn es möglich ist zumindest Teile der Active Directory-Objekte über den Provider WinNT zu verwalten, ist dies nicht empfehlenswert. Die Verwendung dieses Providers kann schwerwiegende Auswirkungen auf die Leistung und die Fehleranfälligkeit des Scripts haben.

Router

Wenn ein Script die Funktion GetObject verwendet, dann erhält der ADSI-Router eine Anfrage. Er identifiziert den Provider der angefordert wurde, sucht in der Registrierung nach Informationen über diesen Provider und lädt diesen dann in den Speicher (der Provider wird anhand der angegeben ProgID identifiziert). Der Provider übergibt das angeforderte Element später an den Router und dieser erstellt das ADSI-Objekt, das an das Script übergeben wird.

Eigenschafts-Zwischenspeicher

Gleich nach dem Aufbau der Bindung wird ein Speicherbereich für das virtuelle Active Directory-Objekt reserviert. Das Objekt und seine Attribute werden jedoch noch nicht aus Active Directory heruntergeladen.

ADSI-Anwendung

Dies ist die oberste Schicht im ADSI-Schichtmodell. Die Scripte aus diesem Kapitel sind Beispiele für ADSI-Anwendungen - ebenso das Snap-In ADSI-Edit.

ADSI-Schnittstellen

Jede Schnittstelle stellt Methoden zur Verfügung. Die Methoden führen entweder Aktionen aus oder geben Informationen über ein Objekt zurück. Methoden, die Aktionen ausführen, werden auch Methoden genannt. Im Gegensatz dazu werden Methoden, die einfach nur Informationen zurückgeben, Eigenschaften oder Attribute genannt.

Ob eine Schnittstelle zur Verfügung steht oder nicht, hängt vom verwendeten Provider ab. Der LDAP-Provider implementiert die Schnittstelle IADsADSystemInfo zum Beispiel nicht, da diese speziell zur Abfrage von Informationen über Clientcomputer dient - der LDAP-Provider fragt seine Informationen aber von Domänencontrollern ab.

Außerdem verwenden Provider nicht unbedingt alle Methoden einer Schnittstelle. Der LDAP-Provider implementiert zum Beispiel die Methode CopyHere der Schnittstelle IADsContainer nicht.

Eine Liste der von den Providern unterstützten Schnittstellen finden Sie unter dem Link Active Directory Programmer's Guide unter https://www.microsoft.com/windows/reskits/webresources (englischsprachig). Suchen Sie dort nach dem Text "Provider Support of ADSI Interfaces."

Kategorisierung von Schnittstellen

Die Kategorisierung der Schnittstellen vereinfacht die Suche nach der passenden Schnittstelle für eine bestimmte Aufgabe. In Tabelle 5.6 sehen Sie die Schnittstellenkategorien, eine allgemeine Beschreibung zu den Kategorien und die Schnittstellen in diesen Kategorien.

Tabelle 5.6: Schnittstellen, die der LDAP-Provider implementiert

Kategorie

Verwendung durch den LDAP-Provider

Schnittstellen

Core

Allgemeine Schnittstelle für die Interaktion mit fast jedem Objekt eines Verzeichnisses.

IADs, IADsContainer, IADsNamespaces, IADsOpenDSObject

Schema

Zur Verwaltung und Erweiterung des Schemas.

IADsClass, IADsProperty, IADsSyntax

Property Cache

Zur Interaktion mit dem lokalen Zwischenspeicher.

IADsPropertyEntry, IADsPropertyList, IADsPropertyValue, IADsPropertyValue2

Persistent Object

Zur Interaktion mit bestimmten Objekttypen.

IADsGroup, IADsLocality, IADsMembers, IADsO, IADsOU, IADsPrintQueue, IADsUser

Dynamic Object

Zur Interaktion mit den veröffentlichten Druckern.

IADsPrintQueueOperations

Security

Zur Interaktion mit DACLs von Objekten.

IADsAccessControlEntry, IADsAccessControlList, IADsSecurityDescriptor

Non-Automation

Low-Level-Zugriff auf Objekte. Stehen über Scriptsprachen nicht zur Verfügung.

IDirectoryObject, IDirectorySearch

Extension

Zum Hinzufügen von Methoden zu bestehenden Objekten.

IADsExtension

Utility

Hilfsfunktionen.

IADsDeleteOps, IADsPathname, IADsObjectOptions

Data Type

Verarbeitung von Attributen, die als Datentyp Large Integer (64-Bit) gespeichert sind.

IADsLargeInteger

LDAP-Provider-Objekte und deren Schnittstellen

Indem die Schnittstellen nach den von ihnen unterstützen Objekten in Gruppen eingeteilt werden, ist es einfacher, die Methoden und Eigenschaften eines Objektes festzustellen. Eine Tabelle der ADSI-Objekttypen des DAP-Providers finden Sie unter dem Link Active Directory Programmer's Guide https://www.microsoft.com/windows/reskits/webresources. Suchen Sie dort nach dem Text "ADSI Objects of LDAP." Tabellen zu den anderen Providern finden Sie, indem Sie nach den Texten "ADSI Objects for WinNT", "ADSI Objects for NDS" und "ADSI Objects of NWCOMPAT" suchen.

Eigenschaften von IAD

Die Schnittstelle IAD stellt sechs schreibgeschützte Eigenschaften zur Verfügung, über die Sie jedes Objekt im Verzeichnis identifizieren können.

  • AdsPath - gibt einen String mit dem vollqualifizierten Pfad des Objekts zurück
  • Class - gibt einen String mit dem Namen der Schemaklasse des Objekts zurück.
  • GUID - gibt einen String mit der GUID (Globally Unique Identifier) des Objekts zurück.
  • Name - gibt einen String mit dem RDN eines Objekts zurück.
  • Parent - gibt einen String mit dem ADsPfad des übergeordneten Objekts zurück.
  • Schema - gibt einen String mit der Schemaklasse des Objekts zurück.

Script 5.55 zeigt mit Hilfe der IAD-Eigenschaften Informationen über die Domäne na.fabrikam.com an.

Script 5.55: Abfragen von Informationen über die IAD-Eigenschaften



1

2

3

4

5

6

7

Set objDomain = GetObject("LDAP://dc=NA,dc=fabrikam,dc=com")

Wscript.Echo "ADsPath:" & objDomain.ADsPath

Wscript.Echo "Class:" & objDomain.Class

Wscript.Echo "GUID:" & objDomain.GUID

Wscript.Echo "Name:" & objDomain.Name

Wscript.Echo "Parent:" & objDomain.Parent

Wscript.Echo "Schema:" & objDomain.Schema

Wenn Sie das Script ausführen, erhalten Sie die folgende Ausgabe:

ADsPath:LDAP://dc=NA,dc=fabrikam,dc=com
Class:domainDNS
GUID:618a1da520255a41ab778f5dc1d8da4d
Name:dc=NA
Parent:LDAP://dc=fabrikam,dc=com
Schema:LDAP://schema/domainDNS

Eigenschaften von IADsContainer

IADsContainer stellt nur eine schreibgeschützte Eigenschaft zur Verfügung.

  • Filter - gibt die Klassen der gefilterten Objekte zurück.

Script 5.56 demonstriert die Verwendung der Eigenschaft Filter. Es listet die Inhalte der OU HR auf.

Script 5.56: Anzeigen der Eigenschaft Filter



1

2

3

4

5

6

Set objOU = GetObject("LDAP://OU=HR,dc=NA,dc=fabrikam,dc=com")

ObjOU.Filter= Array("Computer", "User")

Wscript.Echo "Filter:"

For each strObject in objOU.Filter

Wscript.Echo vbTab & strObject

Next

Wenn Sie das Script ausführen, erhalten Sie die folgende Ausgabe:

Filter:
        Computer
        User

Weitere Informationen über die Methoden von IADsContainer finden Sie in den entsprechenden Abschnitten dieses Kapitels:

  • Filter - Auflistender Active Directory-Objekte in einem Container
  • Create - Erstellen von Active Directory-Objekten
  • Delete - Löschen von Active Directory-Objekten
  • MoveHere - Verschieben und Umbenennen von Objekten

Dn151181.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).pngZum Seitenanfang

| Home | Technische Artikel | Community