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