4

首先,我需要在SQL Server中检索属于特定组成员的用户列表。我确实设法在网上找到了一些完美的工作。解决方案如下:活动目录 - 获取用户和组,特定组的成员

CREATE PROCEDURE [dbo].[NES_GetADGroupMembers] 
    (@groupName VARCHAR(max)) 
AS 
BEGIN 
    CREATE TABLE #MemberOfGroups 
    (
     groupName varchar(400), 
     cn varchar(400), 
     displayName varchar(400) 
    ) 

    SET NOCOUNT ON 

    DECLARE @t varchar(100), @t2 varchar(1000), 
      @ot varchar (4000), @tt varchar (4000); 

    DECLARE gC CURSOR FOR 
     SELECT cn, distinguishedName 
     FROM openquery (ADSI, 'SELECT cn, distinguishedName 
           FROM ''''LDAP://Mydomaindomain/CN=users,DC=Mydomain,DC=com'''' 
           WHERE objectCategory = ''group''') 

    OPEN gC 

    FETCH NEXT FROM gC INTO @t, @t2 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     SET @ot = '''SELECT cn, displayName 
        FROM ''''LDAP://Mydomaindomain/CN=users,DC=Mydomain,DC=com'''' 
        WHERE objectCategory = ''''Person'''' AND objectClass = ''''user'''' 
        AND memberOf=''''' + @t2 + ''''''; 

     SET @tt = 'select '+ ''''[email protected]+'''' +' As groupName, cn, displayName from openquery(ADSI,'+ @ot +''') order by cn' 

     INSERT INTO #MemberOfGroups (groupName, cn, displayName) 
      EXEC (@tt) 

     FETCH NEXT FROM gC INTO @t, @t2 
    END 

    CLOSE gC 
    DEALLOCATE gC 

    SELECT 
     groupName, displayName 
    FROM 
     #MemberOfGroups 

现在,它的工作正常,返回输入组的用户。

但是,我有一个新的请求,即一个组可以有其他“组”作为成员,就像用户一样。

我试图在WHERE条件中更新我的过滤器,以包含objectClass = ''group'',但它不起作用。

任何人都知道一些关于这些查询,并可以帮助我检索组(输入组的成员)呢?

+0

我认为你的问题是与过滤器 - 取出ObjectCategory = Person,因为“组”可能不是一个人,并看看你是否得到答案。 –

+0

我试着删除它,并且还添加了一个“OR”语句,但是徒劳。 –

回答

0

我假设你的组在用户的OU(文件夹)内?我的AD设置在一个名为SecurityGroups的独立CN中有组。从技术上讲,你可以这样做:

SELECT cn, member FROM ''''LDAP://Mydomaindomain/CN=<actual OU of groups?>,DC=Mydomain,DC=com''''

member会给你所有该组的成员的DN。然后你有一组成员,只需要将它们与他们相应的用户(或组!)对象进行匹配。因为这基本上返回一个DN的关联数组,所以您可以过滤组对象并嵌套查询以再次为这些成员运行该查询。

+0

使用'member'会呈现以下错误; '无法从链接服务器“ADSI”的OLE DB提供程序“ADsDSOObject”获取行的数据。由于符号不匹配或溢出以外的原因,无法转换数据值。 ' –

相关问题