help - obtener ayuda de un comando powershell
Establecer indicadores de herencia y propagación con set-acl y powershell (5)
Aquí está la página de MSDN que describe las banderas y cuál es el resultado de sus diversas combinaciones.
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).
Para que aplique los permisos al directorio, así como a todos los directorios y archivos secundarios recursivamente, querrá usar estos indicadores:
InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit
PropagationFlags.None
Entonces, el cambio de código específico que debe hacer para su ejemplo es:
$PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None
Intento imitar la acción de hacer clic derecho en una carpeta, configurar "modificar" en una carpeta y hacer que los permisos se apliquen a la carpeta y subcarpetas y archivos específicos.
Casi siempre estoy usando Powershell, sin embargo, la herencia solo se establece como "subcarpetas y archivos" en lugar de "toda esta carpeta, subcarpetas y archivos".
¿Hay algún indicador no listado para System.Security.AccessControl.PropagationFlags que establecerá esto correctamente?
Esto es lo que estoy trabajando hasta ahora.
$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
}
Aquí hay un código sucinto de Powershell para aplicar nuevos permisos a una carpeta al modificar su ACL existente (Lista de control de acceso).
# 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''
Cada uno de los valores en la lista de variables $permissions
pertenece a los parámetros de este constructor para la clase FileSystemAccessRule .
Cortesía de esta página .
Aquí hay una tabla para ayudar a encontrar las banderas requeridas para diferentes combinaciones de permisos.
╔═════════════╦═════════════╦═══════════════════════════════╦════════════════════════╦══════════════════╦═══════════════════════╦═════════════╦═════════════╗ ║ ║ 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 ║ ╚═════════════╩═════════════╩═══════════════════════════════╩════════════════════════╩══════════════════╩═══════════════════════╩═════════════╩═════════════╝
Entonces, como dijo David, querrás
InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit PropagationFlags.None
Creo que tu respuesta se puede encontrar en esta página . De la página:
Esta carpeta, subcarpetas y archivos:
InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit PropagationFlags.None
Solo porque estás en PowerShell no te olvidas de los buenos viejos. A veces pueden proporcionar la solución más fácil, por ejemplo:
icacls.exe $folder /grant ''domain/user:(OI)(CI)(M)''