Website-Icon .: blog cscholz.io :.

scripts: AD-Displaynamen und CN per script ändern

Nachdem in einer Domaine die User einmal angelegt sind, wäre es manuell sehr aufwendig den DisplayNamen und CanonicalName zu ändern. Dies ist jedoch manchmal notwendig, wenn zum Beispiel die User mit Nachname, Vorname angelegt wurden und nun entweder das Komma entfernt werden soll oder die Namen in der Reihenfolge vertauscht werden müssen.

Damit man die nicht händisch mache muss, hab ich ein vbs-file erstellt, dass dies automatisch macht. Der Aufbau ist relativ einfach gehalten. in der 3. Zeile wird der Pfad zu den umzubenennenden Usern eingetragen. Das Script durchläuft dann die OU und kontrolliert alle User-Objekte auf das vorkommen eines Kommas im DisplayNamen. Wenn eines vorhanden ist, wird der Name gesplittet (hier ist noch eine Unterscheidung zwischen einem User mit Vor- & Zuname, und einem User der noch einen zweiten Vornamen besitzt) das Komma entfernt und der CN auf Nachname Vorname und der DisplayName auf Vorname Nachname gesetzt.

Des Verständnissheitshalber sind einige Counter eingebaut, damit der Admin am Ende des scriptes eine Übersicht über die Änderungen erhält.

Am Ende des scriptes stehen noch vier ldif Befehle, mit denen man die Objekte eines ADs exportieren und wieder importieren kann. Evtl. möchte man ja einmal alle Benutzerobjekte in einer Testdomain bearbeiten um zu sehen wie das Ergebniss aussieht.

Auzurufen ist das über cscript rename_ad_user.vbs

Einige Userobjekte lassen sich evt. nicht direkt beim ersten mal ändern. Wie im Screenshot zu sehen ist, konnten 3 User nicht verändert werden. Einfach das script nochmal starten, dann werden die fehlenden noch nachgezogen.

on error resume next
str_ParentDN = "OU=test,DC=nwtraders,DC=msft"
Set oTargetOU = GetObject("LDAP://" & str_ParentDN)
oTargetOU.Filter = Array("user")
str_errcount = 0
str_errcount = 0
str_obj_count = 0
str_edit_count = 0
For each usr in oTargetOU
 if instr(usr.SamAccountName, "$") = 0 then
  if instr(usr.displayName, ",") <> 0 then
   str_FullName = usr.get("displayName")
   str_FullName = Replace(str_FullName,",","")
   ary_FullName = split(str_FullName)
   str_CN = usr.get("cn")
   CountWords = UBound(ary_FullName) - LBound(ary_FullName) +1
   if CountWords = 2 then
    str_Last = ary_FullName(0)
    str_First = ary_FullName(1)
    str_FullName =  str_First + " " + str_Last
    str_Fullname_CN= str_Last + " " + str_First
   end if
   if CountWords = 3 then
    str_First = ary_FullName(1)
    str_Middle = ary_FullName(2)
    str_Last = ary_FullName(0)
    str_Fullname = str_First + " " + str_Middle + " " + str_Last
    str_Fullname_CN= str_Last + " " + str_First + " " + str_Middle
   end if
  usr.put "displayName", str_FullName
  usr.setinfo
'    wscript.echo "LDAP://cn=" & """" & str_CN & """" & "," & str_ParentDN, "cn=" & """" & str_FullName_CN & """"
  oTargetOU.MoveHere "LDAP://cn=" & """" & str_CN & """" & "," & str_ParentDN, "cn=" & """" & str_FullName_CN & """"
  str_edit_count = str_edit_count + 1
  usr.setinfo
  end if
 end if
' wscript.sleep 250
 str_obj_count = str_obj_count + 1
 if err.number <> 0 then
  wscript.echo "Bei der Bearbeitung folgendes Eintrages trat ein Fehler auf: "  & str_CN
  str_errcount = str_errcount + 1
  Err.Clear
 end if
Next
wscript.echo "Skript beendet." & chr(13) & "Es wurden " & str_obj_count & " Objekte kontrolliert und " & str_edit_count & " bearbeitet. Dabei traten " & str_errcount & " Fehler auf."
'Export der OUs
'ldifde -f exportOu.ldf -s server -d "DC=nwtraders,DC=msft" -p subtree -r "(objectCategory=organizationalUnit)" -l "cn,objectclass,ou"
' Export der User
'ldifde -f Exportuser.ldf -s server -d "DC=nwtraders,DC=msft" -p subtree-r "(&(objectCategory=person)(objectClass=User)(givenname=*))" -l "cn,givenNamesn,DisplayName,objectclass,samAccountName"
'Import der OUs
'ldifde -i -f ExportOU.ldf -s server
'Import der User
'ldifde -i -f Exportuser.ldf -s server
Die mobile Version verlassen