Powershell 文件SDDL不相等,尽管它应该是

Powershell 文件SDDL不相等,尽管它应该是,powershell,permissions,file-permissions,acl,ntfs,Powershell,Permissions,File Permissions,Acl,Ntfs,我们正在尝试使用SDDL属性比较文件或文件夹的NTFS权限。我们唯一感兴趣的是ACL是否相等,方法是使用SDDL,而不是使用其他方法,如AccessToString或只是比较两个普通ACL对象。这是因为我们在过去的标准方法中遇到了问题 因此,我们现在遇到了一个问题,File1和File2在检查Windows中的Advanced permissions选项卡时具有完全相同的权限。然而,SDDL表示它不相等,尽管我们从SDDL字符串中删除了所有者O:部分,如图所示,因为所有者对我们不感兴趣 代码:

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

因此,我们现在遇到了一个问题,
File1
File2
在检查Windows中的
Advanced permissions
选项卡时具有完全相同的权限。然而,SDDL表示它不相等,尽管我们从SDDL字符串中删除了
所有者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来比较文件而不会遇到此问题?

在这里使用
.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之前修改sddl通常看起来不明智,它看起来不像是要用字符串处理进行分析。这样会更安全使对象保持不变并与
.Equals()进行比较
method然后我们也比较了所有者,这是我们不想要的。尝试了更新的
replace
,但它仍然报告了差异,因为
DUD:AI
部分仍然存在。您如何确定这不正确?我个人相信来自对象的响应,而不是GUI中显示的内容