von AutorNils Kaczenski veröffentlicht am10. August 2003, 15:48 Uhr Kurzlink http://faq-o-matic.net/?p=553
Kategorie Kategorie: AD: Daten bearbeiten,Active Directory,Scripting
Zuletzt aktualisiert: 6. Apr 2010

In der Standardeinstellung werden in Active Directory die Namen von Benutzerkonten (und anderen Objekten, z. B. Kontakten) in der Form "Vorname Nachname" ("Nils Kaczenski") generiert. Das ist unpraktisch bei der Listenansicht in den Standard-Verwaltungstools und im Outlook-Adressbuch, denn man kann nicht nach dem Nachnamen sortieren. Leider gibt es keine Möglichkeit, die Sortierung "mal eben" zu ändern. Stattdessen müssen die Benutzerkonten umbenannt werden. Wichtig sind hier meist gleich zwei Attribute: "name" und "displayName". Dabei ist allerdings nur "name" für die Standard-Listenansicht zuständig (und nicht etwa "displayName", wie der Name suggeriert).

Das Problem muss an zwei Stellen behoben werden: Einmal für die vorhandenen Objekte und einmal für alle neuen Objekte.

1. Vorhandene Objekte 

Das erste Skript liest es alle Benutzerkonten einer bestimmten OU aus und ändert sowohl das "name"- als auch das "displayName"-Attribut. Gleichzeitig generiert es eine Logdatei über alle Änderungen. Das Skript ist eine Verbesserung des Beispiels aus dem Knowledge-Base-Artikel 277717. Durch das Logging geht es auch weiter als das Script von Robert Pieroth (http://www.rpieroth.de/ChangeRDN.VBS).

  1. ' """"""""""""""""""""""
  2. ' ADNameÄndern.vbs
  3. ' Verbesserung des Microsoft-Scripts aus
  4. ' KB-Q277717
  5. '
  6. ' Ändert den Namen (name, displayName)
  7. ' von Benutzerkonten einer anzugebenden OU
  8. ' ins Format "Nachname, Vorname"
  9. '
  10. ' Von Nils Kaczenski (Vorname at Nachname .de), 2002
  11. '
  12. ' Keine Gewähr! Nutzung auf eigene Gefahr!
  13. '
  14. ' """"""""""""""""""""""
  15.  
  16. ' Verbindung zur Domäne
  17. set objRoot = GetObject("LDAP://rootDSE")
  18. strDomain = objRoot.Get("DefaultNamingContext")
  19.  
  20. ' Logdatei anlegen
  21. strScriptPfad = WScript.ScriptFullName
  22. strLogPfad = left(strScriptPfad, InstrRev(strScriptPfad, "\"))
  23.  
  24. set objFSO = CreateObject("Scripting.FileSystemObject")
  25. with objFSO
  26.     dateiPfad = .BuildPath(strLogPfad, "ADNames")
  27.     if not .FolderExists(dateiPfad) then .CreateFolder(dateiPfad)
  28.     dateiName = "ADNames" & CStr(Now) & ".log"
  29.     dateiName = replace(dateiName, ":", "-")
  30.     pfadName = .BuildPath(dateiPfad, dateiName)
  31.     set objDatei = .CreateTextFile(pfadName)
  32. end with
  33. SchreibLog Now
  34. SchreibLog "Skript gestartet" & vbCrLf
  35.  
  36.  
  37. ' Benutzer fragen …
  38. strOU = InputBox("Welcher Container soll bearbeitet werden?" & vbCrLf _
  39. & "(LDAP-Angabe ohne Domäne)",, "CN=Users")
  40.  
  41. ' Verbindungsstring
  42. strObjOU = "LDAP://" & strOU & "," & strDomain
  43.  
  44. ' OU ansprechen
  45. set objOU = GetObject(strObjOU)
  46.  
  47. ' Log-Zähler initialisieren
  48. intErfolg = 0
  49. intFehler = 0
  50.  
  51. ' ADSI-Fehlermeldungen verfügbar?
  52. on error resume next
  53. set ADError = nothing
  54. set ADError = CreateObject("ADsError")
  55. on error goto 0
  56. if ADError is nothing then
  57.    ADSIError = false
  58. else
  59.    ADSIError = true
  60. end if
  61. set ADError = nothing
  62.  
  63.  
  64. objOU.Filter = Array("user")
  65.  
  66. on error resume next 'Fehler selbst abfangen
  67.  
  68. For each usr in objOU
  69.  
  70.     if instr(usr.SamAccountName, "$") = 0 then
  71.                 strName = usr.get("name")
  72.                 schreibLog "Benutzer: " & usr.SamAccountName
  73.         vLast = usr.get("Sn")
  74.         vFirst = usr.get("GivenName")
  75.        vFullname = vLast + ", " + vFirst ' für den displayName
  76.        vCN = vLast + "\, " + vFirst ' für name (= cn): Komma maskieren
  77.  
  78.                 ' displayName setzen: das geht mit "Put"
  79.             usr.put "displayName", vFullName
  80.            usr.setinfo
  81.  
  82.                 ' name/cn setzen: erfordert Umbenennen durch die "MoveHere"-Methode!
  83.                 strRenameCN = "LDAP://cn=" & strName & "," & strOU & "," & strDomain
  84.                 set objUsrRename = objOU.MoveHere(strRenameCN, "cn=" & vCN)
  85.  
  86.                 ' Logging: Fehler kontrollieren
  87.                 if err.number <> 0 then
  88.                     if ADSIerror then
  89.                       Set objError = CreateObject("ADsError")
  90.                       strKlartext = objError.GetErrorMessage(Err.number)
  91.                     end if
  92.                     SchreibLog "Fehler: " & strKlartext & " " & err.number & ", " & err.description
  93.                     intFehler = intFehler + 1
  94.                     err.Clear
  95.                     if ADSIerror then set objError = nothing
  96.                 else
  97.                     SchreibLog "Erfolg"
  98.                     intErfolg = intErfolg + 1
  99.                 end if
  100.                 SchreibLog vbCrLf
  101.         end if
  102.  
  103. Next
  104.  
  105. on error goto 0 'Fehlerbehandlung wieder an
  106.  
  107. ' Erfolgsmeldung ausgeben
  108. saylog intErfolg & " Benutzer bearbeitet, " & intFehler & " Fehler aufgetreten." & vbCrLf
  109. schreibLog Now
  110. schreibLog "Skript beendet"
  111. objDatei.Close
  112.  
  113.  
  114. sub SchreibLog(strText)
  115.     ' Funktion: schreibt angegebenen Text in die Logdatei
  116.     ' Eingabeparameter:
  117.     ' Kommentar:
  118.  
  119.     objDatei.WriteLine strText
  120.  
  121. end sub
  122.  
  123.  
  124. sub saylog(strText)
  125.  
  126.     msgBox strText
  127.     SchreibLog strText
  128.  
  129. end sub

2. Die Voreinstellung für neue Objekte ändern

Mit Hilfe dieses Skripts wird die Voreinstellung des AD geändert, sodass neue Objekte nach dem Prinzip "Nachname, Vorname" benannt werden.

  1. ' """""""""""""""""""""""""""'
  2. ' UserDisplayConfig.vbs
  3. ' Ändert die Methode zum Generieren des "name"-Attributs
  4. ' im Active Directory, sodass der Name als
  5. ' "Nachname, Vorname" generiert wird.
  6. ' Benutzung auf eigene Gefahr!
  7. ' Von Nils Kaczenski (Vorname at Nachname .de)
  8. ' """""""""""""""""""""""""""'
  9.  
  10. set rootDSE = GetObject("LDAP://RootDSE")
  11. domainname=rootDSE.Get("configurationnamingcontext")
  12.  
  13. ' CN=407 steht für Deutsch. US-Englisch: 409
  14. ' statt "user-display" kann auch "contact-display" angegeben werden (Kontakte)
  15. strConnect = "LDAP://cn=user-Display,CN=407,CN=DisplaySpecifiers," & domainname
  16.  
  17. set objDomConf = GetObject(strConnect)
  18.  
  19. ' <sn>: Nachname, <givenName>: Vorname
  20. objDomConf.Put "createDialog", "%<sn>\, %<givenName>"
  21. objDomConf.SetInfo
  22.  
  23. msgBox "Erfolg!"

 

Verwandte Beiträge:

  1. Wie kann ich den Pfad zum Home-Folder mehrerer Benutzer (oder auch andere Werte) ändern?
    Unter Windows 2000 war es leider nicht möglich, bei mehreren Objekten gleichzeitig dieselbe Änderung durchzuführen. Seit Windows Server 2003 ist es...
  2. Wie kann ich für alle Benutzer ein Home-Verzeichnis anlegen?
    Dass beim Anlegen eines Benutzers automatisch ein Home-Verzeichnis (Basisordner) angelegt wird, ist kein Feature des Active Directory, sondern des Verwaltungsprogramms....
  3. Den LDAP-Pfad eines AD-Objekts anzeigen
    Im Verwaltungsprogramm "Active Directory-Benutzer und -Computer" (ADUC) gibt es keine Möglichkeit, den LDAP-Pfad zu vorhandenen Objekten anzuzeigen. In vielen Fällen...
  4. Alle Mailadressen anzeigen
    Die Mailadressen einer Exchange-Organisation sind im Active Directory gespeichert. Für den Zugriff auf die Hauptadresse eines Benutzers gibt es ein...
  5. Kostenstelle in AD integrieren
    Basierend auf dem Artikel "Eigene Funktionen in die AD-Tools integrieren" von Nils habe ich das dort vefügbare Beispiel erweitert. Zweck...