Besitzer und Sicherheitseinstellungen von Ordnern im AD per Skript ändern


sehr verwirrender ArtikelNaja, ganz OKbrauchbar für Checker...guter Artikelsehr guter Artikel - Danke [1 Bewertung, Durchschnitt: 3,00]

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

This entry was posted in Active Directory, Scripts, VBScript. Bookmark the permalink.

Hinterlasse eine Antwort