2017-07-03 3 views
1

のファイルSDDLが等しくないSDDL属性を使用して、ファイルまたはフォルダのNTFSアクセス許可を比較しようとしています。私たちが興味を持っているのは、ACLが等しいかどうかだけで、SDDLを使用し、AccessToStringのような方法や2つのプレーンなACLオブジェクトを比較しないことです。これは、これまでの標準的な方法で問題が発生したためです。ファイル

WindowsのAdvanced Permissionsタブを確認するときに、File1File2のアクセス権がまったく同じであるという問題に対して実行するようになりました。しかし、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 

問題?

答えて

1

ここでは.Equalsを使用していますか?

$sourceAcl = Get-Acl $source 
$targetAcl = Get-Acl $target 

if ($sourceAcl.sddl.Equals($targetAcl.sddl)) { 
    # Do something 
    .... 
} 

これにはオーナーが含まれますが、あなたがそれを削除しているあなたの例では、オブジェクトを文字列に変換しているので、Compare-Objectを使うことは本当に必要ではありません。私はまたあなたが使っている分割がどれほど安全であるかも分かりません。あなたも行うことができます:

$sourceAcl = Get-Acl $source 
$targetAcl = Get-Acl $target 
$s = $sourceAcl.sddl -replace "^O:[^:]+:","" 
$t = $targetAcl.sddl -replace "^O:[^:]+:","" 

if ($s -eq $t) { 
    # Do something 
    .... 
} 
+0

が、私はこの '$ CompParams.ReferenceObject.sddlの-splitを使用することを検討していた「\(」2、| 1 'は、実際に分割を使用するには正しいことではありません – DarkLite1

+0

-Last選択私は答えを更新しました – arco444

+1

一般的にそれをチェックする前にsddlを変更することは分かりやすいようには見えませんが、それはそれが意味するようには見えません文字列処理を使って解析することができます。オブジェクトをそのまま残して、 '.Equals()'メソッドと比較するとかなり安全です。 – arco444