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

时间:2009-11-19 19:50:33

标签: sql sql-server tsql active-directory

我有两个查询检索域中的所有组和所有用户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' 
    )

5 个答案:

答案 0 :(得分:18)

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

  

Get_ADGroups_ForUser 'Beau.Holland' - 帐号名称

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

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

答案 1 :(得分:14)

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


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

- 希尔伯特

答案 2 :(得分:12)

我认为这是基于T-SQL的AD接口的限制之一 - 您无法检索多值属性,例如:属性(如用户的memberOf),其中包含多个值。

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

所以我担心你不得不采取另一种方式解决这个问题 - 例如查找并填充托管代码中的组成员身份(单独在SQL Server之外,或者可能作为SQL Server中的CLR程序集)。

更新:有关OPENQUERY AD提供商限制的说明,请参阅here (MSDN Support)

  

限制
使用过程   拉开OPENQUERY语句   来自LDAP服务器的信息   受到一些限制。该   可以绕过限制   有些情况,但在其他情况下   应用程序设计必须改变。一个   外部应用程序或COM对象   使用ADSI来检索   来自LDAP服务器的信息和   然后使用ADO在SQL中构建一个表   或其他数据访问方法   另一种可行的方法。

     

第一个限制是   多值属性不能   在结果集中返回到SQL   服务器。 ADSI将读取架构   来自LDAP服务器的信息   定义了结构和语法   。使用的类和属性   服务器。如果属性是   从LDAP服务器请求的是   在架构中定义为   多值它不能归还   一个OPENQUERY声明。

答案 3 :(得分:1)

实际上,检索用户所属的所有组的列表并不像看起来那么简单/容易。据我所知,PowerShell和其他脚本都无法提供完全准确的结果,即使在检索tokenGroups属性时也是如此,因为为了做出此决定,还必须考虑特定于域的内置组的成员身份。

ActiveDirSec.org上有一个非常有用的主题,我认为你可能觉得有用 - How to enumerate the list of all Active Directory domain security groups that a user belongs to?

根据我的经验,我了解到这并不像看起来那么容易,除非您有办法确认输出,否则也无法知道您的脚本是否提供了正确的结果。

答案 4 :(得分:-1)

Microsoft Technet脚本中心是脚本的绝佳资源

http://technet.microsoft.com/en-us/scriptcenter/default.aspx

这是一个声称可以准确提供您想要的内容的脚本:

http://gallery.technet.microsoft.com/ScriptCenter/en-us/ab5400e2-489a-4738-9b85-508bcb5b75f8