如何在Active Directory计算机对象上列出“已验证的写入服务主体名称”和“写入服务主体名称”的权限

时间:2017-01-30 21:44:49

标签: c# powershell active-directory adsi spn

有人可以帮我解决以下问题

我正在尝试做一些与这篇文章非常相似的内容

Powershell: How do you set the Read/Write Service Principal Name AD Permissions?

基本上我不需要设置/更改权限,而是需要读取权限

在AD(Active Directory)中的计算机对象上,您“允许”用户,组或计算机对象(同一台计算机或另一台计算机对象)对计算机对象的以下属性/属性的“写入”权限< / p>

经过验证的写入服务主体名称写入服务主体名称

因此,假设在计算机对象Server01上,用户Domain \ Fred被“允许”为“验证写入服务主体名称”,并且“允许”为“写服务主体名称”

保罗,约翰和苏珊都拥有与弗雷德相同的权利

现在假设我在AD域中拥有500台具有上述权利组合的计算机

我想获取计算机对象(我知道如何使用PowerShell或ADSI,.NET)

然后我想列出谁拥有这些计算机对象的上述权利(这就是我坚持的一点)如何列出输出权限(而不是检查每个用户,组)和计算机一次一个,看看他们是否拥有这些权利),看看谁可以为我域中的计算机设置这些SPN相关值。

非常感谢提前 __AAnotheruser

1 个答案:

答案 0 :(得分:1)

要确定哪些访问控制条目(ACE)授予您正在谈论的权限,首先您需要知道要关注的ObjectType GUID。 servicePrincipalName属性的GUID为f3a64788-5306-11d1-a9c5-0000f80367c1。验证的写入共享其属性的GUID,因此我们仍然只是寻找一个。由于SPN是“公共信息”属性集的成员,因此您还需要注意它的GUID:e48d0154-bcf8-11d1-8702-00c04fb96050

因此,您正在寻找符合以下条件之一的ACE:

  • WriteMperty的AccessMask,没有ObjectType或空GUID 对象类型,因为这意味着ACE授予写入能力 所有财产和财产集
  • WriteProperty的AccessMask和。的ObjectType GUID f3a64788-5306-11d1-a9c5-0000f80367c1
  • WriteProperty的AccessMask和。的ObjectType GUID e48d0154-bcf8-11d1-8702-00c04fb96050
  • SelfM的AccessMask(表示经过验证的写入)和ObjectType GUID of f3a64788-5306-11d1-a9c5-0000f80367c1

此外,可以使用'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在技术上不会授予您正在寻找的权限......

相关问题