2011-12-21 80 views
3

私は次のエラーが表示されますエラー:私はユーザーのためのADを照会しようとするとリンクサーバーのOLE DBプロバイダ「ADsDSOObject」から行をフェッチできません「ADSI」

は、OLE DBプロバイダ「ADsDSOObjectから行をフェッチできません"リンクサーバー" ADSI "の場合

I起因千行の制限(またはのSQLServer 2008年に901行)に問題を取ります。私はクエリをページすることができますが、私は一度に1000以上を取得できる回避策を探しています。

私が役に立ちそうな場合は、SqlServer 2008 R2を使用しています。 ここに私のクエリです

SELECT samaccountname AS Account, ISNULL(givenName, '''') AS givenName, ISNULL(SN, '''') AS SN, ISNULL(DisplayName, '''') as DisplayName, ISNULL(Title, '''') AS Title 
         FROM OpenQuery(ADSI, 
         'SELECT SamAccountName, givenName, SN, DisplayName, Title 
         FROM ''LDAP://corpdomain.corp'' 
         WHERE objectClass = ''User'' and (SN = ''*'' or givenName = ''*'')') 

アイデアはありますか?

EDIT - さらに検査時には、私はどちらか適切ページこのクエリをすることはできませんよ実現しました。誰かが、私が901以上の結果を返すことを可能にする結果または回避策をページすることを可能にする解決策に関するヒントを持っていますか? SQLエージェントジョブによって解雇SSISパッケージが行くのに理想的な方法だろうように聞こえる私のコメントへの返信から

+0

このデータの最終目標は何ですか。最良の解決策は、このようにしないことです。たとえば、ある種類のシステムではこのタイプの問合せの問題を解決しました。あるケースではSSISパッケージに置き換え、もう1つのケースではSSRSでADに直接移動するレポート・データ・ソースを使用します。 – JamieSee

+0

ジェームズありがとう、私は最終目標を再評価し、より良い方法を見つけました。アプリケーションの目的でADユーザに属性を追加したかったので、バッチジョブを使用してADユーザを抽出してDBに格納するだけです。 – SDeezy

+0

[Retrieve> 901行のSQL Server 2008リンクサーバーからActive Directoryへの複製](http://stackoverflow.com/questions/5661371/retrieve-901-rows-from-sql-server-2008-linked-server-アクティブディレクトリからアクティブディレクトリへ) –

答えて

2

問題

When I attempt to query AD for users I receive the following error:

Cannot fetch a row from OLE DB provider "ADsDSOObject" for linked server "ADSI".

I assume the issue due to the 1000 row limit (or 901 rows in SqlServer 2008). I can page the query >but I am looking for workaround that would allow me to retrieve more than 1000 at a time.

In case it helps, I am using SqlServer 2008 R2. and here is my query >

SELECT samaccountname AS Account, ISNULL(givenName, '''') AS givenName, ISNULL(SN, '''') AS SN, ISNULL(DisplayName, '''') as DisplayName, ISNULL(Title, '''') AS Title 
        FROM OpenQuery(ADSI, 
        'SELECT SamAccountName, givenName, SN, DisplayName, Title 
        FROM ''LDAP://corpdomain.corp'' 
        WHERE objectClass = ''User'' and (SN = ''*'' or givenName = ''*'' 

Any ideas?

EDIT - Upon further inspection I realized I am not able to properly page this query either. Does >anyone have any tips on a solution that will allow me to page the results or a workaround that will >allow me to return more than 901?

私は(と私はに成功したことができる午前最適ページングを適用することで、私が直面している同じ問題を解決し

私の回避策ADから約50,000回のログインを取得し、ADドメインから単一のログインアカウントを取得するために欠落しているわけではありません。

属性の文字をループすることで、ADSIクエリの制限を回避する必要があります。以下の解決策を参照してください:http://www.sqlservercentral.com/Forums/Topic231658-54-1.aspx#bm1249991

エラーは、SELECT TOP 901 ...のところにあるSELECTと書いて解決しました。

はい、この問題はSqlServer 2008 R2の使用に関連しています。この問題は、2005年から2008年にデータベースを移行した後に発生しました。SQL Server 2008では、SQL Server 2005で1000行に制限された901行があります(違いはTOP 901を選択する必要がありますSQL Server 2005で必要です。そうでなければ、エラーが発生してプログラムが失敗します)

+0

2012に同じ問題がありますか? – th1rdey3

3

。ここでは、SSISでのActive Directoryにアクセスすることができます方法は次のとおりです。

  1. 新しいSSISプロジェクト
  2. を作成して制御フローにデータフロータスクを追加します。
  3. [データフロー]タブをクリックします。
  4. ADO NETソースをツールボックスからデータフローにドラッグします。
  5. ADO NETソースをダブルクリックします。
  6. [OLE DB接続マネージャ]の横にある[新規]ボタンをクリックします。
  7. [ADO.NET接続マネージャの構成] ダイアログの[新規]ボタンをクリックします。
  8. [プロバイダー]ドロップダウンで下向きの矢印をクリックします。
  9. リスト内のOleDbの.Net Providersを探してダブルクリックします。
  10. リストの にあるMicrosoftディレクトリサービスのOLE DBプロバイダを見つけてダブルクリックします。
  11. [OK]ボタンをクリックします。
  12. サーバまたはファイル名にActiveDirectoryを入れます。
  13. データ接続でActiveDirectoryを強調表示します。
  14. [OK]ボタンをクリックします。
  15. データアクセスモードをSQLコマンドに変更します。
  16. SQLコマンドテキストボックスに、 <LDAP://DC=domain,DC=tld>;(&(objectClass=User)(objectCategory=Person));distinguishedName,displayName,sn,givenName,middleName,mail,telephoneNumber;subtreeと入力します。
  17. ドメインとtldを ドメインの適切な識別子に変更し、その他の適切なLDAPパス要素を追加します。
  18. 他の適切なActiveDirectory属性をクエリに追加します。
  19. [OK]ボタンをクリックします。
  20. データ型 "System.Object"がサポートされていないことを示すエラーメッセージが表示されます。これらは無視することができます。
  21. 警告ダイアログで[OK]ボタンをクリックします。
  22. ADO NETソースを右クリックします。
  23. [プロパティ]をクリックします。
  24. ValidateExternalMetadataをFalseに変更します。

また、これを実行し、Active Directory属性が4000文字より長い場合、データフローで切り捨てられることに注意してください。

  1. ADO NETソースを右クリックします。
  2. [詳細エディタを表示]をクリックします。
  3. [入力と出力のプロパティ]タブに移動します。
  4. ADO NETソース出力を展開します。
  5. 出力列を展開します。
  6. 各列について、データ型をUnicode文字列[DT_WSTR]に変更し、長さを4000に設定します。
  7. [OK]ボタンをクリックします。
  8. ADO NETソースをダブルクリックし、エラー出力に移動します。
  9. Trunctationで行のすべての値を選択します。
  10. リストアイテム
  11. [この値を選択したセルに設定する]で、[無視する]を選択します。
  12. [適用]ボタンをクリックします。
  13. [OK]ボタンをクリックします。このクエリ形式もサポートされていることを

注:

SELECT  distinguishedName, displayName, sn, givenName, middleName, mail, telephoneNumber 
FROM   'LDAP://DC=domain,DC=tld' 
WHERE  objectClass = 'User' AND objectCategory = 'Person' 

は、プロバイダによってサポートされるクエリ形式の詳細については、MSDNの記事 Microsoft OLE DB Provider for Microsoft Active Directory Serviceを参照してください。

+0

徹底的な説明をありがとう。 SQL Serverにすべての広告ユーザーを抽出する、毎日のコンソールジョブを実行していることがわかりました。問題を解決しました。私はこれを試していないが、うまくいくように思える...それは私には良い答えのように見える。ありがとう! – SDeezy

0

Magnus Reuterの別の投稿を使用して解決しました。私は単純なansな独創的なので、

彼はUNIONを使用して2つのクエリを結合しましたが、最初のものはすべてsAMAccountname mを選択しました。もちろん、ミドルが文字 "m"ではないと分かった場合はそれに応じて調整することができますが、一般に約1000-2000のレコードがあれば "m"になります。

Retrieve >901 rows from SQL Server 2008 linked server to Active Directory

0

私もこの問題をヒットし、アカウント名の最初の文字によってページングの投稿いつものソリューションを好きではなかったです。これは、ADへの26回の別々の呼び出しを意味し、大きなドメインでは同じ最初の文字から始まるアカウントが901を超える可能性が非常に高いため、特に失敗する可能性があります。同じ最初の手紙を使用している命名規則...

私はあなたがuSNCreatedによってopenqueryを注文し、外側のクエリにTOP 901節を置くと、それが爆発しないことを発見しました。

ここでは、すべてのアクティブなディレクトリオブジェクト(コンピュータ、ドメインコントローラ、ユーザー、連絡先)を901レコードの塊でテンポラリテーブルにフェッチし、各オブジェクトに役立つ情報を提供します。

CREATE TABLE #ADData(
    Login   NVARCHAR(256) 
    ,CommonName  NVARCHAR(256) 
    ,GivenName  NVARCHAR(256) 
    ,FamilyName  NVARCHAR(256) 
    ,DisplayName NVARCHAR(256) 
    ,Title   NVARCHAR(256) 
    ,Department  NVARCHAR(256) 
    ,Location  NVARCHAR(256) 
    ,Info   NVARCHAR(256) 
    ,LastLogin  BIGINT 
    ,flags   INT 
    ,Email   NVARCHAR(256) 
    ,Phone   NVARCHAR(256) 
    ,Mobile   NVARCHAR(256) 
    ,Quickdial  NVARCHAR(256) 
    , usnCreated INT 
) 

DECLARE @Query  VARCHAR (2000) 
DECLARE @Filter  VARCHAR(200) 
DECLARE @Rowcount INT 

select @Filter ='' 

WHILE ISNULL(@rowcount,901) = 901 BEGIN 

    SELECT @Query = ' 
    SELECT top 901 
      Login   = SamAccountName 
      , CommonName = cn 
      , GivenName 
      , FamilyName = sn  
      , DisplayName 
      , Title 
      , Department 
      , Location  = physicalDeliveryOfficeName 
      , Info 
      , LastLogin  = CAST(LastLogon AS bigint) 
      , flags   = CAST (UserAccountControl as int) 
      , Email   = mail 
      , Phone   = telephoneNumber 
      , Mobile  = mobile 
      , QuickDial  = Pager 
      , usnCreated 
     FROM OPENROWSET(''ADSDSOObject'', '''', '' 
       SELECT cn, givenName, sn, userAccountControl, lastLogon, displayName, samaccountname, 
       title, department, physicalDeliveryOfficeName, info, mail, telephoneNumber, mobile, pager, usncreated 
      FROM ''''LDAP://[ldap-query-string]'''' 
      WHERE objectClass=''''Person'''' 
      AND objectClass = ''''User'''' 
      ' + @filter + ' 
      ORDER BY usnCreated'')'    
    INSERT INTO #ADData EXEC (@Query) 
    SELECT @Rowcount = @@ROWCOUNT 
    SELECT @Filter = 'and usnCreated > '+ LTRIM(STR((SELECT MAX(usnCreated) FROM #ADData))) 

END 

SELECT LOGIN    
     , CommonName  
     , GivenName 
     , FamilyName 
     , DisplayName 
     , Title   
     , Department 
     , Location  
     , Email   
     , Phone   
     , QuickDial  
     , Mobile   
     , Info   
     , Disabled  = CASE WHEN CAST (flags AS INT) & 2 > 0 THEN 'Y' ELSE NULL END 
     , Locked  = CASE WHEN CAST (flags AS INT) & 16 > 0 THEN 'Y' ELSE NULL END 
     , NoPwdExpiry = CASE WHEN CAST (flags AS INT) & 65536 > 0 THEN 'Y' ELSE NULL END 
     , LastLogin  = CASE WHEN ISNULL(CAST (LastLogin AS BIGINT),0) = 0 THEN NULL ELSE 
          DATEADD(ms, (CAST (LastLogin AS BIGINT)/CAST(10000 AS BIGINT)) % 86400000, 
          DATEADD(day, CAST (LastLogin AS BIGINT)/CAST(864000000000 AS BIGINT) - 109207, 0)) END 
     , Type = CASE WHEN flags & 512 = 512 THEN 'user' 
        WHEN flags IS NULL THEN 'contact' 
        WHEN flags & 4096 = 4096 THEN 'computer' 
        WHEN flags & 532480 = 532480 THEN 'computer (DC)' END 
FROM #ADData 
ORDER BY Login 

DROP TABLE #ADData 
関連する問題