DSAdd, DSQuery, DSMod, DSGet, DSMove, DSrm

Als Alternative unter PowerShell eigenen sich die Commandlets aus RSAT AD-PowerShell besser.

Seit dem Active Directory nutzen alle Administratoren die Management Konsole zum Anlegen, Pflege, und Löschen von Benutzer, Gruppen und anderen Objekten. Das ist allerdings nur bis zu einem bestimmten Maße brauchbar. Wenn Sie z.B.: hundert Studenten zum Semesteranfang anlegen müssen oder anhand einer umfirmierung bei allen usern die Adressdaten anpassen müssen, ist eine automatische oder skriptgesteuerte Lösung gefragt. Es gibt natürlich auch hier Programme wie ADModify und LDIFDE und auch mit VBScript können Sie eine Lösung schreiben. Aber wie wäre eine passable Kommandozeile zur Anpassung von Benutzern ?

Die Tools laufen auch auf WIndows 200 SP3 und höher mit einem Registryschlüssel
325465 Windows 2000 domain controllers require SP3 or later when using Windows Server 2003 administration tools
Der Registrykey teilt DSMOD etc. mit, dass Sie LDAP-Verkehr nicht verschlüsseln sollen, was Windows 2000 noch  nicht kann.

Genau das liefert Microsoft mit den folgenden Programmen in Windows 2003 mit aus.

  • DSAdd
    Fügt neue Objekte zum AD hinzu
  • DSQuery
    Fragt das AD nach bestimmten Objekten ab
  • DSMod
    Modifiziert bereits bestehende Objekte
  • DSGet
    Holt bestimmte Eigenschaften von Objekten und zeigt diese an
  • DSMove
    Verschiebt Objekte z.B.: zwischen OU's
  • DSrm
    Löscht bestehende Objekte

Starten Sie doch einfach mal eine DOS-Box und geben Sie einen der Befehle ein. Die Hilfe wird sie direkt auf die Optionen hinweisen.

Ein paar Beispiele

Um die Funktionsweise von diesen kleinen aber feinen Tools besser zu verstehen, habe ich hier mal ein paar Beispiele aufgeführt. Die meisten einfachen Beispiele sind natürlich in folgendem TechNet Artikel beschrieben:

  • 322684 How To use the Directory Service Command-Line Tools to Manage Active Directory Objects in Windows Server 2003

Aber was die wenigsten wissen ist die Fähigkeit, die Befehle zu verketten. So kann man die DSQuery Objekte suchen und die Liste der Objekte dann mittels "Pipe" an das nächste Programm übergeben. Fangen wir aber mal einfach an. Folgende einfach Zeile listet die Benutzer in der OU "users".

dsquery user domainroot

Die Ausgabe ergibt bei mir ein:

Im nächsten Schritt interessieren mich von diesen Objekten natürlich die Mailadresse.

dsquery user cn=users,dc=msxfaq,dc=local | dsget user -email

Die Ausgabe ist natürlich etwas ernüchternd, wenn es noch nicht viele Benutzer mit Mailadresse gibt. Hier ist es im wesentlichen der Administrator die Systemmailbox und die beiden Benutzer RUSTest1 und RUSTest2

Zuletzt mache ich mir die Funktion von DSQuery zu nutzen, das Kennwortalter eines Kontos zu prüfen. Dies ist ein recht einfacher Weg, um inaktive Computerkonten zu finden. Per Default ändert eine Workstation in einer Domäne alle 30 Tage ihr Kennwort. (Quelle: Windows 2003 Hilfe auf http://www.Microsoft.com/technet/prodtechnol/windowsserver2003/de/library/ServerHelp/8af78a8c-6e66-4420-9ee7-d82dd1c9e0c6.mspx . Windows NT4 hat alle 7 Tage das Computerkennwort geändert, siehe 175468 Effects of machine account replication on a domain)

dsquery computer forestroot -o samid -stalepwd 60

Nun erhalten ich die Computer, die seit 60 Tagen nicht mehr eingeschaltet waren. Das ist oft ein gutes Kriterium für alte Computerkonten. Zumindest sind diese Systeme schon lange nicht mehr aktuell im Bezug auf Patches und Virenscanner und sollten daher etwas genauer untersucht werden.

Durch die Übergabe über die "PIPE" an das nachfolgende Programm können Sie natürlich mittels DSADD solch eine Liste natürlich auch als Quelle für massenhafte Veränderungen an diesen Objekten verwenden. Die Hilfe von DSADD /? hilft ihnen hier weiter. Das ganze ist natürlich schon sehr ein Hinweis auf PowerShell, wo ähnliche Konzepte mit "pipe" bestehen.

Der Einsatz der DS-Tools ist sehr effektiv für häufige Aktionen, z.B. die Anzeige von inaktiven Konten etc. Allerdings ist kein voller Zugriff auf alle Eigenschaften möglich, so dass Sie bei umfangreicheren Dingen doch wieder auf VBScript umsteigen müssen.

Ein weiterer Einsatzzweck ist z.B. das Abgleichen oder Kopien von Gruppenmitgliedschaften. Das funktioniert aber nur innerhalb des gleichen Forest. für eine Migration kann es aber ganz hilfreich sein.

dsget group "cn=gruppe1,ou=gruppen,DC=local" -members | dsmod group "cn=gruppe1,ou=gruppen,DC=local" -chmbr -c

Einschränkungen

Wo so viel Licht ist, ist der Schatten um zu schwerer zu akzeptieren. So erlaubt DSMOD nur die die Modifikation der bekannten Attribute. Die für einen Exchange Admin interessanten Attribute sind nicht erreichbar, z.B.:

  • ExtensionAttribute1-15
  • msExchUseOAB
  • Exchange Quotas
  • Und viele mehr

Hier braucht es dann doch wieder andere Werkzeuge oder ein eigenes VBScript.

ModADAttr.vbs

Da DSMOD die Exchange Attribute nicht verändern kann, habe ich mir schnell ein VBScript geschrieben welches die Objekte per STDIN von DSQUERY bekommt und ein Feld mit einem Wert füllt. Der Aufruf ist dann wieder bekannt

dsquery * ou=test,dc=msxfaq,dc=local -uco | cscript //U setADAttrib.vbs /a:"ExtensionAttribute8" /v:"Test"

Da DSQUERY allerdings ASCII verwendet und VBSCRIPT ANSI erwartet muss man beiden sagen, dass DSQUERY entsprechend "UNICODE" ausgibt und CSCRIPT die Eingabe als UNICODE akzeptiert. Dann funktioniert das ganze auch mit umlauten im distinguishedName.

setadattrrib.1.0.vbs.txt

Irgendwann möchte ich das Skript noch erweitern um Möglichkeiten Felder zu lesen und zu ersetzen, z.B.: um den Inhalt aus "mail" in "TargetAddress" zu kopieren.

Weitere Links