web-dev-qa-db-fra.com

PowerShell pour définir les autorisations de dossier

J'essaie d'utiliser les options "par défaut" dans l'application des autorisations de dossier; je veux dire par là que l’utilisation du "Contrôle complet, Écriture, Lecture, etc." dans les "Propriétés" d’un dossier.

Le script suivant permet d’ajouter l’utilisateur à, mais il applique les "autorisations spéciales", et non celles cochées pour celles visibles dans le menu des propriétés du dossier:

$Acl = Get-Acl "\\R9N2WRN\Share"

$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule ("user","FullControl","Allow")

$Acl.SetAccessRule($Ar)
Set-Acl "\\R9N2WRN\Share" $Acl

Qu'est-ce que je fais mal, s'il vous plaît?

29
The Woo

La spécification de l'héritage dans le constructeur FileSystemAccessRule() résout ce problème, comme le montre le code modifié ci-dessous (remarquez que les deux nouveaux paramètres de constuctor insérés entre "FullControl" et "Allow").

$Acl = Get-Acl "\\R9N2WRN\Share"

$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule("user", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow")

$Acl.SetAccessRule($Ar)
Set-Acl "\\R9N2WRN\Share" $Acl

Selon ce sujet

"Lorsque vous créez une FileSystemAccessRule comme vous l'avez fait, la propriété InheritanceFlags est définie sur None. Dans l'interface graphique, cela correspond à une ACE avec le champ Apply To défini sur" Ce dossier uniquement "et ce type d'entrée doit être affiché. à travers les paramètres avancés. "

J'ai testé la modification et cela fonctionne, mais il va sans dire que le MVP a publié la réponse à ce sujet.

58
PeterK

En se référant à réponse de Gamaliel : $ args est un tableau des arguments passés dans un script au moment de l'exécution - en tant que tel, il ne peut pas être utilisé tel que Gamaliel l'utilise. Cela fonctionne réellement:

$myPath = 'C:\whatever.file'
# get actual Acl entry
$myAcl = Get-Acl "$myPath"
$myAclEntry = "Domain\User","FullControl","Allow"
$myAccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($myAclEntry)
# prepare new Acl
$myAcl.SetAccessRule($myAccessRule)
$myAcl | Set-Acl "$MyPath"
# check if added entry present
Get-Acl "$myPath" | fl
2
Mike L'Angelo

Au cas où vous auriez à traiter avec un grand nombre de sous-dossiers contenant des sous-dossiers et d'autres éléments récursifs. Petite amélioration de @ Mike L'Angelo :

$mypath = "path_to_folder"
$myacl = Get-Acl $mypath
$myaclentry = "username","FullControl","Allow"
$myaccessrule = New-Object System.Security.AccessControl.FileSystemAccessRule($myaclentry)
$myacl.SetAccessRule($myaccessrule)
Get-ChildItem -Path "$mypath" -Recurse -Force | Set-Acl -AclObject $myacl -Verbose

La verbosité est facultative dans la dernière ligne

0
Vladimir
$path = "C:\DemoFolder"
$acl = Get-Acl $path
$username = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$Attribs = $username, "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow"
$AccessRule = New-Object System.Security.AcessControl.FileSystemAccessRule($Attribs)
$acl.SetAccessRule($AccessRule)
$acl | Set-Acl $path
Get-ChildItem -Path "$path" -Recourse -Force | Set-Acl -aclObject $acl -Verbose
0
Norman