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