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
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 pourquoiSet-ACL
souhaite également écrire le propriétaire même si vous ne l’avez pas changé. L'utilisation de la méthodeGetAccessControl
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')
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
.
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\"
Les gens peuvent trouver cela plus facile:
icacls c:\ /remove "authenticated users"