【问题标题】:Active Directory: get the roles of a userActive Directory:获取用户的角色
【发布时间】:2017-02-06 01:30:09
【问题描述】:

1)- 我正在寻找 LDAP 的查询 (Active Directory) 以获取给定用户的角色(组),而无需指定用户的可识别名称。

我可以使用这个请求得到这个:(&(objectclass=group)(member: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 获取给定用户的组?

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

提前谢谢你。

【问题讨论】:

    标签: active-directory ldap roles


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      • 2016-10-16
      相关资源
      最近更新 更多