Why does Set-Acl on the drive root try to set ownership of the "object"?
Asked Answered
S

5

34

I would like to change the ACL of the C: drive. What im trying to do is remove the permission that a user can create a folder directly on the drive. I tested the script on another folder while writing it. It worked without a problem. After completion i tried the script in our test envoirnment on the actual drive. I get an error that i cant figure out. If i remove the permission manualy it works without a problem. Anyone got an idea?

$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

The error is:

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
Seppala answered 8/7, 2011 at 8:53 Comment(1)
Found the answer. Sorry for posting it here. I dont have the permission to post an answer to my own question in the next 4hrs. Replace $objACL = Get-ACL $path With $objACL = (get-item $path).getaccesscontrol("Access")Seppala
S
68

I found the answer. Microsoft says

Unfortunately Get-Acl is missing some features. It always reads the full security descriptor even if you just want to modify the DACL. That’s why Set-ACL also wants to write the owner even if you have not changed it. Using the GetAccessControl method allows you to specify what part of the security descriptor you want to read.

Replace the Get-Acl call with

$acl = (Get-Item $path).GetAccessControl('Access')
Seppala answered 11/7, 2011 at 6:37 Comment(3)
Can you cite the Microsoft source please?Lucia
The earliest reference to this I could find was a Dec 14, 2010 blog that quoted Microsoft without citing the source: web.archive.org/web/20120107061856/http://www.bilalaslam.com/…Gynaecomastia
@AnthonyKlotz the response from MS was from a Microsoft employee "Babak Ramak" in the old TechNet Powershell Forum - social.technet.microsoft.com/Forums/windowsserver/en-US/…Daves
A
8

You need the SeRestorePrivilege to set the owner. I used Lee Holmes' script from the URL below to elevate my process with this additional priv and was able to set the owner to someone other than myself.

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

I tried the (get-item $path).getaccesscontrol("access") method but still got the same error since my process didn't have the SeRestorePrivilege.

Adigun answered 10/4, 2012 at 16:56 Comment(3)
Many thanks for this. Found via Google, and helped me solve a completely different problem.Petition
Thank you, this was the point for me. I also discovered that a possible workaround to set the owner is to use the "local UNC" version of the path, e.g. if you want to set the owner for C:\test.txt you need to call SetAccessControl method on the item (get-item "\\localhost\C$\test.txt")Aggie
Although this works, I prefer the selected solution about rather using (Get-Item $path).GetAccessControl('Access') to get the ACL objectDisinclined
A
1

The below code works for me:

$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\"
Antares answered 10/10, 2014 at 21:10 Comment(0)
B
0

People may find this easier:

icacls c:\ /remove "authenticated users"
Berbera answered 16/8, 2018 at 18:41 Comment(0)
F
-1

$Acl = (Get-Item $Path).GetAccessControl('Access')

Worked for me. I run my PS Script from CMD and in this PS Script i run another PS Script everything works fine as long as i do it with my own User. When i use different User i get the same Error: Set-Acl : The security identifier is not allowed to be the owner of this object.

Just changed Get-ACL to that Line above and it worked fine. Thanks again.

Famish answered 3/2, 2016 at 7:22 Comment(1)
No need to create an answer to thank anybody's else answerNepil

© 2022 - 2024 — McMap. All rights reserved.