Dass beim Anlegen eines Benutzers automatisch ein Home-Verzeichnis (Basisordner) angelegt wird, ist kein Feature des Active Directory, sondern des Verwaltungsprogramms. Es funktioniert daher nur, wenn man manuell im Benutzerkonto einen neuen Home-Pfad einträgt. Das folgende Skript hilft dabei, für alle Benutzer einer Domäne einen Home-Folder (Basisverzeichnis) anzulegen. Dieser erhält auch gleich die passenden Zugriffsrechte.
Dazu liest es alle Benutzerkonten der Domäne aus und generiert eine Batchdatei, in der für jeden user mit "md" ein Ordner angelegt wird, sofern noch keiner existiert. Danach werden mit "cacls" die passenden Berechtigungen gesetzt.
Achtung: Der Besitzer der so generierten Ordner ist derjenige, der das Skript ausführt. Das kann zu Problemen führen, falls der so generierte Home-Folder bei der Ordnerumleitung genutzt werden soll, weil hierfür der jeweilige User auch Besitzer sein muss! Für dieses Problem gibt es mehrere Workarounds:
- Das Skript so bearbeiten, dass nach dem Anlegen mit einem externen Tool (z.B. chown) gleich der Besitzer geändert wird.
- Nicht cacls.exe einsetzen, sondern xcacls.vbs (gibt es bei Microsoft). Danke für diesen Hinweis an Volker Fenners (Vorname at Nachname .de).
Hier das Skript:
-
''''''''''''''''''''''''''''''''''''''''''''''''''
-
' Dieses Skript generiert eine Batchdatei, mit der
-
' für jeden User einer ADS-Domäne ein Basisordner
-
' (Home-Folder) angelegt werden kann.
-
' Dazu liest es die NT-Anmeldenamen aus der Domäne
-
' aus und schreibt sie als "md"-Befehle in eine
-
' Batchdatei. Anschließend werden zwei "cacls"-
-
' Kommandos angehängt, mit denen die passenden
-
' Berechtigungen gesetzt werden (Administratoren
-
' und der User haben Vollzugriff).
-
'
-
' Nutzung auf eigene Gefahr! Keine Gewähr!
-
'
-
' Von Nils Kaczenski (Vorname at Nachname .de)
-
' Das Skript verwendet ein ADSI-Beispiel von Microsoft
-
' Version 1.1
-
' Zuletzt geändert am: 9. 9. 2003
-
''''''''''''''''''''''''''''''''''''''''''''''''''
-
-
Dim Con 'As ADODB.Connection
-
Dim ocommand 'As ADODB.Command
-
Dim gc 'As IADs
-
-
strAdminGroupName = "Administratoren" ' US-Windows: "Administrators"
-
strYesChar = "j" ' US-Windows: "y"
-
-
On Error Resume Next
-
-
'Create ADO connection object for Active Directory
-
Set Con = CreateObject("ADODB.Connection")
-
If (Err.Number <> 0) Then
-
BailOnFailure Err.Number, "on CreateObject"
-
End If
-
Con.Provider = "ADsDSOObject"
-
If (Err.Number <> 0) Then
-
BailOnFailure Err.Number, "on Provider"
-
End If
-
Con.Open "Active Directory Provider"
-
If (Err.Number <> 0) Then
-
BailOnFailure Err.Number, "on Open"
-
End If
-
-
'Create ADO command object for the connection.
-
Set ocommand = CreateObject("ADODB.Command")
-
If (Err.Number <> 0) Then
-
BailOnFailure Err.Number, "on CreateObject"
-
End If
-
ocommand.ActiveConnection = Con
-
If (Err.Number <> 0) Then
-
BailOnFailure Err.Number, "on Active Connection"
-
End If
-
-
'Get the ADsPath for the domain to search.
-
Set root = GetObject("LDAP://rootDSE")
-
If (Err.Number <> 0) Then
-
BailOnFailure Err.Number, "on GetObject for rootDSE"
-
End If
-
sDomain = root.Get("defaultNamingContext")
-
If (Err.Number <> 0) Then
-
BailOnFailure Err.Number, "on Get on defaultNamingContext"
-
End If
-
Set domain = GetObject("LDAP://" & sDomain)
-
If (Err.Number <> 0) Then
-
BailOnFailure Err.Number, "on GetObject for domain"
-
End If
-
-
'Abfragen
-
-
strSQL = "SELECT sAMAccountName FROM '"
-
strSQL = strSQL & "LDAP://" & sDomain _
-
& "' WHERE objectClass='user' and objectCategory='person'"
-
-
' msgBox strSQL
-
-
'Assemble the commandtext.
-
ocommand.CommandText = strSQL
-
If (Err.Number <> 0) Then
-
BailOnFailure Err.Number, "on CommandText"
-
End If
-
-
'Execute the query.
-
Set rs = ocommand.Execute
-
If (Err.Number <> 0) Then
-
BailOnFailure Err.Number, "on Execute"
-
End If
-
-
intNumDisplay = 0
-
intCount = 0
-
-
on error goto 0
-
-
' Navigate the record set
-
rs.MoveFirst
-
While Not rs.EOF
-
intCount = intCount + 1
-
For i = 0 To rs.Fields.Count – 1
-
strText = strText & "if not exist """ _
-
& rs.Fields(i).Value & """ md """ _
-
& rs.Fields(i).Value & """" & vbCrLf
-
Next
-
intNumDisplay = intNumDisplay + 1
-
rs.MoveNext
-
Wend
-
-
strScriptPfad = WScript.ScriptFullName
-
strDateiPfad = left(strScriptPfad, InstrRev(strScriptPfad, "\"))
-
-
set objFSO = CreateObject("Scripting.FileSystemObject")
-
with objFSO
-
strDateiName = .BuildPath(strDateiPfad, "homes.bat")
-
set objDatei = .CreateTextFile(strDateiName)
-
end with
-
-
objDatei.write strText
-
objDatei.writeLine "echo " & strYesChar & "|cacls *.* /T /G " _
-
& strAdminGroupName & ":F"
-
objDatei.writeLine "for /R %%I in (.) do cacls ""%%I"" " _
-
& "/T /E /G ""%userdomain%\%%~nI"":F"
-
-
objDatei.close
-
-
strErfolg = "Fertig!" & vbCrLf
-
strErfolg = strErfolg & "Datei gespeichert unter " & strDateiname & vbCrLf
-
strErfolg = strErfolg & "Diese Datei muss im Root der Home-Freigabe ausgeführt werden."
-
wscript.echo strErfolg
-
-
-
'''''''''''''''''''''''''''''''''''''''
-
'Display subroutines
-
'''''''''''''''''''''''''''''''''''''''
-
-
Sub BailOnFailure(ErrNum, ErrText) strText = "Error 0x" & Hex(ErrNum) & " " & ErrText
-
MsgBox strText, vbInformation, "ADSI Error"
-
WScript.Quit
-
End Sub
http://faq-o-matic.net/?p=496