如何使用T-SQL查询获取Active Directory中的1000条记录限制?

时间:2012-04-15 06:31:42

标签: sql sql-server tsql active-directory active-directory-group

下面的代码完美*如果我将光标限制为几个组,但如果我让它在我的整个域上运行,我会在AD中遇到1000个记录限制。关于如何进行这种分页的任何想法?

*完美,因为它应该只返回数量低于1000记录限制的有限数量的记录。

CREATE TABLE #MemberOfGroups
(
    groupName   VARCHAR (400),
    cn          VARCHAR (400),
    displayName VARCHAR (400)
);

SET NOCOUNT ON;

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

DECLARE gC CURSOR
    FOR SELECT cn,
               distinguishedName
        FROM   OPENQUERY (ADSI, 'SELECT cn, distinguishedName
     FROM ''LDAP://DC=coal,DC=local''
     WHERE objectCategory = ''group''');

OPEN gC;

FETCH NEXT FROM gC INTO @t, @t2;

WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @ot = '''SELECT cn, displayName
     FROM ''''LDAP://DC=coal,DC=local''''
     WHERE objectCategory = ''''Person'''' AND objectClass = ''''user''''
     AND memberOf=''''' + @t2 + '''''';
        SET @tt = 'select ' + '''' + @t + '''' + ' As GroupName, cn, displayName from openquery(ADSI,' + @ot + ''') order by cn';
        INSERT INTO #MemberOfGroups (groupName, cn, displayName)
        EXECUTE (@tt);
        --print @tt
        FETCH NEXT FROM gC INTO @t, @t2;
    END

CLOSE gC;

DEALLOCATE gC;  

1 个答案:

答案 0 :(得分:6)

查询到Active Directory的SQL Server ADO 非常有限,并且不提供完整的AD接口的所有功能。

根据Active Directory MVP Richard Mueller on his web site,在SQL Server AD搜索中,从返回的1000-1500个对象的限制不能被规避或修复:

  

您应该注意两个限制。首先,OPENQUERY语句不支持多值属性。您无法检索多值属性的值,例如memberOf。 其次,可以检索的记录总数限制为1500 (Windows 2000 Active Directory中为1000)。来自SQL分布式查询的不支持,因此无法克服此限制,除非通过修改maxPageSize的Active Directory服务器限制。

所以我担心您无法直接从SQL Server执行此操作 - 您必须找到另一种方法来实现此目的。