2

以下のコードは完全に機能します*カーソルをいくつかのグループに限定しても私のドメイン全体に対して実行させると、広告には1000レコードの制限があります。このページングを取得する方法に関するアイデア?T-SQLクエリを使用してActive Directoryで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; 

答えて

6

SQL ServerのADOは、Active Directoryに照会することが非常に限られており、本格的なADインターフェイスのすべての機能を提供していません。

Active DirectoryのMVP Richard Mueller on his web siteによると、1000年から1500個のオブジェクトのこの制限は、検索から返さ SQL ServerのAD検索で回避または固定することができません。

あなたは注意する必要があります2つの制限があります。の。まず、OPENQUERY文は複数の値を持つ属性をサポートしていません。 memberOfのような複数値属性の値は取得できません。 2つ目は、取得できるレコードの総数が1500(Windows 2000 Active Directoryでは1000)に制限されていることです。 ページングは​​SQL分散クエリのに対応していないため、maxPageSizeのActive Directoryサーバーの制限を変更する以外はこの制限を克服することはできません。

SQL Serverからこれを直接行うことはできないのではないかと思います。これを達成するには別の方法が必要です。

+1

スピードを気にせず、ちょっとハッキリしても構わない場合は、オプションがあります。たとえば、「a」、「b」などで始まるすべてのユーザーを把握し、これらを一時表などに集約するグループごとに26の問合せを実行できます。パーティション化の他の方法がより適切かもしれませんが、これは説明するのが最も簡単でした。 –

関連する問題