¿Por qué Set-Acl en la raíz de la unidad intenta establecer la propiedad del"objeto"?


Me gustaría cambiar la ACL de la unidad C:. Lo que estoy tratando de hacer es eliminar el permiso que un usuario puede crear una carpeta directamente en la unidad. Probé el script en otra carpeta mientras lo escribía. Funcionó sin problemas. Después de la finalización he intentado el script en nuestro envoirnment prueba en la unidad real. Tengo un error que no puedo averiguar. Si elimino el permiso de forma manual, funciona sin problemas. Alguien tiene una 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

El error es:

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
Author: Anthony Mastrean, 2011-07-08

5 answers

Encontré la respuesta. Microsoft dice

Desafortunadamente a Get-Acl le faltan algunas características. Siempre lee el descriptor de seguridad completo, incluso si solo desea modificar la DACL. Es por eso que Set-ACL también quiere escribir el propietario incluso si no lo ha cambiado. Usar el método GetAccessControl le permite especificar qué parte del descriptor de seguridad desea leer.

Reemplace la llamada Get-Acl por

$acl = (Get-Item $path).GetAccessControl('Access')
 60
Author: UdK.cH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-11 20:24:12

Necesita el SeRestorePrivilege para establecer el propietario. Usé el script de Lee Holmes de la URL de abajo para elevar mi proceso con este priv adicional y pude establecer el propietario a alguien que no sea yo.

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

Probé el método (get-item $path).getaccesscontrol("access") pero aún así obtuve el mismo error ya que mi proceso no tenía el SeRestorePrivilege.

 8
Author: pjh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-29 16:36:31

El siguiente código funciona para mí:

$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
Author: Neel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-10 22:33:53

La gente puede encontrar esto más fácil:

icacls c:\ /remove "authenticated users"
 0
Author: js2010,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-16 19:12:08

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

Funcionó para mí. Corro mi PS Script desde CMD y en este PS Script corro otro PS Script todo funciona bien siempre y cuando lo haga con mi propio Usuario. Cuando uso un usuario diferente obtengo el mismo error: Set-Acl: No se permite que el identificador de seguridad sea el propietario de este objeto.

Acaba de cambiar Get-ACL a esa Línea de arriba y funcionó bien. Gracias de nuevo.

 -1
Author: Luka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-03 07:22:01