のファイルSDDLが等しくないSDDL
属性を使用して、ファイルまたはフォルダのNTFSアクセス許可を比較しようとしています。私たちが興味を持っているのは、ACLが等しいかどうかだけで、SDDLを使用し、AccessToString
のような方法や2つのプレーンなACLオブジェクトを比較しないことです。これは、これまでの標準的な方法で問題が発生したためです。ファイル
WindowsのAdvanced Permissions
タブを確認するときに、File1
とFile2
のアクセス権がまったく同じであるという問題に対して実行するようになりました。しかし、SDDLはそれが平等ではないと言っていますが、のようにSDDL文字列からOwner O:
部分を取り除いていますが、所有者は私たちに興味がありません。
コード:
$AccessParams.ReferenceObject
DUD:(A;ID;FA;;;BA)(A;ID;0x1200a9;;;S-1-5-21-1078081533-261478967-839522115-243052)(A;ID;0x1301ff;;;S-1
-5-21-1078081533-261478967-839522115-280880)(A;ID;0x1301ff;;;S-1-5-21-1078081533-261478967-839522115-6
96733)(A;ID;0x1301ff;;;S-1-5-21-1078081533-261478967-839522115-696745)
$AccessParams.DifferenceObject
DUD:AI(A;ID;FA;;;BA)(A;ID;0x1200a9;;;S-1-5-21-1078081533-261478967-839522115-243052)(A;ID;0x1301ff;;;S
-1-5-21-1078081533-261478967-839522115-280880)(A;ID;0x1301ff;;;S-1-5-21-1078081533-261478967-839522115
-696733)(A;ID;0x1301ff;;;S-1-5-21-1078081533-261478967-839522115-696745)
このに実行せずにSDDLを使用してファイルを比較する方法があります:あなたは明らかに両方のファイルに差がある見ることができます
Function Test-ACLequal {
Param (
$Source,
$Target
)
$CompParams = @{
ReferenceObject = Get-Acl -LiteralPath $Source
PassThru = $True
}
$CompParams.DifferenceObject = Get-Acl -LiteralPath $Target
$AccessParams = @{
ReferenceObject = ($CompParams.ReferenceObject.sddl -split 'G:', 2 | Select -Last 1)
DifferenceObject = ($CompParams.DifferenceObject.sddl -split 'G:', 2 | Select -Last 1)
PassThru = $True
}
if (Compare-Object @AccessParams) {
Write-Verbose 'Test-ACLequalHC: Not equal'
$false
}
else {
Write-Verbose 'Test-ACLequalHC: Equal'
$True
}
}
Test-ACLequal -Source $File1-Target $File2
問題?
が、私はこの '$ CompParams.ReferenceObject.sddlの-splitを使用することを検討していた「\(」2、| 1 'は、実際に分割を使用するには正しいことではありません – DarkLite1
-Last選択私は答えを更新しました – arco444
一般的にそれをチェックする前にsddlを変更することは分かりやすいようには見えませんが、それはそれが意味するようには見えません文字列処理を使って解析することができます。オブジェクトをそのまま残して、 '.Equals()'メソッドと比較するとかなり安全です。 – arco444