Wer zum jährlichen Anlegen neuer Schüleraccounts das Porgramm EUser von Koll. Steingruber verwendet, arbeitet vermutlich mit den dadurch angelegten UserOrdnern, die üblicherweise mit dem Laufwerksbuchstaben H: beim Login gemappt werden. (bekannt als das “Homeverzeichnis”)
Probleme können nun auftreten, wenn diese Ordner verschoben werden (da der Server getauscht wird o. ä.)….
Probleme können vor allem auftreten, wenn vergessen wird, die NTFS-Berechtigungen mitzuübertragen (hier sollte xcopy QuelleZiel /O /X /E /H /K — oder wer eine GUI möchte — Total Commander mit den entsprechenden Einstellungen verwendet werden).
Ich hatte nun bei einem Kunden den Fall, dass zwar die NTFS-Berechtigungen, jedoch NICHT der jeweilige Besitzer mitübertragen wurde. Dies wirkt sich äußerst nachteilig auf die Verwendung von Kontingenten aus.
Weiters wurden bei ihm nun unter Windows 7 die Ordnernamen nicht mehr richtig angezeigt, sondern alle Ordner erschienen als “Eigene Dateien”, wenn er als Administrator eingeloggt war (was sich dadurch erklärt, dass der Administrator gleich der Besitzer dieser Ordner ist). Dieses Verhalten der falsch angezeigten Ordnernamen tritt im übrigen nur dann auf, wenn der jeweilige Ordner die Datei desktop.ini enthält…
Ich habe nun ein Script geschrieben, dass dieses Problem behebt.
Funktionsweise:
Es wird für jeden Ordner (und alle Unterordner) geprüft, ob es einen zugehörigen User im Active Directory gibt, bei dem der Username und der Ordnername ident sind.
Wird ein gleichlautender User gefunden, so übernimmt dieser User den Besitz des Ordners (und alle Unterordner sowie Dateien).
Benutzung:
Beim erstmaligen Ausführen der Datei aus einem beliebigen Ordner wird die Datei “Berechtigungsänderungen.txt” angelegt, in der alle nötigen Informationen enthalten sind.
Tipp: das Skript verändert den Besitzer nur, wenn es aus einer Command-Shell wie folgt aufgerufen wird:
BerechtigungenReparieren.exe /scharf:YES /Userordner:Q:\meineHomeshares\Schueler
[wobei Q:\meineHomeshares\Schueler natürlich für den zu verändernden Ordner steht!!!]
Durch blosses Doppelklicken des Scripts wird lediglich die Ordnerstruktur + eventuellem Active Directory User in der Berechtigungsänderungen.txt angezeigt, aber NICHTS veärndert.
Voraussetzungen:
Das Script funktioniert NUR mit Windows 7 bzw. Windows Server 2008
(Sollte jemand noch Windows Server 2003 verwenden, sollte er das Tool von einem Windows 7 – Client aus starten, und als Userordner einfach den UNC-Pfad angeben [z.B: \\meinServer\home$])
Download:
BerechtigungenReparieren.exe [2940 x heruntergeladen]
Ich übernehme KEINE HAFTUNG für irgendwelche Schäden (eh klar)…
Sollte sich jemand unsicher sein mit dem Tool, kann er es einfach durch Doppelklick in einem beliebigen Ordner mit den Homeshares starten und die jeweiligen Zeilen, die in der .txt-Datei angeführt werden, in einer Commandshell ausprobieren, ob sie das tun, was er möchte.
[Alternative: aus einer Commandshell BerechtigungenReparieren.exe /scharf:NO /Userordner:Q:\meineHomeshares\Schueler
]
Wenn dann anschließend die gesamte Ordnerstruktur in der .txt kontrolliert wurde, kann das Script SCHARF gestartet werden.
Feedback - welches auch immer – ist very warm welcome…
(wobei “Edi, Du bist mein Held” oder “Edi, Du kommst in jedem meiner Abendgebete vor” wohlwollender entgegengenommen wird
Quelltext:
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 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") befehl = "icacls " & vollername & " /setowner " & NT_Benutzer & " /t /c /l /q" call InDateiSchreiben(befehl) call InDateiSchreiben(vbcrlf) Set objShell = CreateObject("WScript.Shell") objShell.Popup vollername & " würde auf den neuen Besitzer " & NT_Benutzer & " geändert werden, wenn Sie das Tool ""scharf"" stellen würden....", 5, "Info" Set objShell = Nothing Else befehl = "icacls " & vollername & " /setowner " & NT_Benutzer & " /t /c /l /q " Set objShell = CreateObject("WScript.Shell") objShell.Run "%comspec% /c echo j|" & befehl, 0, 1 'WshShell.Run "cmd /q echo j|" & befehl , 0, 1 Call InDateiSchreiben (befehl) 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) BenutzerVorhanden = 0 Set rootDSE = GetObject("LDAP://RootDSE") DomainName = rootDSE.Get("defaultnamingcontext") DomainString = Replace(DomainName, "DC=", "") DomainString = Replace(DomainString, ",", ".") Set objDomain = GetObject("WinNT://" & DomainString) objDomain.Filter = Array("user") For Each User In objDomain If lcase(User.Name) = lcase(strUserName) Then BenutzerVorhanden = 1 End If Next if BenutzerVorhanden THEN Benutzerabfrage = 1 End Function msgBox "Ich bin fertig!"
Hallo,
erstmal Vielen Danke für den Script,
aber leider setzt es mir die Verzeichnise im Lehrerhomeverzeichnise, wo es fast jeden Schüler darunter gibt auch auf die Berechtigung des Schülers. Weil er den Name in der ADS findet.
Kann man das Auswahlkriterum für den Besitzer auf der obersten Ebene festmachen und trotzdem durchvererben?
Danke und Viele Grüße
Sven Schumann
Hallo!
Freut mich, dass du das Script verwenden kannst.
Die Lösung ist denkbar einfach:
Quellcode als irgendeinname.vbs speichern,
ein Hochkomma vor die Zeile 85, in der steht:
Call ordnerliste[...]
also:
‘ Call ordnerliste[...]
FERTIG
Btw: hier gibt eine verbesserte Version:
http://www.schulnetz.info/besitzer-und-sicherheitseinstellungen-von-ordnern-im-ad-per-skript-andern/
Gutes gelingen,
LG
Edi