Besitzer von Ordnern per Skript ändern


sehr verwirrender ArtikelNaja, ganz OKbrauchbar für Checker...guter Artikelsehr guter Artikel - Danke

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 [2896 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  :roll:

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!"




This entry was posted in Active Directory, Scripts, Windows 7, Windows Server 2008. Bookmark the permalink.

2 Responses to Besitzer von Ordnern per Skript ändern

  1. Sven Schumann says:

    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

  2. Edi Pfisterer says:

    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

Hinterlasse eine Antwort