web-dev-qa-db-ja.com

ドライブルートのSet-Aclが「オブジェクト」の所有権を設定しようとするのはなぜですか?

C:ドライブのACLを変更したい。私がしようとしていることは、ユーザーがドライブに直接フォルダーを作成できる権限を削除することです。スクリプトの作成中に、別のフォルダーでスクリプトをテストしました。問題なく動作しました。完了後、実際のドライブでテスト環境のスクリプトを試しました。理解できないエラーが表示されます。権限を手動で削除すると、問題なく機能します。誰かがアイデアを得ましたか?

$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
33
UdK.cH

答えを見つけました。マイクロソフトは言う

残念ながらGet-Aclにはいくつかの機能がありません。 DACLを変更したい場合でも、常に完全なセキュリティ記述子を読み取ります。それが理由です Set-ACLは、所有者を変更していない場合でも、所有者を記述したいと考えています。 GetAccessControlメソッドを使用すると、セキュリティ記述子のどの部分を読み取るかを指定できます。

Get-Aclで呼び出す

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

所有者を設定するには、SeRestorePrivilegeが必要です。以下のURLのLee Holmesのスクリプトを使用して、この追加の特権でプロセスを昇格させ、所有者を自分以外の誰かに設定することができました。

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

(get-item $path).getaccesscontrol("access")メソッドですが、プロセスにSeRestorePrivilegeがないため、同じエラーが発生します。

8
pjh

以下のコードは私のために働きます:

$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

人々はこれをより簡単に見つけるかもしれません:

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