csvde.exe ist ein Hilfsprogramm, das auf der Kommandozeile von Windows 2000 Server und Windows Server 2003 verfügbar ist. Es wird nicht mit dem Adminpak auf einer Workstation installiert. Wenn man es auf einer Workstation verwenden möchte, kann man aber einfach die Datei „csvde.exe“ aus dem %systemroot%system32-Ordner eines Servers auf die Workstation kopieren.
csvde kennt zwei Betriebsarten: Man kann damit Daten aus dem Active Directory exportieren, und man kann Daten aus einer Textdatei (CSV-Format) importieren.
Export
Der Export ist in den meisten Fällen relativ einfach. Über Kommandozeilenschalter kann es gesteuert werden. Es ist in den meisten Fällen sinnvoll, mit „-u“ den Unicode-Modus zu nutzen, weil sonst alle Felder mit Umlauten oder anderen erweiterten Zeichen unlesbar codiert ausgegeben werden. Aber Achtung: Wer vorhat, die CSV-Datei per Skript über den Jet-Provider als Datenbank anzusprechen, darf sie nicht in Unicode speichern, sondern muss die Datei im ANSI-Format ablegen.
Mein kleines Tool „Carlos“ kann beim Aufbau des Kommandozeilenbefehls gute Dienste leisten (nebenbei lernt man durch die generierten Befehle auch einiges über den Aufbau von LDAP-Filterdefinitionen).
Achtung: Beim Export gibt es eine Beschränkung, die ich noch nirgends dokumentiert gefunden habe. Wenn Gruppen exportiert werden, werden ab einer gewissen Größe der Gruppe die Mitglieder nicht mehr mit exportiert! Leider habe ich noch keinen Anhalt gefunden, warum das so ist, ob man es ändern kann und wo die Grenze liegt. Irgendwo zwischen acht und 15 Mitgliedern wird nicht mehr exportiert (wenn es wenige Mitglieder sind, werden alle exportiert, sind es „zu viele“, bleibt die Liste ganz leer). Das ist sehr ärgerlich und äußerst mysteriös. Anders als zunächst vermutet, tritt dieses Phänomen auch unter Windows Server 2003 auf.
Hier ein Beispiel. Das folgende Kommando exportiert alle AD-Objekte, die in einer Exchange-Umgebung Mailadressen haben können (Benutzer, Gruppen, Verteilergruppen, Kontakte und Öffentliche Ordner). Das Kommando ist ziemlich lang und wird auf der Eingabezeile mehrfach umbrochen, aber das tut der Funktion keinen Abbruch. (Bitte beachten: Der folgende Code muss auf einer einzigen Zeile stehen!)
csvde -m -n -u -f „C:\mailadressen.txt“ -r „(|(&(objectClass=user)
(objectCategory=person))(objectClass=group)(objectClass=contact)
(objectClass=publicFolder)(objectClass=group)(objectClass=groupOfNames))“
-l name,sAMAccountName,mail
Import
Der Import von Daten in das AD aus einer Textdatei setzt auf der Kommandozeile den Schalter „-i“ voraus. Gleichzeitig muss mit dem Schalter „-f“ die Importdatei angegeben werden. Folgendes ist zu beachten:
- die erste Zeile enthält die Feldnamen, durch Komma getrennt
- alle weiteren Zeilen enthalten die Feldinhalte, in derselben Reihenfolge wie die Felder, auch durch Komma getrennt. Wenn für ein Feld kein Wert übergeben wird, muss es trotzdem vorhanden sein (also nur ein Komma zur Trennung)
- Systemattribute wie der SID, der GUID oder andere können nicht importiert werden. Dadurch eignet sich die Methode nicht, um eine exakte Kopie des AD auf einem anderen DC zu importieren. Mit csvde werden mit anderen Worten stets neue Objekte angelegt, die einen neuen SID haben und daher die Berechtigungen der ursprünglichen Objekte nicht übernehmen. Damit die Systemattribute gar nicht erst exportiert werden, kann beim Export der Schalter „-m“ gesetzt werden.
Wichtig:
- Komma, nicht Semikolon als Feldtrennung! (Excel hat damit immense Probleme. Eine Abhilfe findet ihr in dem Artikel Excel-Daten als echtes CSV exportieren)
- Einträge, die selbst Kommata haben, müssen in Anführungsstrichen stehen:
„CN=Nils Kaczenski,OU=Chefs,DC=kaczenski,DC=de“ - Feldnamen müssen so sein, wie sie in AD lauten (eine Übersicht darüber findest du unter http://www.faq-o-matic.net/2002/09/21/active-directory-ldap-feldnamen/)
- bestimmte Felder müssen mitgegeben werden (abhängig von der Objektklasse; DN und objectClass müssen immer dabei sein – für Userobjekte auch sAMAccountName und userAccountControl), andere sind optional
- Einträge müssen ggf. die richtige Reihenfolge haben (wenn etwa User in eine OU sollen, muss die OU schon bestehen, d.h. ggf. muss der Eintrag, mit dem die OU angelegt wird, vorher in der Datei auftauchen)
Ein Beispiel für den Import (Achtung, es handelt sich nur um sechs Zeilen; die Zeilennummern bitte nicht übernehmen!):
- DN,objectClass,samAccountName,member,userAccountControl
- „ou=Vertrieb,dc=domain,dc=com“,organizationalUnit,,,
- „cn=Hanna,ou=Vertrieb,dc=domain,dc=com“,user,Hanna,,512
- „cn=Horst,ou=Vertrieb,dc=domain,dc=com“,user,Horst,,512
- „cn=VertriebLeitung,ou=Vertrieb,dc=domain,dc=com“, group,VertriebLeitung,“cn=Horst,ou=Vertrieb,dc=domain,dc=com; cn=Hanna,ou=Vertrieb,dc=domain,dc=com“,
- „cn=Chefs,ou=Vertrieb,dc=domain,dc=com“,group, Chefs,“cn=Horst,ou=Vertrieb,dc=domain,dc=com“,
Diese Datei importiert fünf Objekte in das AD: Eine OU (Vertrieb), zwei User (Hanna und Horst) und zwei Gruppen (VertriebLeitung und Chefs). Die Zeilen dürfen nicht in einer anderen Reihenfolge stehen, weil die Objekte ineinander verschachtelt sind: Die User und die Gruppen liegen in der OU, und die Gruppen nehmen die vorher angelegten User als Mitglieder auf.
Man sieht hier auch, dass jede Zeile alle Felder enthält, auch wenn gar keine Werte mitgegeben werden (Mehrfachkommas). Wichtig ist bei allen User-Objekten der Wert für „userAccountControl“, der für aktivierte Objekte auf 512 stehen muss (oder andere Werte annehmen kann – wenn das Konto aber aktiviert sein soll, muss das zehnte Bit gesetzt sein). Dabei gilt aber: csvde kann keine Kennwörter setzen, wer also aktive Objekte importieren möchte, muss vorher die Kennwortrichtlinien abschalten. Das ist selbstverständlich nur für Testumgebungen geeignet!
Mit folgendem Kommando lässt sich die Datei importieren:
csvde -i -f domain.txt
Dabei wird aber vorausgesetzt, dass die Domäne „domain.com“ heißt. Ist das nicht der Fall, gibt es zwei Möglichkeiten:
- Bearbeiten der Datei: Man ersetze jedes Vorkommen von „DC=domain,DC=com“ durch den echten DN der Domäne (notepad kann das auch)
- Man nutze den Schalter „-c“ und ersetze damit beim Import:
csvde -i -f domain.txt -c „DC=domain,DC=dom“ „DC=kaczenski,DC=de“
http://faq-o-matic.net/?p=556