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).
-
‚ ““““““““““““““““““““““
-
‚ ADNameÄndern.vbs
-
‚ Verbesserung des Microsoft-Scripts aus
-
‚ KB-Q277717
-
‚
-
‚ Ändert den Namen (name, displayName)
-
‚ von Benutzerkonten einer anzugebenden OU
-
‚ ins Format „Nachname, Vorname“
-
‚
-
‚ Von Nils Kaczenski (Vorname at Nachname .de), 2002
-
‚
-
‚ Keine Gewähr! Nutzung auf eigene Gefahr!
-
‚
-
‚ ““““““““““““““““““““““
-
-
‚ Verbindung zur Domäne
-
set objRoot = GetObject(„LDAP://rootDSE“)
-
strDomain = objRoot.Get(„DefaultNamingContext“)
-
-
‚ Logdatei anlegen
-
strScriptPfad = WScript.ScriptFullName
-
strLogPfad = left(strScriptPfad, InstrRev(strScriptPfad, „\“))
-
-
set objFSO = CreateObject(„Scripting.FileSystemObject“)
-
with objFSO
-
dateiPfad = .BuildPath(strLogPfad, „ADNames“)
-
if not .FolderExists(dateiPfad) then .CreateFolder(dateiPfad)
-
dateiName = „ADNames“ & CStr(Now) & „.log“
-
dateiName = replace(dateiName, „:“, „-„)
-
pfadName = .BuildPath(dateiPfad, dateiName)
-
set objDatei = .CreateTextFile(pfadName)
-
end with
-
SchreibLog Now
-
SchreibLog „Skript gestartet“ & vbCrLf
-
-
-
‚ Benutzer fragen …
-
strOU = InputBox(„Welcher Container soll bearbeitet werden?“ & vbCrLf _
-
& „(LDAP-Angabe ohne Domäne)“,, „CN=Users“)
-
-
‚ Verbindungsstring
-
strObjOU = „LDAP://“ & strOU & „,“ & strDomain
-
-
‚ OU ansprechen
-
set objOU = GetObject(strObjOU)
-
-
‚ Log-Zähler initialisieren
-
intErfolg = 0
-
intFehler = 0
-
-
‚ ADSI-Fehlermeldungen verfügbar?
-
on error resume next
-
set ADError = nothing
-
set ADError = CreateObject(„ADsError“)
-
on error goto 0
-
if ADError is nothing then
-
ADSIError = false
-
else
-
ADSIError = true
-
end if
-
set ADError = nothing
-
-
-
objOU.Filter = Array(„user“)
-
-
on error resume next ‚Fehler selbst abfangen
-
-
For each usr in objOU
-
-
if instr(usr.SamAccountName, „$“) = 0 then
-
strName = usr.get(„name“)
-
schreibLog „Benutzer: „ & usr.SamAccountName
-
vLast = usr.get(„Sn“)
-
vFirst = usr.get(„GivenName“)
-
vFullname = vLast + „, „ + vFirst ‚ für den displayName
-
vCN = vLast + „\, „ + vFirst ‚ für name (= cn): Komma maskieren
-
-
‚ displayName setzen: das geht mit „Put“
-
usr.put „displayName“, vFullName
-
usr.setinfo
-
-
‚ name/cn setzen: erfordert Umbenennen durch die „MoveHere“-Methode!
-
strRenameCN = „LDAP://cn=“ & strName & „,“ & strOU & „,“ & strDomain
-
set objUsrRename = objOU.MoveHere(strRenameCN, „cn=“ & vCN)
-
-
‚ Logging: Fehler kontrollieren
-
if err.number <> 0 then
-
if ADSIerror then
-
Set objError = CreateObject(„ADsError“)
-
strKlartext = objError.GetErrorMessage(Err.number)
-
end if
-
SchreibLog „Fehler: „ & strKlartext & “ „ & err.number & „, „ & err.description
-
intFehler = intFehler + 1
-
err.Clear
-
if ADSIerror then set objError = nothing
-
else
-
SchreibLog „Erfolg“
-
intErfolg = intErfolg + 1
-
end if
-
SchreibLog vbCrLf
-
end if
-
-
Next
-
-
on error goto 0 ‚Fehlerbehandlung wieder an
-
-
‚ Erfolgsmeldung ausgeben
-
saylog intErfolg & “ Benutzer bearbeitet, „ & intFehler & “ Fehler aufgetreten.“ & vbCrLf
-
schreibLog Now
-
schreibLog „Skript beendet“
-
objDatei.Close
-
-
-
sub SchreibLog(strText)
-
‚ Funktion: schreibt angegebenen Text in die Logdatei
-
‚ Eingabeparameter:
-
‚ Kommentar:
-
-
objDatei.WriteLine strText
-
-
end sub
-
-
-
sub saylog(strText)
-
-
msgBox strText
-
SchreibLog strText
-
-
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.
-
‚ “““““““““““““““““““““““““““‘
-
‚ UserDisplayConfig.vbs
-
‚ Ändert die Methode zum Generieren des „name“-Attributs
-
‚ im Active Directory, sodass der Name als
-
‚ „Nachname, Vorname“ generiert wird.
-
‚ Benutzung auf eigene Gefahr!
-
‚ Von Nils Kaczenski (Vorname at Nachname .de)
-
‚ “““““““““““““““““““““““““““‘
-
-
set rootDSE = GetObject(„LDAP://RootDSE“)
-
domainname=rootDSE.Get(„configurationnamingcontext“)
-
-
‚ CN=407 steht für Deutsch. US-Englisch: 409
-
‚ statt „user-display“ kann auch „contact-display“ angegeben werden (Kontakte)
-
strConnect = „LDAP://cn=user-Display,CN=407,CN=DisplaySpecifiers,“ & domainname
-
-
set objDomConf = GetObject(strConnect)
-
-
‚ <sn>: Nachname, <givenName>: Vorname
-
objDomConf.Put „createDialog“, „%<sn>\, %<givenName>“
-
objDomConf.SetInfo
-
-
msgBox „Erfolg!“
http://faq-o-matic.net/?p=553