【问题标题】:File SDDL not equal although it should be文件 SDDL 不相等,但应该相等
【发布时间】:2017-12-06 12:37:53
【问题描述】:

我们正在尝试使用 SDDL 属性比较文件或文件夹的 NTFS 权限。我们唯一感兴趣的是 ACL 是否相等,通过使用 SDDL 而不是其他方法,如 AccessToString 或仅比较两个普通 ACL 对象。这是因为我们过去在执行此操作时遇到了问题。

因此,我们现在遇到一个问题,即在 Windows 中检查 Advanced Permissions 选项卡时,File1 和 File2 具有完全相同的权限。但是,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 比较文件而不会遇到这个问题?

【问题讨论】:

    标签: powershell permissions file-permissions acl ntfs


    【解决方案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
      ....
    }
    

    【讨论】:

    • 我正在考虑使用这个$CompParams.ReferenceObject.sddl -split '\(', 2 | Select -Last 1
    • 实际上使用拆分根本不是正确的做法,您需要完全剥离字符串的那部分。我已经更新了答案
    • 在检查之前修改 sddl 通常看起来并不明智,它看起来不像是要通过字符串处理来分析。将对象保持原样并与.Equals()方法进行比较会更安全
    • 然后我们也比较所有者,这是我们不想要的。尝试了更新后的replace,但它仍然报告了一个差异,因为DUD:AI 部分仍然存在。
    • 您如何确定这不正确?就我个人而言,我会相信来自对象的响应而不是 GUI 中显示的内容
    猜你喜欢
    • 2014-07-19
    • 2022-01-14
    • 2018-06-01
    • 2018-02-12
    • 1970-01-01
    • 2016-02-21
    • 2013-12-17
    • 1970-01-01
    • 2016-03-28
    相关资源
    最近更新 更多