web-dev-qa-db-fra.com

Pourquoi Set-Acl à la racine du lecteur essaie-t-il de définir la propriété de "l'objet"?

Je voudrais changer la liste de contrôle d'accès du lecteur C:. Ce que je tente de faire, c’est de retirer à un utilisateur la permission de créer un dossier directement sur le lecteur. J'ai testé le script sur un autre dossier en l'écrivant. Cela a fonctionné sans problème. Après avoir terminé, j’ai essayé le script dans notre environnement de test sur le lecteur. Je reçois une erreur que je ne peux pas comprendre. Si je supprime l'autorisation manuellement, cela fonctionne sans problème. Quelqu'un a une idée?

$path = "C:\"

$colRights = [System.Security.AccessControl.FileSystemRights]"CreateDirectories"

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

$objType =[System.Security.AccessControl.AccessControlType]::Allow 
$objUser = New-Object System.Security.Principal.NTAccount("Authenticated Users") 
$objACE = New-Object System.Security.AccessControl.FileSystemAccessRule ($objUser, $colRights, $InheritanceFlag, $PropagationFlag, $objType) 

$objACL = Get-ACL $path 
$objACL.RemoveAccessRule($objACE) 

Set-ACL $path $objACL

L'erreur est:

Set-Acl : The security identifier is not allowed to be the owner of this object.
At C:\Users\mhodler\Desktop\Remove Permission.ps1:57 char:8
+ Set-ACL <<<<  $path $objACL
    + CategoryInfo          : InvalidOperation: (C:\:String) [Set-Acl], InvalidOperationException
+ FullyQualifiedErrorId : System.InvalidOperationException,Microsoft.PowerShell.Commands.SetAclCommand
32
UdK.cH

J'ai trouvé la réponse. Microsoft dit 

Malheureusement, il manque certaines fonctionnalités à Get-Acl. Il lit toujours le descripteur de sécurité complet même si vous souhaitez simplement modifier la liste DACL. C’est pourquoi Set-ACL souhaite également écrire le propriétaire même si vous ne l’avez pas changé. L'utilisation de la méthode GetAccessControl vous permet de spécifier la partie du descripteur de sécurité que vous souhaitez lire.

Remplacez l'appel Get-Acl par

$acl = (Get-Item $path).GetAccessControl('Access')
62
UdK.cH

Vous avez besoin de la variable SeRestorePrivilege pour définir le propriétaire. J'ai utilisé le script de Lee Holmes à partir de l'URL ci-dessous pour améliorer mon processus avec ce privilège supplémentaire et j'ai pu définir le propriétaire sur une autre personne que moi.

http://www.leeholmes.com/blog/2010/09/24/adjusting-token-privileges-in-powershell/

J'ai essayé la méthode (get-item $path).getaccesscontrol("access") mais j'ai toujours la même erreur car mon processus n'avait pas la SeRestorePrivilege.

8
pjh

Le code ci-dessous fonctionne pour moi:

$ApplicationPoolIdentity = "everyone"

function SetACL()
{
    param (
        [Parameter(Mandatory=$true)]
        [string]        $Path 
    )

    $Acl = (Get-Item $Path).GetAccessControl('Access')
    Write-Host "Path:" $Path "ID:" $ApplicationPoolIdentity
    $Ar = New-Object  system.security.accesscontrol.filesystemaccessrule($ApplicationPoolIdentity,"Write","Allow")
    $Acl.SetAccessRule($Ar)
    Write-Host $Acl
    $Acl | Set-Acl $Path
}

SetACL "C:\Test\"
1
Neel

Les gens peuvent trouver cela plus facile:

icacls c:\ /remove "authenticated users"
0
js2010