Active Directory-Scripting

Über ADSI lassen sich viele Aufgaben im Active Directory durchführen. Zu den wichtigsten zählt die Verwaltung von Benutzern, die im zweiten Teil dieser Serie näher beleuchtet wird. Dabei werden verschiedene Aspekte wie insbesondere die Aktivierung von Benutzerkonten und das Kennwortmanagement besprochen.

In diesem zweiten Teil der Serie wird die Verwaltung von Benutzern weiter ausgeführt, nachdem im ersten Teil (Ausgabe 10/2005) Grundzüge besprochen wurden. Zu den Themen gehört neben der Erstellung von Benutzerkonten auch ihre Aktivierung und der Umgang mit Kennwörtern und Kennwortoptionen.

Außerdem wird näher darauf eingegangen, wie weitere Attribute gesetzt werden können und wo sich weiterführenden Informationen zu diesen finden, um sie gezielt setzen zu können.

Benutzer anlegen

An einem Beispiel wurde im ersten Teil unserer Artikelserie bereits gezeigt, wie OUs und Benutzerkonten erstellt werden können. Dieses Beispiel findet sich noch einmal in Listing 1.

Listing 1: Die Erstellung einer OU und eines Benutzers
set domObject = GetObject("LDAP://dc=kuppinger,dc=net")
set ouObject1 = domObject.Create("organizationalUnit","ou=Testbenutzer")
ouObject1.Put "description","OU für Testbenutzer"
ouObject1.SetInfo
WScript.Echo "OU wurde erstellt"
set ouObject2 = GetObject("LDAP://ou=Testbenutzer,dc=kuppinger,dc=net")
set userObject = ouObject2.Create("user","cn=Testbenutzer1")
userObject.Put "sAMAccountName","Testbenutzer1"
userObject.Put "description", "Erster Testbenutzer"
userObject.SetInfo
WScript.Echo "Benutzer wurde angelegt"

Dabei wird deutlich, dass die Grundstruktur von Anwendungen zum Anlegen neuer Benutzer recht einfach ist. Der Kontext wird auf eine OU gesetzt, in der anschließend ein Objekt der Klasse user erstellt wird. Für dieses Objekt werden Attribute definiert, die mit der Methode SetInfo in das Active Directory geschrieben werden. Der einzige Fehler bei diesem sehr einfachen Ansatz ist, dass die so erstellten Benutzerobjekte noch nicht aktiviert sind.

Das lässt sich allerdings mit relativ wenig Code ändern, wobei es nicht ganz so trivial ist, den Code zu verstehen. Bevor diese Änderung in Listing 2 vorgestellt wird, macht es aber Sinn, sich näher zu betrachten, was genau beim Anlegen von Benutzern geschieht.

Auch wenn, wie in Listing 1 zu sehen ist, zunächst nur zwei Attribute gesetzt werden, von denen sogar nur eines wirklich zwingend ist, werden doch tatsächlich über vierzig Attribute definiert. Das liegt daran, dass viele Attribute auf Standardwerte gesetzt werden:

  • pwdLastSet wird so konfiguriert, dass der Benutzer bei der nächsten Anmeldung sein Kennwort ändern muss.

  • userAccountControl wird so konfiguriert, dass kein Kennwort erforderlich ist.

  • userAccountControl wird aber auch so konfiguriert, dass das Konto deaktiviert ist.

Das Attribut userAccountControl ist daher auch für die Aktivierung von Kennwörtern von Bedeutung. Es handelt sich um eines der Attribute im Active Directory, bei dem jedes Bit eine andere Bedeutung hat und aktiviert bzw. deaktiviert werden kann. Diese Attribute sind bedauerlicherweise etwas unhandlich, weil man genau wissen muss, welches Bit man innerhalb des Attributs jeweils zu manipulieren ist.

Dass einige Einstellungen bereits bei der Erstellung gesetzt werden, wird beim Blick auf die Eigenschaften eines Benutzers deutlich. Dort sind zwar viele Felder leer, aber für Optionen wie Konto läuft ab im Register Konto wird bereits ein Standardwert definiert (Bild 1).

Bild 1: Viele Attribute von Benutzern werden mit Standardwerten konfiguriert.
Bild 1: Viele Attribute von Benutzern werden mit Standardwerten konfiguriert.


Wichtig ist, dass alle zwingend erforderlichen Attribute bereits gesetzt wurden. Um ein Benutzerkonto zu aktivieren, muss also nur noch der Wert des Feldes userAccountControl angepasst werden. Listing 2 zeigt eine mögliche Vorgehensweise dafür.

Listing 2: Listing zum Anlegen und Aktivieren von
Benutzerkonten
Const ADS_UF_ACCOUNTDISABLE = 2
set ouObject2 = GetObject("LDAP://ou=Testbenutzer,dc=windowstest,dc=intra")
set userObject = ouObject2.Create("user","cn=Testbenutzer2")
userObject.Put "sAMAccountName","Testbenutzer2"
userObject.Put "description", "Zweiter Testbenutzer"
userObject.SetInfo
WScript.Echo "Benutzer wurde angelegt"
intUAC = userObject.Get("userAccountControl")
If intUAC AND ADS_UF_ACCOUNTDISABLE Then
userObject.Put "userAccountControl", intUAC XOR ADS_UF_ACCOUNTDISABLE
userObject.SetInfo
End If
WScript.Echo "Benutzer wurde aktiviert"