Es ist durchaus üblich, dass das Home Directory und der Username in einer Windows Active Directory Domäne ident sind.
Dies kann man dazu nützen, dass man die Berechtigungen automatisiert für diese Ordner neu setzt.
[Das Script hab ich schnell zusammengebastelt/googelt, weil ich bei einem Kunden eine Struktur vorgefunden habe, die dadurch zu einer Katastrophe wurde, dass einerseits Berechtigungen vererbt wurden, andererseits JEDER Vollzugriff hatte und dergleichen mehr...]
Verwendung:
als ChangeBerechtigungen.vbs speichern und dann aus einer command-shell heraus wie folgt starten:
cscript ChangeBerechtigungen.vbs /scharf:[no/yes] /Userordner:\\server\share\home$
Der Flag /scharf lässt einen das Script ohne echte Aktivität einmal ausprobieren…
Was passiert während der Abarbeitung:
es wird für jeden Ordner im angegebenen Userordner geprüft, ob es einen User im AD gibt, der den selben Namen trägt.
Wenn ein User existiert,
- übernimmt die Gruppe der Administratoren den Besitz
- erhält die Gruppe der Administratoren Vollzugriff, der betreffende User darf Ändern
- der betreffende User wird neuer Besitzer des Ordners
Dies alles wird nach unten hin vererbt, sodass danach die Rechte auf den entsprechenden Ordner und alle Unterordner wieder passen sollten.
Ich habe das Script soeben mit 800 Usern getestet und bin ziemlich happy
WICHTIG: Das Script wurde nur unter Windows 7 getestet!!! Ich kann nicht versprechen, ob es auf einem anderen OS läuft!
warntext = warntext & "Dieses Tool verändert den Besitzer von Ordnern und Dateien!" & vbcrlf warntext = warntext & "Funktionsweise: Es wird für jeden Ordner und Unterordner im Active Directory ""nachgesehen"", ob es einen User" & vbcrlf warntext = warntext & "mit dem selben Namen gibt!" & vbcrlf warntext = warntext & "Wenn es eine Übereinstimmung gibt, so wird bei alle Dateien sowie Ordnern in diesem Verzeichnis der Besitzer geändert" & vbcrlf warntext = warntext & "" & vbcrlf warntext = warntext & "ACHTUNG! Es werden aktuell hier nur die Ordner aufgelistet." & vbcrlf warntext = warntext & "Um in den Ordnern die Besitzer tatsächlich zu ändern (nachdem alles kontrolliert wurde), MUSS dieses Script " & vbcrlf warntext = warntext & "aus einer Commandshell heraus mit wie folgt gestartet werden:" & vbcrlf & vbcrlf & vbcrlf warntext = warntext & "BerechtigungenReparieren.exe /scharf:YES /Userordner:H:\meineHomeverzeichnisse\Schueler" & vbcrlf & vbcrlf & vbcrlf warntext = warntext & "[wobei H:\meineHomeverzeichnisse\Schueler natürlich für den zu verändernden Ordner steht!!!]" & vbcrlf warntext = warntext & "[Tipp: wenn Ordner Leerzeichen haben, dann den Ordnername zwischen zwei "" sezten]" & vbcrlf warntext = warntext & "[Tipp2: das Tool funktioniert auch mit Freigaben, also zB \\meinServer\home$\schueler]" & vbcrlf & vbcrlf & vbcrlf warntext = warntext & "Chefmodus: (Experts only)" & vbcrlf warntext = warntext & "unten abgebildeten Quellcode mit dem Notepad als BerechtigungenReparieren.vbs speichern und folgendes ändern:" &vbcrlf warntext = warntext & "in der Zeile mit dem Quelltext // ' Modus = ""yes"" // muss lediglich das Hochkomma am Beginn gelöscht werden" & vbcrlf warntext = warntext & "dann kann das Script auch per Doppelklick SCHARF gestartet werden!" & vbcrlf warntext = warntext & "jetzt wird durch jeden DOPPELKLICK auf diese Datei BerechtigungenReparieren.vbs im jeweiligen Ordner und Unterordner die Berechtigungen geändert!" & vbcrlf & vbcrlf warntext = warntext & "ACHTUNG: Es wird keine Haftung für etwaige Schäden übernommen!!! Also VORSICHT bei der Verwendung" & vbcrlf & vbcrlf warntext = warntext & "[Feedback an Edi Pfisterer --> edi@schulnetz.info --> www.schulnetz.info]" & vbcrlf & vbCrLf & vbcrlf & vbCrLf Set objFSO = CreateObject("Scripting.FileSystemObject") dateiname = "Berechtigungsänderungen.txt" ueberordner = WScript.Arguments.Named.Item("Userordner") if len(ueberordner)= 0 then scriptname = Wscript.ScriptFullName ueberordner = objFSO.getparentfoldername(scriptname) end if warntext = warntext & "Aktuelles Verzeichnis: " & ueberordner & vbcrlf & vbcrlf Modus = WScript.Arguments.Named.Item("scharf") ' Modus = "yes" call InDateiSchreiben(warntext) Set objShell = CreateObject("WScript.Shell") objShell.Popup "Es werden nun alle eventuell zu verändernden Ordner einzeln aufpoppen! " & vbcrlf & "Lesen Sie in der Datei Benutzerberechtigungen.txt, die soeben angelegt wurde nach, wie Sie dieses Tool ""scharfstellen""!" & vbcrlf & "Um diese Tool zu stoppen, müssen Sie im Taskmanager die Datei wscript.exe beenden!", 20, "Info" Set objShell = Nothing call Ordnerliste(ueberordner) function Ordnerliste(pfad) Set objFolder = objFSO.GetFolder(pfad) Set colSubfolders = objFolder.Subfolders For Each objSubfolder in colSubfolders ' msgbox objSubfolder on Error resume next vollername = objFSO.GetAbsolutePathName(objSubfolder) NT_Benutzer = UserNameIsolieren(vollername) if Benutzerabfrage(NT_Benutzer) = 1 THEN if instr(1,modus,"yes",1) = 0 Then 'es wird lediglich eine txt erzeugt, Dateien bleiben unverändert call InDateiSchreiben(vollername) call InDateiSchreiben("USER GIBTS") befehl1 = "icacls " & vollername & " /setowner Administratoren /t /c /l /q " befehl2 = "cacls " & vollername & " /T /G Administratoren:F " & NT_Benutzer & ":C" befehl3 = "icacls " & vollername & " /setowner " & NT_Benutzer & " /t /c /l /q " InDateiSchreiben befehl1 InDateiSchreiben befehl2 InDateiSchreiben befehl3 Else befehl1 = "icacls " & vollername & " /setowner Administratoren /t /c /l /q " befehl2 = "cacls " & vollername & " /T /G Administratoren:F " & NT_Benutzer & ":C" befehl3 = "icacls " & vollername & " /setowner " & NT_Benutzer & " /t /c /l /q " ' InDateiSchreiben befehl1 ' InDateiSchreiben befehl2 ' InDateiSchreiben befehl3 Set objShell = CreateObject("WScript.Shell") objShell.Run "%comspec% /c echo j|" & befehl1, 0, 1 wscript.sleep 10 objShell.Run "%comspec% /c echo j|" & befehl2, 0, 1 wscript.sleep 10 objShell.Run "%comspec% /c echo j|" & befehl3, 0, 1 wscript.sleep 10 call InDateiSchreiben(vollername & " wurde auf den neuen Besitzer " & NT_Benutzer & " geändert!" & vbcrlf) ' Set objShell = CreateObject("WScript.Shell") ' objShell.Popup vollername & " wurde auf den neuen Besitzer " & NT_Benutzer & " geändert!", 5, "Info" ' Set objShell = Nothing objFSO.DeleteFile(vollername & "\desktop.ini") end If end if call Ordnerliste(vollername) Next end function function InDateiSchreiben(inhalt) set logbuch1 =objFSO.opentextfile(dateiname, 8, true,0) ' 8 zum anfügen logbuch1.write inhalt & vbcrlf logbuch1.close end function function UserNameIsolieren(strUsername) letzterBackslash = instrRev(strUsername,"\") laenge = len(strUsername) eigentlicherUsername = right(strUsername, laenge-letzterBackslash) 'call InDateiSchreiben(eigentlicherUsername) UserNameIsolieren = eigentlicherUsername end function function benutzerabfrage(strUserName) Set rootDSE = GetObject("LDAP://RootDSE") DomainName = rootDSE.Get("defaultnamingcontext") strObjectName = strUserName strObjectType = "user" strRootSearch = DomainName Set objConnection = CreateObject("ADODB.Connection") objConnection.Open "Provider=ADsDSOObject;" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection objCommand.CommandText = _ "<LDAP://" & strRootSearch & ">;(&(objectCategory=" & strObjectType & ")" & _ "(samAccountName=" & strObjectName & "));samAccountName,distinguishedName;subtree" Set objRecordSet = objCommand.Execute If objRecordset.RecordCount = 0 Then benutzerabfrage = 0 else benutzerabfrage = 1 end if objConnection.Close end function msgBox "Ich bin fertig!"