8

powershell と set-acl を使用して新しい filesystemaccess ルールを設定すると、継承フラグが子オブジェクトとリーフ オブジェクトに伝播するように設定されます。

$acl.AddAccessRule((New-Object System.Security.AccessControl.FileSystemAccessRule(
    "username","FullControl", "ContainerInherit, ObjectInherit", "None", "Allow")))
Set-Acl -path $filename -aclObject $acl

エクスプローラーのアクセス許可を見ると、セキュリティタブで..詳細..伝播が正しく設定されています。しかし、子自体を見ると、新しいセキュリティ ルールは表示されません。

エクスプローラーの場合は、別の SID で別のルールを追加して保存します (「すべての子オブジェクトのアクセス許可を置き換える...」オプションを強制せずに)。次に、マニュアルと powershell ルールの両方が子に表示されます。それはあたかも、子が新しく伝播されたルールを取得するために必要な何らかのキックスタートがあるかのようです。追加された新しいルールを子オブジェクトに表示するには何が欠けていますか?

4

3 に答える 3

7

私は同じ論理的な問題を抱えていました...

$acl.AddAccessRule((New-Object System.Security.AccessControl.FileSystemAccessRule(
"username","FullControl", "ContainerInherit, ObjectInherit", "None", "Allow")))

その最後の「なし」であなたは言っています:伝播しないでください...に変更:

$acl.AddAccessRule((New-Object System.Security.AccessControl.FileSystemAccessRule(
"username","FullControl", "ContainerInherit, ObjectInherit", "InheritOnly", "Allow")))

設定が反映されます。ここでアクセス ルールのオプションを確認してください: http://msdn.microsoft.com/en-us/library/ms147785.aspx

これらは伝播フラグです: http://msdn.microsoft.com/en-us/library/system.security.accesscontrol.propagationflags.aspx

于 2012-09-25T12:19:58.933 に答える
2

それは非常に奇妙です。同じ方法でアクセス許可を設定する同様のコードがあります。ただし、子供の権限が設定されているかどうかは確認していません。これは、Windows エクスプローラーの UI がおかしいだけかもしれません。PowerShell を使用して子の 1 つで ACL を取得し、アクセス許可が適用されているかどうかを確認しましたか?

参考までに、アクセス許可を付与するために使用するコードを次に示します

foreach( $permission in $Permissions )
{
    $right = ($permission -as "Security.AccessControl.FileSystemRights")
    if( -not $right )
    {
        throw "Invalid FileSystemRights: $permission.  Must be one of $([Enum]::GetNames("Security.AccessControl.FileSystemRights"))."
    }
    $rights = $rights -bor $right
}

Write-Host "Granting $Identity $Permissions on $Path."
# We don't use Get-Acl because it returns the whole security descriptor, which includes owner information.
# When passed to Set-Acl, this causes intermittent errors.  So, we just grab the ACL portion of the security descriptor.
# See http://www.bilalaslam.com/2010/12/14/powershell-workaround-for-the-security-identifier-is-not-allowed-to-be-the-owner-of-this-object-with-set-acl/
$currentAcl = (Get-Item $Path).GetAccessControl("Access")

$inheritanceFlags = [Security.AccessControl.InheritanceFlags]::None
if( Test-Path $Path -PathType Container )
{
    $inheritanceFlags = ([Security.AccessControl.InheritanceFlags]::ContainerInherit -bor `
                         [Security.AccessControl.InheritanceFlags]::ObjectInherit)
}
$propagationFlags = [Security.AccessControl.PropagationFlags]::None
$accessRule = New-Object "Security.AccessControl.FileSystemAccessRule" $identity,$rights,$inheritanceFlags,$propagationFlags,"Allow"    
$currentAcl.SetAccessRule( $accessRule )
Set-Acl $Path $currentAcl
于 2012-06-12T01:28:17.107 に答える