Active Directory:获取用户的角色

时间:2016-09-28 07:50:16

标签: active-directory ldap roles

1) - 我正在寻找LDAP查询(Active Directory)来获取给定用户的角色(组),而不指定用户的dinstinguished名称。

我能够使用此请求获得此信息:(&(objectclass = group)(成员:1.2.840.113556.1.4.1941:= cn = admin,ou = users,ou = OUTest,dc =例如,DC = COM))

但我不想为用户指定整个根(ou = users,ou = OUTest,dc = example,dc = com)。

2) - 我如何使用" sAMAccountName"来获取给定用户的组。而不是通用名CN?

(*)成员:1.2.840.113556.1.4.1941用于获取Active Directory中的所有嵌套组。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

有关ActiveDirectory中1.2.840.113556.1.4.1941 matching rule的文档是明确的。强调我的:

  

1.2.840.113556.1.4.1941
  LDAP_MATCHING_RULE_IN_CHAIN

     

此规则仅限于适用于DN的过滤器。这是一个特殊的“扩展”匹配运算符,它将对象中的祖先链一直遍历到根,直到找到匹配为止

除了完整的DN之外,不可能将它与任何内容一起使用,因为它与包含完整DN的属性匹配。

  

但我不想为用户指定整个根

虽然运气好。 ;)

以允许用户使用更方便的方式构建程序,例如samAccountName并将其转换为具有完整DN的搜索字符串。

例如在Powershell中:

function Get-ADUserGroups($username) {
    if ($username) {
        Get-ADUser $username | ForEach-Object {
            $userDN = $_.DistinguishedName
            $ldapFilter = "(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=$userDN))"

            Get-ADObject -LDAPFilter $ldapFilter
        }
    }
}

用法

Get-ADUserGroups userXYZ

或者,为此,常规Windows批处理(GetADUserGroups.bat)中的内容相同:

@echo off
setlocal enabledelayedexpansion

set USER=%~1

if "%USER%" neq "" (
    for /f "delims=" %%d in ('dsquery user -samid "%USER%"') do (
        set "LDAP_FILTER=(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=%%~d))"
        dsquery * -filter "!LDAP_FILTER!" -limit 1000
    )
)

用法

GetADUserGroups userXYZ