-1

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

我正在尝试做与这篇文章非常相似的事情

Powershell:如何设置读/写服务主体名称 AD 权限?

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

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

验证写入服务主体名称写入服务主体名称

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

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

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

我想获取计算机对象(我知道如何使用 PowerShell 或 ADSI、.NET 来执行此操作)

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

非常感谢 __AAnotheruser

4

1 回答 1

1

要确定哪些访问控制条目 (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...

于 2017-02-10T04:23:19.870 回答