Logo faq-o-matic.net
Logo faq-o-matic.net

Erzeugen von ldifde-Templates aus Excel mit GNU Awk

von veröffentlicht am31. Dezember 2004, 16:42 Uhr Kurzlink und Zitatlink einblenden
Kategorie Kategorie: Active Directory, AD: Daten bearbeiten, Scripting   Translate with Google Translate Translate EN   Die angezeigte Seite drucken
Zuletzt aktualisiert: 9. Oktober 2013

Viele Administratoren benutzen gern csvde, da die Ausgangsdateien sich sehr schön mit einer Tabellenkalkulation wie Excel erzeugen lassen. Hier können insbesondere mittels verknüpfter Tabelleninhalte umfangreiche Userdaten einfach gepflegt werden. Problematisch dabei ist die Zeilenbegrenzung, die dabei schnell erreicht wird. Ich persönlich ziehe daher ldifde vor. Dieses Tool ist ebenso auf jedem Windows Domaincontroller zu finden und arbeitet nicht spalten-, sondern zeilenorientiert.

Da die Eingabedatei für ldifde sich mit Excel schlecht pflegen läßt, benute ich als Parser GNU Awk, um mit einer Excel-Datei in Kombination mit einem ldifde-Template alle möglichen Änderungen für beliebig viele User automatisiert durchführen zu können. Alles was dazu gebraucht wird, sind die GNU Utilities für Windows.

Man finded bei Sourceforge vorkompilierte exe-Dateien zur nativen Benutzung in Windows-Umgebungen: GNU utilities for Win32. Wir benötigen von der Site aus dem Archiv UnxUpdates.zip die Datei gawk.exe. Als nächstes erzeugen wir uns in einer Tabellenkalkulation ein Worksheet mit Userangaben in Spaltenform. Dabei verwende ich folgende Daten in den entsprechenden Spalten:

givenName; sn; displayName; SAMAccountName; userPrincipalName; ou; cn; company; department; physicalDeliveryOfficeName; streetAddress; postalCode; l; st; co; mail; telephoneNumber; facsimileTelephoneNumber; mobile; countryCode; c; distinguishedName; olddistinguishedName

In olddistinguishedName steht der jeweilige dn der OU, die im ADMT als Ziel-OU für die Migration vorgesehen war. In distinguishedName steht der neue dn. Diesen kann man mit der ou zusammenbauen, so dass der User gleich in die richtige Ziel-OU verschoben wird.

Für die Verknüpfungen nutze ich die Funktion "&" von Excel. In der ersten Spalte findet man ja den Vornamen, in der zweiten den Nachnamen. Die dritte Spalte enthält den displayName. Diesen baue ich mit der folgenden Excelfunktion automatisch zusammen:
=A2&" "&B2

Alle weiteren Spalten sind ebenfalls meist mit Funktionen versehen, so dass keine Informationen redundant eingegeben werden müssen. Für die Emailadressen brauchte ich zum Beispiel noch den ersten Buchstaben des Vornamens, was man so realisieren kann:
=D2&"@firma.local"

Schließlich brauchen wir noch eine Awk-Steuerdatei. Ich habe hier ein Beispiel abgedruckt, welches ich für die Abänderung von mittels ADMTv2 importierten Windows NT-Konten in die ADS verwende. Beim Import werde ja relativ wenige Daten mit übernommen. Dieses ldifde-Template kann mittels Awk die migrierten Accounts entsprechend Ändern und in die richtige Ziel-OU verschieben. Die Anzahl der verwendeten Spalten in der Eingangsdatei ist dabei in der Zeile "NF ==" mit anzugeben, in diesem Beispiel sind es 23 Spalten. "%s" steht für die jeweils verwendete Variable und "n" erzeugt einen Zeilenumbruch.

Zur Nutzung dieses Templates speichert man den Inhalt in eine Datei mit dem Namen ldifde_template.awk. Danach exportiert man seine Excel-Datei nach export.csv und benutzt das Semikolon als Trennzeichen. Die erste Spalte, die die Spaltenbezeichner enthält, muß dabei entfernt werden. Im Ergebnis bekommt man dann eine ldifde-Eingangsdatei import.ldf, die man dann mit ldifde.exe ausführen kann und die alle User gesammelt enthält: gawk -f ldifde_template.awk < export.csv > import.ldf

BEGIN {
  FS = ";"
}
END {

}
NF == 23 {
   printf("dn: %sn", $23)
   print ("changetype: modify")
   print ("replace: sn")
   printf("sn: %sn", $2)
   print ("-")
   print ("replace: givenName")
   printf("givenName: %sn", $1)
   print ("-")
   print ("replace: displayName")
   printf("displayName: %sn", $3)
   print ("-")
   print ("replace: sAMAccountName")
   printf("sAMAccountName: %sn", $4)
   print ("-")
   print ("replace: userPrincipalName")
   printf("userPrincipalName: %sn", $5)
   print ("-")
   print ("replace: company")
   printf("company: %sn", $8)
   print ("-")
   print ("replace: department")
   printf("department: %sn", $9)
   print ("-")
   print ("replace: physicalDeliveryOfficeName")
   printf("physicalDeliveryOfficeName: %sn", $10)
   print ("-")
   print ("replace: streetAddress")
   printf("streetAddress: %sn", $11)
   print ("-")
   print ("replace: postalCode")
   printf("postalCode: %sn", $12)
   print ("-")
   print ("replace: l")
   printf("l: %sn", $13)
   print ("-")
   print ("replace: st")
   printf("st: %sn", $14)
   print ("-")
   print ("replace: co")
   printf("co: %sn", $15)
   print ("-")
   print ("replace: mail")
   printf("mail: %sn", $16)
   print ("-")
   print ("replace: TelephoneNumber")
   printf("TelephoneNumber: %sn", $17)
   print ("-")
   print ("replace: facsimileTelephoneNumber")
   printf("facsimileTelephoneNumber: %sn", $18)
   print ("-")
   print ("replace: mobile")
   printf("mobile: %sn", $19)
   print ("-")
   print ("replace: countryCode")
   printf("countryCode: %sn", $20)
   print ("-")
   print ("replace: c")
   printf("c: %sn", $21)
   print ("-")
   print ("changetype: moddn")
   printf("newrdn: %sn", $7)
   print ("deleteoldrdn: 1")
   printf("newsuperior: %s,ou=ROOT,dc=firma,dc=localn", $6)
   print ("")
}

© 2005-2023 bei faq-o-matic.net. Alle Rechte an den Texten liegen bei deren Autorinnen und Autoren.

Jede Wiederveröffentlichung der Texte oder von Auszügen daraus - egal ob kommerziell oder nicht - bedarf der ausdrücklichen Genehmigung durch die jeweiligen Urheberinnen oder Urheber.

Das Impressum findet sich unter: http://www.faq-o-matic.net/impressum/

Danke, dass du faq-o-matic.net nutzt. Du hast ein einfaches Blog sehr glücklich gemacht!