Active directory Active Directory:获取用户的角色

Active directory Active Directory:获取用户的角色,active-directory,ldap,roles,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=example,dc=com)) 但是我不想为用户指定整个根目录(ou=users,ou=OUTest,dc=example,dc=com) 2) -如何使用“sAM

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

我可以使用这个请求来获取它:(&(objectclass=group)(成员:1.2.840.113556.1.4.1941:=cn=admin,ou=users,ou=OUTest,dc=example,dc=com))

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

2) -如何使用“sAMAccountName”而不是通用名CN获取给定用户的组

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


提前感谢。

有关ActiveDirectory中的的的文档是明确的。重点地雷:

1.2.840.113556.1.4.1941

LDAP\u匹配\u链中的规则\u

此规则仅限于应用于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
        }
    }
}
用法


或者,为了实现这一点,在常规Windows批处理(GetADUserGroups.bat)中使用相同的方法:

用法

Get-ADUserGroups userXYZ
@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