我们正在尝试使用SDDL
属性比较文件或文件夹的NTFS权限。我们唯一感兴趣的是ACL是否相等,使用SDDL而不是其他方法(如AccessToString
)或仅比较两个普通的ACL对象。这是因为我们过去曾采用标准的方式解决这个问题。
因此,我们现在针对File1
和File2
在检查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比较文件?
答案 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
....
}