要确定哪些访问控制条目 (ACE) 授予您所说的权限,首先您需要知道要注意的 ObjectType GUID。servicePrincipalName 属性的 GUID 为f3a64788-5306-11d1-a9c5-0000f80367c1
。已验证的写入共享其属性的 GUID,因此我们仍在寻找一个。由于 SPN 是“公共信息”属性集的成员,因此您还需要注意它的 GUID:e48d0154-bcf8-11d1-8702-00c04fb96050
因此,您正在寻找满足以下条件之一的 ACE:
- WriteProperty 的 AccessMask 并且没有 ObjectType 或空的 GUID 对象类型,因为这意味着 ACE 授予写入所有属性和属性集的能力
- WriteProperty 的 AccessMask 和 f3a64788-5306-11d1-a9c5-0000f80367c1 的 ObjectType GUID
- WriteProperty 的 AccessMask 和 e48d0154-bcf8-11d1-8702-00c04fb96050 的 ObjectType GUID
- Self 的 AccessMask(表示已验证的写入)和 f3a64788-5306-11d1-a9c5-0000f80367c1 的 ObjectType GUID
此外,可以使用“GenericWrite”代替上面的 WriteProperty。在 PowerShell 中可能是这样的:
$ServicePrincipalNameProperty = [guid] 'f3a64788-5306-11d1-a9c5-0000f80367c1'
$PublicInformationPropertySet = [guid] 'e48d0154-bcf8-11d1-8702-00c04fb96050'
$ValidatedWrite = [System.DirectoryServices.ActiveDirectoryRights]::Self
$WriteProperty = [System.DirectoryServices.ActiveDirectoryRights]::WriteProperty
$GenericWrite = [System.DirectoryServices.ActiveDirectoryRights]::GenericWrite
Get-ADComputer ComputerName -Properties ntSecurityDescriptor | ForEach-Object {
$SD = $_.ntSecurityDescriptor
$SD.Access | where {
# Look for the access rights that would grant write capabilities
($_.ActiveDirectoryRights -band $ValidatedWrite) -eq $ValidatedWrite -or
($_.ActiveDirectoryRights -band $WriteProperty) -eq $WriteProperty -or
($_.ActiveDirectoryRights -band $GenericWrite) -eq $GenericWrite
} | where ObjectType -in $null, ([guid]::Empty), $ServicePrincipalNameProperty, $PublicInformationPropertySet
}
我认为这可以向您展示您感兴趣的 ACE。如果您只关心 IdentityReference,则可以将其拉出并丢弃其余部分。如果您将 Get-ADComputer 调用更改为使用 -Filter,这应该适用于多台计算机(您可以使用 Add-Member 将 samAccountName 添加到每个 ACE,这样您就可以将它们区分开来)。
还有一件事:这没有考虑继承和传播标志或 InheritedObjectTypes,因此您可能会看到一些在技术上不会授予您正在寻找的权利的 ACE...