Unter Windows 2000 war es leider nicht möglich, bei mehreren Objekten gleichzeitig dieselbe Änderung durchzuführen. Seit Windows Server 2003 ist es zwar wieder möglich, mehrere Objekte zu markieren und bestimmte Eigenschaften für alle zu bearbeiten. In vielen Fällen ist jedoch eine skriptgesteuerte Möglichkeit besser. Das folgende Skript dient dazu, den Pfad zum Home-Folder (Basisverzeichnis) mehrerer Benutzer im Active Directory zu ändern.
Dazu liest es alle Benutzerkonten einer bestimmten OU aus (nach dieser wird gefragt) und ersetzt eine bestimmte Zeichenkette durch eine andere Zeichenkette. Dadurch ist es z. B. möglich, einen alten Servernamen durch einen neuen zu ersetzen. Zusätzlich wird eine Logdatei über die durchgeführten Änderungen geführt. Wenn man im Skript das Attribut "homeDirectory" durch ein anderes ersetzt, können auf diese Weise nahezu beliebige Daten im AD bearbeitet werden.
-
'''''''''''''''''''''''''''''''''''''''''''''
-
' HomepfadErsetzen.vbs
-
' Version 1.0 vom 4.9.2002
-
' Änderung:
-
'
-
' Ersetzt im Homepfad
-
' von Benutzerkonten einer anzugebenden OU
-
' eine Zeichenkeitte durch eine andere.
-
'
-
' Von Nils Kaczenski (Vorname at Nachname .de)
-
'
-
' 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, "Profilpfad")
-
if not .FolderExists(dateiPfad) then .CreateFolder(dateiPfad)
-
dateiName = "homeDirectory_" & CStr(Now) & ".log"
-
dateiName = replace(dateiName, ":", "-")
-
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")
-
strVorher = InputBox("Welcher Wert wird gesucht?" & vbCrLf & vbCrLf _
-
& "(z. B. alter Servername)",,"")
-
strNachher = InputBox("Durch welchen Wert soll er ersetzt werden?" _
-
& vbCrLf & vbCrLf & "(z. B. neuer Servername)",,"")
-
-
SchreibLog "Aufgabe: Ersetze '" & strVorher & "' durch '" & strNachher _
-
& "'" & vbCrLf
-
-
' Verbindungsstring
-
strObjOU = "LDAP://" & strOU & "," & strDomain
-
-
' OU ansprechen
-
set objOU = GetObject(strObjOU)
-
objOU.Filter = Array("user")
-
-
' Log-Zähler initialisieren
-
intErfolg = 0
-
intFehler = 0
-
-
' alle Objekte bearbeiten
-
' muss evtl. auf geeignete Objekttypen beschränkt werden
-
on error resume next 'Fehler selbst abfangen
-
for each varUser in objOU
-
' Variablen initialisieren
-
strSAMname = ""
-
strHomeDirectoryOld = ""
-
-
set objUser = GetObject("LDAP://" & varUser.Name & "," & strOU _
-
& "," & strDomain)
-
objUser.GetInfo
-
strSAMname = objUser.Get("sAMAccountName")
-
strHomeDirectoryOld = objUser.Get("HomeDirectory")
-
-
if strHomeDirectoryOld <> "" then
-
strHomeDirectoryNeu = replace(strHomeDirectoryOld, _
-
strVorher, strNachher)
-
objUser.Put "HomeDirectory", strHomeDirectoryNeu
-
objUser.SetInfo
-
-
schreibLog "Benutzer: " & strSAMname
-
-
' Logging: Fehler kontrollieren
-
if err.number <> 0 then
-
SchreibLog "Fehler: " & err.number & ", " _
-
& err.description
-
intFehler = intFehler + 1
-
err.Clear
-
elseif strHomeDirectoryOld <> "" then
-
SchreibLog "Erfolg"
-
SchreibLog "Alter Wert: " & strHomeDirectoryOld
-
SchreibLog "Neuer Wert: " & strHomeDirectoryNeu
-
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
http://faq-o-matic.net/?p=554