首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TSQL:如何获取Active Directory中用户所属的组列表

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

Stack Overflow用户
提问于 2009-11-19 19:50:32
回答 5查看 86.1K关注 0票数 15

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

代码语言:javascript
运行
复制
--; 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 中的所有组的列表?

更新i能够得到相反的结果

给定组名,检索所有用户

代码语言:javascript
运行
复制
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' 
    )
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-11-19 20:18:51

我认为这是基于that接口的限制之一--您不能检索多值属性,例如包含多个值的属性(比如用户的memberOf )。

您可以检索单值属性,如"sn“(姓氏=姓氏)或"givenName”和"mail“等等,但基于SQL的接口无法处理诸如"memberOf”之类的属性,并分配给它们几个值。

因此,恐怕您必须采取另一种方法来解决这个问题--例如,在托管代码中查找和填充组成员(在Server之外,或者可能作为Server中的CLR程序集)。

更新:参见这里(MSDN支持)以了解OPENQUERY AD提供程序的限制:

局限性 使用OPENQUERY语句从LDAP服务器提取信息的过程确实受到了一些限制。在某些情况下,这些限制是可以避免的,但在另一些情况下,应用程序设计必须改变。使用ADSI从LDAP服务器检索信息,然后使用ADO或其他数据访问方法在SQL中构建表的外部应用程序或COM对象是另一种可行的方法。 第一个限制是,即多值属性不能在结果集中返回给Server。ADSI将从LDAP服务器读取模式信息,该服务器定义服务器使用的类和属性的结构和语法。如果从LDAP服务器请求的属性在模式中定义为多值属性,则不能在OPENQUERY语句中返回该属性。

票数 13
EN

Stack Overflow用户

发布于 2013-11-19 09:09:36

下面的存储过程,使用示例执行:

Get_ADGroups_ForUser 'Beau.Holland‘--AccountName

注意:将LDAP://DC= DC=local替换为您自己的域。

代码语言:javascript
运行
复制
CREATE PROCEDURE dbo.Get_ADGroups_ForUser
(
    @Username NVARCHAR(256) 
)
AS
BEGIN

    DECLARE @Query NVARCHAR(1024), @Path NVARCHAR(1024)

    -- Find the fully qualified CN e.g: CN=Beau Holland,OU=Users,OU=Australia,OU=NSO,OU=Company,DC=Domain,DC=local
    -- replace "LDAP://DC=Domain,DC=local" with your own domain
    SET @Query = '
        SELECT @Path = distinguishedName
        FROM OPENQUERY(ADSI, ''
            SELECT distinguishedName 
            FROM ''''LDAP://DC=Domain,DC=local''''
            WHERE 
                objectClass = ''''user'''' AND
                sAMAccountName = ''''' + @Username + '''''
        '')
    '
    EXEC SP_EXECUTESQL @Query, N'@Path NVARCHAR(1024) OUTPUT', @Path = @Path OUTPUT 

    -- get all groups for a user
    -- replace "LDAP://DC=Domain,DC=local" with your own domain
    SET @Query = '
        SELECT cn,AdsPath
        FROM OPENQUERY (ADSI, ''<LDAP://DC=Domain,DC=local>;(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=' + @Path +'));cn, adspath;subtree'')'

    EXEC SP_EXECUTESQL @Query  

END
GO
票数 23
EN

Stack Overflow用户

发布于 2010-07-07 18:02:39

您可以通过获取在其成员属性中包含用户的所有组,或者更好地获取用户的LDAP路径(distinguishedName)来实现这一点。这是一个简单的程序来做这个工作。

代码语言:javascript
运行
复制
CREATE PROCEDURE dbo.GetLdapUserGroups
(
    @LdapUsername NVARCHAR(256)
)
AS
BEGIN
    DECLARE @Query NVARCHAR(1024), @Path NVARCHAR(1024)

    SET @Query = '
        SELECT @Path = distinguishedName
        FROM OPENQUERY(ADSI, ''
            SELECT distinguishedName 
            FROM ''''LDAP://DC=domain,DC=com''''
            WHERE 
                objectClass = ''''user'''' AND
                sAMAccountName = ''''' + @LdapUsername + '''''
        '')
    '
    EXEC SP_EXECUTESQL @Query, N'@Path NVARCHAR(1024) OUTPUT', @Path = @Path OUTPUT 

    SET @Query = '
        SELECT name AS LdapGroup 
        FROM OPENQUERY(ADSI,''
            SELECT name 
            FROM ''''LDAP://DC=domain,DC=com''''
            WHERE 
                objectClass=''''group'''' AND
                member=''''' + @Path + '''''
        '')
        ORDER BY name
    '
    EXEC SP_EXECUTESQL @Query

END

-希尔伯特

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1766061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档