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



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

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

在这里使用.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
....
}

最新更新