2017-07-03 74 views
1

,但文件SDDL並不相​​等我們嘗試使用SDDL屬性比較文件或文件夾的NTFS權限。我們唯一感興趣的是ACL是否相等,通過使用SDDL而不是其他方法如AccessToString或僅比較兩個純ACL對象。這是因爲我們過去使用標準方法來解決問題。儘管它應該是

因此,我們現在針對在檢查Windows中的Advanced Permissions選項卡時File1File2具有完全相同的權限的問題。但是,SDDL表示它不相同,儘管我們從012DL中刪除了SDDL字符串中的Owner O:部分,因爲所有者不感興趣。

代碼:

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 

你可以清楚地看到有兩個文件之間的差異:

$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,而不會在這個比較文件問題?

回答

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 |選擇-Last 1' – DarkLite1

+0

實際使用的分裂是不正確的事我已經更新了答案 – arco444

+1

在檢查sddl之前修改sddl看起來並不是一件明智的事情,它看起來並不像它意味着什麼我們可以用字符串處理來分析它,將對象保持原樣並與'.Equals()'方法比較會更安全 – arco444

相關問題