web-dev-qa-db-fra.com

Définition des indicateurs d'héritage et de propagation avec set-acl et powershell

J'essaie d'imiter l'action de cliquer avec le bouton droit sur un dossier, de définir "modifier" sur un dossier et de faire appliquer les autorisations au dossier et aux sous-dossiers et fichiers spécifiques.

J'utilise principalement Powershell, mais l'héritage n'est défini que comme "sous-dossiers et fichiers" au lieu de l'ensemble "ce dossier, sous-dossiers et fichiers".

Existe-t-il un indicateur non répertorié pour System.Security.AccessControl.PropagationFlags qui le définira correctement?

Voici ce avec quoi je travaille jusqu'à présent.

$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
} 
44
Tim AtLee

Je pense que votre réponse se trouve sur cette page . Depuis la page:

Ce dossier, sous-dossiers et fichiers:

InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit 
PropagationFlags.None
32
David Gladfelter

Voici un tableau pour vous aider à trouver les indicateurs requis pour différentes combinaisons d'autorisations.

    ╔═════════════╦═════════════╦═════════════════════ ══════════╦════════════════════════╦══════════════ ════╦═══════════════════════╦═════════════╦═══════ ══════╗ 
 ║ ║ dossier uniquement ║ dossier, sous-dossiers et fichiers ║ dossier et sous-dossiers ║ dossier et fichiers ║ sous-dossiers et fichiers ║ sous-dossiers ║ fichiers ║ 
 ╠═════════════╬═════════════╬═══════════════════ ════════════╬════════════════════════╬════════════ ══════╬═════ ══════════════════╬═════════════╬═════════════╣ 
 ║ Propagation ║ aucun ║ aucun ║ aucun ║ aucun ║ InheritOnly ║ InheritOnly ║ InheritOnly ║ 
 ║ Héritage ║ aucun ║ Container | Object ║ Container ║ Object ║ Container | Object ║ Container ║ Object ║ 
 ╚═════════════╩═════════════╩═════════════════════ ══════════╩════════════════════════╩══════════════ ════╩═══════════════════════╩═════════════╩═══════ ══════╝ 

Donc, comme l'a dit David, vous voudrez

 InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit 
 PropagationFlags.Aucun 
 
67
Nick Sarabyn

Tout simplement parce que vous êtes dans PowerShell, n'oubliez pas de bons anciens ex. Parfois, ils peuvent fournir la solution la plus simple, par exemple:

icacls.exe $folder /grant 'domain\user:(OI)(CI)(M)'
8
Keith Hill

Voici un code Powershell succinct pour appliquer de nouvelles autorisations à un dossier en modifiant son ACL (liste de contrôle d'accès) existante.

# 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'

Chacune des valeurs de $permissions la liste des variables appartient aux paramètres de ce constructeur pour la classe FileSystemAccessRule .

Gracieuseté de cette page .

5
Luke

Voici la page MSDN décrivant les drapeaux et quel est le résultat de leurs différentes combinaisons.

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).

Pour qu'il applique les autorisations au répertoire, ainsi qu'à tous les répertoires et fichiers enfants de manière récursive, vous voudrez utiliser ces indicateurs:

InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit 
PropagationFlags.None

Ainsi, le changement de code spécifique que vous devez apporter à votre exemple est le suivant:

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