codememo

드라이브 루트의 Set-Acl이 "객체"의 소유권을 설정하려고 하는 이유는 무엇입니까?

tipmemo 2023. 9. 5. 20:30
반응형

드라이브 루트의 Set-Acl이 "객체"의 소유권을 설정하려고 하는 이유는 무엇입니까?

ACL의 .C:드라이브. 사용자가 드라이브에 직접 폴더를 만들 수 있는 권한을 제거하려고 합니다.저는 스크립트를 작성하는 동안 다른 폴더에서 테스트했습니다.문제없이 작동했습니다.완료 후 실제 드라이브의 테스트 환경에서 스크립트를 사용해 보았습니다.알 수 없는 오류가 발생합니다.허가 매뉴얼을 삭제하면 문제없이 작동합니다.생각나는 사람?

$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

오류:

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

답을 찾았습니다.마이크로소프트의 말

도 불하게도행.Get-Acl일부 기능이 누락되었습니다.DACL을 수정하려는 경우에도 항상 전체 보안 설명자를 읽습니다.그렇기 때문에Set-ACL또한 사용자가 변경하지 않았더라도 소유자를 쓰기를 원합니다. GetAccessControlmethod를 사용하면 보안 설명자의 어떤 부분을 읽을 것인지 지정할 수 있습니다.

를 합니다.Get-Acl로 전화를 걸다.

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

당신은 그것이 필요합니다.SeRestorePrivilege소유자를 설정합니다.아래 URL에 있는 Lee Holmes의 스크립트를 사용하여 이 추가 권한으로 제 프로세스를 향상시켰으며 소유자를 제가 아닌 다른 사람으로 설정할 수 있었습니다.

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

는 해습니다를 요.(get-item $path).getaccesscontrol("access")방법이지만 내 프로세스가 없었기 때문에 여전히 동일한 오류가 발생했습니다.SeRestorePrivilege.

다음 코드는 저에게 적합합니다.

$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\"

사람들은 이것을 더 쉽게 찾을 수 있습니다.

icacls c:\ /remove "authenticated users"

$Acl = (Get-Item $Path).액세스 제어 가져오기('액세스')

나를 위해 일했습니다.저는 CMD에서 PS 스크립트를 실행하고 이 PS 스크립트에서는 다른 PS 스크립트를 실행합니다. 제 사용자만 사용하면 모든 것이 정상적으로 작동합니다.다른 사용자를 사용할 때 동일한 오류가 발생합니다. Set-Acl : 보안 식별자는 이 개체의 소유자가 될 수 없습니다.

방금 Get-ACL을 위 라인으로 변경했는데 잘 작동했습니다.다시한번 감사합니다.

언급URL : https://stackoverflow.com/questions/6622124/why-does-set-acl-on-the-drive-root-try-to-set-ownership-of-the-object

반응형