Ich habe vor einigen Tagen mich mit dem Active Directory beschäftigen müssen. Für mich als Solaris-User ist das eine ganz andere Welt. Deswegen habe ich mich sehr schwer getan, ohne Martin wär dieser Artikel nicht möglich gewesen. Er stand mir mit Rat und Tat eine Stunde telefonisch zur Verfügung. Danke noch einmal!
Nun zu meinen Problem: Ich wollte Nutzer aus einer spool-Datei automatisch in das Active Directory eintragen. Weiterhin mussten die Benutzer in die Organizational Unit peter_lustig_user verschoben werden. Das anlegen der Nutzer habe ich noch alleine hinbekommen. Dazu habe ich aus zahlreichen Skripten Codezeilen kopiert. Aber das Verschieben habe ich nicht hinbekommen. Martin hat mich auf die Active Directory Tools von Microsoft hingeweisen. Diese fangen alle mit ds an. Mit dsquery * habe ich mich durch die Struktur des Active Directory gewühlt. Das grafische Frontend ist zwar schön, aber da habe ich nicht mitbekommen, aber da weiß ich nicht wie der Distinguished Name aussieht…
Zum Schluss bin ich zu folgen Skript gekommen:
Set args = WScript.Arguments
profile_pfad = "\\odin\homes\%username%\profile"
gruppe_neu = "benutzer"
if args.count <> 1 then
MsgBox "Es muss genau eine spool-Datei angegeben werden"
Wscript.quit
End If
Randomize
protokoll = "C:\Dokumente und Einstellungen\Administrator\Desktop\skripte\protokoll.txt"
Set fs = CreateObject("Scripting.FileSystemObject")
' Das WScript.Network-Objekt liefert den Namen des Computers
Set net = CreateObject("WScript.Network")
' Protokolldatei öffnen
Set output = fs.CreateTextFile(protokoll, True)
'Holt den Namen des Computers aus dem net Objekt
name = net.ComputerName
Set computer = GetObject("WinNT://" & name)
' Datei öffnen
dateiname = args(0)
If Not fs.FileExists(dateiname) Then
MsgBox "Die Datei (" & dateiname & ") existiert am angegebenen Ort nicht!"
WScript.Quit
End If
Set infos = fs.OpenTextFile(dateiname)
' Datei zeilenweise bis zum Ende (atEndOfStream) lesen:
Do Until infos.AtEndOfStream
' eine Zeile einlesen
zeile = infos.ReadLine
' Informationen durch Semikola splitten
details = Split(zeile, ";")
username = Trim(details(0))
' Konto anlegen
Set kontoneu = computer.Create("User", Trim(details(0)))
kontoneu.FullName = Trim(details(1))
kontoneu.Profile = profile_pfad
' Passwort auslesen, wenn es das default-Passwort ist, dann generiere ein Passwort
passwort = Trim(details(2))
if passwort = "du34!$7_.4-@" then
passwort = Trim(genPasswort)
kontoneu.PasswordExpired = CLng(1)
end if
kontoneu.SetPassword passwort
' Ablaufdatum setzten
if trim(details(3)) <> "never" then
kontoneu.AccountExpirationDate = Trim(details(3))
end if
' Normales Benutzerkonto
kontoneu.UserFlags = 512
if not fs.FolderExists("\\odin\homes\" & username) then
set folder = fs.CreateFolder("\\odin\homes\" & username)
set folder_files = fs.createfolder("\\odin\homes\" & username & "\files")
set folder_profile = fs.createfolder("\\odin\homes\" & username & "\profile")
set IShellDispatch2 = CreateObject("Shell.Application")
Call IShellDispatch2.ShellExecute("C:\skripte\subinacl", "/file \\odin\homes\" & username & " /setowner=" & username, , , 0)
Call IShellDispatch2.ShellExecute("c:\skripte\subinacl", "/subdirectories \\odin\homes\" & username & " /setowner=" & username, , , 0)
Call IShellDispatch2.ShellExecute("C:\skripte\cacls", "\\odin\homes\" & username & " /T /G Administratoren:F " & username & ":F System:F < echo j", , , 0)
end if
err.clear
On Error Resume Next
kontoneu.SetInfo
if Err.number = 0 then
WriteLog "Benutzername: " & username & " Passwort: " & passwort
AddToGroup gruppe_neu, kontoneu.ADsPath
' User in die ou peter_lustig_user verschieben
set dsMove = CreateObject("Shell.Application")
dsMoveArg = " " & Chr(34) & "CN=" & username & ",CN=Users,DC=w2k8-pool,DC=windows,DC=0rpheus,DC=net" & Chr(34) & _
" -newparent " & Chr(34) & "OU=peter_lustig_user,DC=w2k8-pool,DC=windows,DC=0rpheus,DC=net" & Chr(34)
Call dsMove.ShellExecute("dsmove", dsMoveArg, , ,0)
else
if Err.number = -2147022672 then
WriteLog "Fehler beim Anlegen von " & username & ": Nutzer existiert bereits"
else
WriteLog "Fehler beim Anlegen von " & username & ": " & Err.Number
end if
end if
Err.Clear
Loop
' Dateien schließen
infos.Close
output.Close
' Protokoll anzeigen:
'SYS: Microsoft (r) Script Runtime
Set wshshell = CreateObject("WScript.Shell")
wshshell.Run """" & protokoll & """"
Sub AddToGroup(gruppenname, kontoname)
On Error Resume Next
Set gruppe = GetObject("WinNT://" & ComputerName & "/" & gruppenname & ",group")
gruppe.Add kontoname
gruppe.SetInfo
If Err.number = 0 Then
'WriteLog "Konto ist Mitglied in Gruppe " & gruppenname
Else
'WriteLog "Konto konnte nicht zum Mitglied in Gruppe " & gruppenname & " gemacht werden."
End If
Err.Clear
End Sub
Sub WriteLog(text)
' eine Zeile ins Protokoll schreiben und Leerzeile einfügen
output.WriteLine text & vbCrLf & vbCrLf
End Sub
function genPasswort()
password = ""
for i=1 to 12
if Int(100*Rnd mod 2 ) = 1 then
password = password & chr(Int(61*Rnd+33))
else
password = password & chr(Int(29*Rnd+97))
end if
next
genPasswort = password
end function
Der AD-Guru oder Windows-Hardcore User wird sicher sagen, wie dumm ist das denn, das geht in einen 3-Zeiler. Aber ich kann kein Windows und will es eigentlich auch nicht lernen 😛 Wenn ich Zeit hätte wüsste ich wie man mit den ds*-Tools das ganze schöner machen könnte. Ich habe das komplette Skript hier rein gestellt, da man sicher die ein oder andere Zeile klauen kann *g*. Der Passwortgenerator ist schlecht, es war aber die schnellste Lösung.