一尘不染

TSQL:如何获取用户在Active Directory中所属的组的列表

sql

我有两个查询,用于检索域中的所有组和所有用户, Mydomain

--; Get all groups in domain MyDomain
select  *  
from    OpenQuery(ADSI, '
    SELECT  samaccountname,mail,sn,name, cn, objectCategory
    FROM    ''LDAP://Mydomain/CN=users,DC=Mydomain,DC=com'' 
    WHERE   objectCategory=''group'' 
    ORDER BY cn
    ')

--; Get all users in domain MyDomain
select  *  
from    OpenQuery(ADSI,'
    SELECT objectCategory, cn, sn, mail, name, department,samaccountname
    FROM ''LDAP://Mydomaindomain/CN=users,DC=Mydomain,DC=com'' 
    WHERE objectCategory=''user'' 
    ORDER BY cn
    ')
--  where   samaccountname='mylogin'

我想找出的是

如何检索MyDomain特定用户所属的所有组的列表?

[更新] 我能够得到相反的结果
给定组名,检索所有用户

select  *  
from    OpenQuery(ADSI,
    'SELECT objectCategory, cn, sn, mail, name, department
    FROM ''LDAP://Mydomain/CN=users,DC=wl-domain,DC=com'' 
    WHERE MemberOf=''cn=_____GROUPNAME_____,CN=users,DC=Mydomain,DC=com''
    ORDER BY cn' 
    )

阅读 158

收藏
2021-03-10

共1个答案

一尘不染

我认为这是基于T-SQL的AD界面的局限性之一-您无法检索多值属性,例如memberOf其中具有多个值的属性(如针对用户的属性)。

您可以检索单值属性,例如“ sn”(姓氏=姓氏)或“ givenName”和“ mail”等,但是基于SQL的接口无法处理分配有多个值的属性,例如“memberOf”给他们。

因此,恐怕您将不得不采用另一种方法来解决此问题-例如,在托管代码中查找并填充组成员身份(分别在SQL Server外部或在SQLServer内部作为CLR程序集)。

更新: 请参见此处(MSDN支持)以了解OPENQUERY
AD提供程序的局限性:

局限性

使用OPENQUERY语句从LDAP服务器提取信息的过程确实存在一些局限性。在某些情况下可以避免这些限制,但是在其他情况下,必须更改应用程序设计。另一种可行的方法是使用ADSI从LDAP服务器检索信息,然后通过使用ADO或其他数据访问方法在SQL中构建表的外部应用程序或COM对象。

第一个限制是 多值属性无法 在结果集返回 到SQL
Server。ADSI将从LDAP服务器读取模式信息,该信息定义了服务器使用的类和属性的结构和语法。如果从LDAP服务器请求的属性在模式中定义为多值,则不能在OPENQUERY语句中返回该属性。

2021-03-10