4

如果我将光标限制在几个组中,下面的代码可以完美运行*,但如果我让它针对我们的整个域运行,我会在 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;  
4

1 回答 1

8

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

根据 Active Directory MVP Richard Mueller 在他的网站上的说法,从搜索返回的 1000-1500 个对象的限制不能在 SQL Server AD 搜索中规避或修复:

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

因此,恐怕您无法直接从 SQL Server 执行此操作 - 您必须找到另一种方法来实现此目的。

于 2012-04-15T07:36:42.000 回答