尽管应该是文件SDDL不相等

时间:2017-07-03 09:36:52

标签: powershell permissions file-permissions acl ntfs

我们正在尝试使用SDDL属性比较文件或文件夹的NTFS权限。我们唯一感兴趣的是ACL是否相等,使用SDDL而不是其他方法(如AccessToString)或仅比较两个普通的ACL对象。这是因为我们过去曾采用标准的方式解决这个问题。

因此,我们现在针对File1File2在检查Windows中的Advanced Permissions标签时具有完全相同权限的问题进行操作。但是,SDDL表示它并不相同,尽管我们从SDDL字符串中删除Owner O:部分,如所示here,因为所有者对我们不感兴趣。

代码:

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 个答案:

答案 0 :(得分: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
  ....
}