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

Active Directory への SQL Server ADO クエリは非常に制限されており、本格的な AD インターフェイスのすべての機能を提供するわけではありません。

Active Directory MVPの Richard Mueller の Web サイトによると、検索から返される 1000 ~ 1500 個のオブジェクトというこの制限は、SQL Server AD 検索では回避または修正できません。

注意すべき制限が 2 つあります。まず、OPENQUERY ステートメントは多値属性をサポートしていません。memberOf などの多値属性の値を取得することはできません。次に、取得できるレコードの総数は 1500 (Windows 2000 Active Directory では 1000) に制限されています。SQL 分散クエリからのページングは​​サポートされていないため、maxPageSize の Active Directory サーバーの制限を変更しない限り、この制限を克服することはできません。

したがって、SQL Server から直接これを行うことはできないのではないかと思います。これを実現するには、別の方法を見つける必要があります。

于 2012-04-15T07:36:42.000 に答える