none
Löschen und setzen von Ordne berechtigungen RRS feed

  • Frage

  • Hallo zusammen

    Ich habe ein Script gebaut dass mir die Userhomberechtigungen durchführen soll. Im Script werden dem Benutzer "modify" Rechte vergeben. Danach sollen alle Berechtigungen entfernt werden welche von oben vererbt wurden und nicht "Fullcontrol" sind.

    Das Problem ist nun das beim 1. Durchgang nur die Berechtigungen gesetzt werden. Ich muss das Script ein zweites mal ausführen damit auch die Berechtigungen gelöscht werden. Ich glaube der ackn liegt am foreeach bzw. der  $accessrule aber ich kome nicht weiter.

    Clear-Host
    $kuerzel = "Domain\user"
    $userhomepfad = "C:\temp\test\tes00203"
    # Userhome erstellen und berechtigen
    # http://msdn.microsoft.com/de-de/library/system.security.accesscontrol.filesystemaccessrule.filesystemaccessrule%28v=vs.80%29.aspx
    
    # Wenn der Ordner noch nicht existiert erstelle ihn neu
    	if ( (Test-Path "$userhomepfad") -eq $false)
    		{
    		New-Item $userhomepfad -Type "Directory"
    		start-sleep -s 2
    		}
    	# Inheritance This Folder, Subfolders and Files)
    	$inherit = [system.security.accesscontrol.InheritanceFlags]"ContainerInherit, ObjectInherit"
    	# Retrieve the ACL
    	$aCL = Get-Acl $userhomepfad
    	# Block inheritance and keep the ACEs
    	$aCL.SetAccessRuleProtection($true,$true)
    	# For every ACE
    
        #write $acl.Access #test
        $aCL.Access | ForEach-Object {if ($_.FileSystemRights -notlike "FullControl") {$aCL.RemoveAccessRule($_)}}
        #write $acl.Access	
        # Create Ace
    	$accessRuleUser = New-Object System.Security.AccessControl.FileSystemAccessRule($kuerzel, "Modify", $inherit, "None", "Allow")
    	# Add Ace to Acl	
    	$aCL.AddAccessRule($accessRuleUser)
    	# Set Acl to the directory
    	Set-Acl -aclobject $aCL -path $Userhomepfad
        #write $acl #test

    Danke für die Zeit die ihr euch nehmt.

    Florian

    Mittwoch, 18. Juni 2014 11:35

Antworten

  • Ich habe nun unseren AZUBI darauf angesetzt und er hat doch eine Lösung gefunden. Der SET-ACL Befehl muss 2x ausgeführt werden. Wichtig ist dann die Variable $acl neu auszulesen. Die Idee von Olaf ist natürlich auch gut.

    .....
    
    # Block inheritance and keep the ACEs
    $aCL.SetAccessRuleProtection($true,$true)
    Set-Acl -aclobject $aCL -path $Userhomepfad
    $aCL = Get-Acl $userhomepfad
    $aCL.Access | ForEach-Object {if ($_.FileSystemRights -notlike "FullControl") {$aCL.RemoveAccessRule($_)}}
    #$aCL.Access | ForEach-Object {$aCL.RemoveAccessRule($_)}
    # Create Ace
    $accessRuleUser = New-Object System.Security.AccessControl.FileSystemAccessRule($kuerzel, "Modify", $inherit, "None", "Allow")
    # Add Ace to Acl
    $aCL.AddAccessRule($accessRuleUser)
    # Set Acl to the directory
    Set-Acl -aclobject $aCL -path $Userhomepfad

    Danke und villeicht hilft es ja jemandem weiter.

    Gruss
    florian

    Donnerstag, 19. Juni 2014 13:02
  • Moin,

    manchmal lebt man einfacher, wenn man bereits Vorgefertigtes nimmt. Beispielsweise den icacls-Befehl.

    Beispiel aus einer bei uns dafür verwendeten cmd-Datei:
    icacls \\server\home\Benutzername /GRANT:R Domäne\Benutzername:(CI)(OI)M Administratoren:(CI)(OI)F /inheritance:R /T
    icacls \\server\home\Benutzername /setowner Domäne\Benutzername
    Pause

    Die Pause am Ende kannst Du ggf. auch weglassen, wenn Du den Output nicht sehen willst oder musst.

    Falls bereits gefüllte Ordner beackert werden müssen, kann es sein, dass Du die Besitzübernahme schon mal als erste Zeile für den die cmd-Datei ausführenden Account durchführen musst, da sonst manchmal sogar Admins keinen Zugriff haben.

    Eine Mischung von PowerShell und cmd ist ebenfalls denkbar.

    Viele Grüße
    Olaf

    Mittwoch, 18. Juni 2014 14:31

Alle Antworten

  • Moin,

    manchmal lebt man einfacher, wenn man bereits Vorgefertigtes nimmt. Beispielsweise den icacls-Befehl.

    Beispiel aus einer bei uns dafür verwendeten cmd-Datei:
    icacls \\server\home\Benutzername /GRANT:R Domäne\Benutzername:(CI)(OI)M Administratoren:(CI)(OI)F /inheritance:R /T
    icacls \\server\home\Benutzername /setowner Domäne\Benutzername
    Pause

    Die Pause am Ende kannst Du ggf. auch weglassen, wenn Du den Output nicht sehen willst oder musst.

    Falls bereits gefüllte Ordner beackert werden müssen, kann es sein, dass Du die Besitzübernahme schon mal als erste Zeile für den die cmd-Datei ausführenden Account durchführen musst, da sonst manchmal sogar Admins keinen Zugriff haben.

    Eine Mischung von PowerShell und cmd ist ebenfalls denkbar.

    Viele Grüße
    Olaf

    Mittwoch, 18. Juni 2014 14:31
  • Ich habe nun unseren AZUBI darauf angesetzt und er hat doch eine Lösung gefunden. Der SET-ACL Befehl muss 2x ausgeführt werden. Wichtig ist dann die Variable $acl neu auszulesen. Die Idee von Olaf ist natürlich auch gut.

    .....
    
    # Block inheritance and keep the ACEs
    $aCL.SetAccessRuleProtection($true,$true)
    Set-Acl -aclobject $aCL -path $Userhomepfad
    $aCL = Get-Acl $userhomepfad
    $aCL.Access | ForEach-Object {if ($_.FileSystemRights -notlike "FullControl") {$aCL.RemoveAccessRule($_)}}
    #$aCL.Access | ForEach-Object {$aCL.RemoveAccessRule($_)}
    # Create Ace
    $accessRuleUser = New-Object System.Security.AccessControl.FileSystemAccessRule($kuerzel, "Modify", $inherit, "None", "Allow")
    # Add Ace to Acl
    $aCL.AddAccessRule($accessRuleUser)
    # Set Acl to the directory
    Set-Acl -aclobject $aCL -path $Userhomepfad

    Danke und villeicht hilft es ja jemandem weiter.

    Gruss
    florian

    Donnerstag, 19. Juni 2014 13:02