2010-07-19 13 views
32

Próbuję naśladować działanie kliknięcia prawym przyciskiem myszy w folderze, ustawienie "Modyfikuj" w folderze i mając uprawnienia dotyczą określonego folderu i podfolderów i plików .Ustawianie flag dziedziczenia i propagacji za pomocą set-acl i powershell

Przeważnie używam Powershell, jednak dziedziczenie jest ustawiane tylko jako "podfoldery i pliki" zamiast całego "tego folderu, podfolderów i plików".

Czy jest jakiś niepubliczny znacznik dla System.Security.AccessControl.PropagationFlags, który ustawi to poprawnie?

Oto, nad czym pracuję do tej pory.

$Folders = Get-childItem c:\TEMP\ 
$InheritanceFlag = [System.Security.AccessControl.InheritanceFlags]::ContainerInherit -bor [System.Security.AccessControl.InheritanceFlags]::ObjectInherit 
$PropagationFlag = [System.Security.AccessControl.PropagationFlags]::InheritOnly 
$objType = [System.Security.AccessControl.AccessControlType]::Allow 

foreach ($TempFolder in $Folders) 
{ 
echo "Loop Iteration" 
$Folder = $TempFolder.FullName 

$acl = Get-Acl $Folder 
$permission = "domain\user","Modify", $InheritanceFlag, $PropagationFlag, $objType 
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission 

$acl.SetAccessRule($accessRule) 
Set-Acl $Folder $acl 
} 
+9

Sporządziłem wykres mapowania między oknami dialogowymi uprawnień do plików i wynikającymi z nich uprawnieniami: http://bit.ly/inheritMatrix –

+0

Proszę dodać modyfikację z poniższego kodu, aby to działało. – riahc3

Odpowiedz

23

Myślę, że odpowiedź można znaleźć na this page. Od strony:

tym folderze podfoldery i pliki:

InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit 
PropagationFlags.None 
+1

Dzięki - działa idealnie ! –

+1

Czy możesz dodać kod? Łączenie ze stroną i cytowanie IMO nie jest właściwą odpowiedzią. – riahc3

8

Tylko dlatego, że jesteś w PowerShell nie zapomniał o dobrych ol”eks. Czasami mogą zapewnić najłatwiejsze rozwiązanie, np .:

icacls.exe $folder /grant 'domain\user:(OI)(CI)(M)' 
+0

Tak, prawie rozwiązałem problemy z plikiem wsadowym DOS i icacls lub setacl, ale staram się nauczyć powershell. Najlepszym sposobem nauki jest rozwiązywanie problemów z tym itp. –

+1

Rozumiem. OTOH Używam PowerShell przez> 5 lat i nie waham się wrócić do EXE, jeśli jest znacznie łatwiejszy niż odpowiednik PowerShell. IOW jest dużo do nauczenia się w PowerShell - niektóre bardziej warte zachodu niż inne. :-) –

47

Oto tabela ułatwiająca znalezienie wymaganych flag dla różnych kombinacji uprawnień.

 ╔═════════════╦═════════════╦═══════════════════════════════╦════════════════════════╦══════════════════╦═══════════════════════╦═════════════╦═════════════╗ 
    ║    ║ folder only ║ folder, sub-folders and files ║ folder and sub-folders ║ folder and files ║ sub-folders and files ║ sub-folders ║ files ║ 
    ╠═════════════╬═════════════╬═══════════════════════════════╬════════════════════════╬══════════════════╬═══════════════════════╬═════════════╬═════════════╣ 
    ║ Propagation ║ none  ║ none       ║ none     ║ none    ║ InheritOnly   ║ InheritOnly ║ InheritOnly ║ 
    ║ Inheritance ║ none  ║ Container|Object    ║ Container    ║ Object   ║ Container|Object  ║ Container ║ Object  ║ 
    ╚═════════════╩═════════════╩═══════════════════════════════╩════════════════════════╩══════════════════╩═══════════════════════╩═════════════╩═════════════╝ 

Tak, jak Dawid powiedział, będziemy chcieli

 
    InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit 
    PropagationFlags.None 

+0

bardzo ładne .. dzięki. – nawfal

+4

+1 dla tabeli. Dałabym +1 dla postaci z kartonu, gdybym tylko mógł :) – Timwi

0

Oto the MSDN page opisujący flagi i co jest wynikiem ich różnych kombinacji.

Flag combinations => Propagation results 
========================================= 
No Flags => Target folder. 
ObjectInherit => Target folder, child object (file), grandchild object (file). 
ObjectInherit and NoPropagateInherit => Target folder, child object (file). 
ObjectInherit and InheritOnly => Child object (file), grandchild object (file). 
ObjectInherit, InheritOnly, and NoPropagateInherit => Child object (file). 
ContainerInherit => Target folder, child folder, grandchild folder. 
ContainerInherit, and NoPropagateInherit => Target folder, child folder. 
ContainerInherit, and InheritOnly => Child folder, grandchild folder. 
ContainerInherit, InheritOnly, and NoPropagateInherit => Child folder. 
ContainerInherit, and ObjectInherit => Target folder, child folder, child object (file), grandchild folder, grandchild object (file). 
ContainerInherit, ObjectInherit, and NoPropagateInherit => Target folder, child folder, child object (file). 
ContainerInherit, ObjectInherit, and InheritOnly => Child folder, child object (file), grandchild folder, grandchild object (file). 
ContainerInherit, ObjectInherit, NoPropagateInherit, InheritOnly => Child folder, child object (file). 

Aby mieć ona zastosowanie uprawnienia do katalogu, a także wszystkich katalogów i plików rekursywnie dzieci, będziemy chcieli użyć tych znaczników:

InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit 
PropagationFlags.None 

Tak specyficzna zmiana kodu musisz aby dla przykładu jest:

$PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None 
4

Oto niektóre zwięzły kod PowerShell, aby zastosować nowe uprawnienia do folderu, modyfikując to istniejąca ACL (Access Control List).

# Get the ACL for an existing folder 
$existingAcl = Get-Acl -Path 'C:\DemoFolder' 

# Set the permissions that you want to apply to the folder 
$permissions = $env:username, 'Read,Modify', 'ContainerInherit,ObjectInherit', 'None', 'Allow' 

# Create a new FileSystemAccessRule object 
$rule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $permissions 

# Modify the existing ACL to include the new rule 
$existingAcl.SetAccessRule($rule) 

# Apply the modified access rule to the folder 
$existingAcl | Set-Acl -Path 'C:\DemoFolder' 

Każda z wartości na liście zmiennej $permissions dotyczą parametrów this constructor dla klasy FileSystemAccessRule.

Dzięki uprzejmości this page.