2017-05-31 17 views
0

目的:事前定義されたプロパティに制限された基本フィルタを使用してGlobalCatalogをスキャンし、結果をテキストファイルに書き出す単純なVB.NETアプリケーションを作成します。System.DirectoryServices(VB.NET)経由でGlobalCatalogをスキャンすると、時折エラーが発生する

方法:以下の既存のコード - この「作品」時折例外をスロー:「System.DirectoryServices.SearchResultCollection.ResultsEnumerator.MoveNext():より多くのデータが利用可能である」

いくつかのブラウジングが考えるように私をリード結果が改ページされているにもかかわらず、DirectorySearcherを使用して大量のレコード(私の場合は約400k)を取得しようとすることによって問題が発生していること、およびソリューションが既存のSystem.DirectoryServicesメソッドをSystem.DirectoryServices.Protocolsを利用するものthis articleにつながるthis SO threadを参照してください。

しかし、上記のリンクと広範な検索の両方の回答は、C#でコードスニペットを提供するだけで、特定のdistinguishedNameまたはloginに基づいてプロパティを取得する)

VB.NETを使用して、できるだけ迅速かつ効率的に1トンのレコードを取得する必要があります。私は、ドメインやパスワードを提供することなく、GlobalCatalogを簡単に処理できるので、DirectoryServicesメソッドが好きです。検索者に直接ジャンプしてフィルタとプロパティを指定することができます。一般的には動作しますが、毎回動作する必要があります。

このコードを変更して、時折の例外を回避し、可能な限りすべてのデータを取り戻す方法については、誰にでもアドバイスできますか?

Imports System.DirectoryServices 

Public Sub ScanGlobalCatalog() 

    Dim searcher As DirectorySearcher = ActiveDirectory.Forest.GetCurrentForest.FindGlobalCatalog.GetDirectorySearcher 

    Try 
     With searcher 
      .Filter = "(&(|(objectClass=user)(objectClass=group))(proxyAddresses=*))" 
      .PageSize = 1000 
      .SearchScope = SearchScope.Subtree 
      .CacheResults = False 
      .PropertiesToLoad.Add("sAMAccountName") 
      .PropertiesToLoad.Add("distinguishedName") 
      .PropertiesToLoad.Add("displayName") 
      .PropertiesToLoad.Add("proxyAddresses") 
     End With 

     For Each result As SearchResult In searcher.FindAll() 
      Dim properties As ResultPropertyCollection = result.Properties 
      Dim sAMAccountName As ResultPropertyValueCollection = properties("sAMAccountName") 
      Dim distinguishedName As ResultPropertyValueCollection = properties("distinguishedName") 
      Dim displayName As ResultPropertyValueCollection = properties("displayName") 
      Dim proxyAddresses As ResultPropertyValueCollection = properties("proxyAddresses") 

      ' Check/process/write each property to the output file... 
     Next 
    Catch ex As Exception 
     ' Do something... 
    End Try 
End Sub 
+0

'searcher'が' resultsize'プロパティを持っていれば、頭文字をつけて、 "無制限"の実際の等価物であるmaxintを送信してみてください。 – Vesper

答えて

0

ありがとう!示されており、これ以上起こっていないようとして追加

(私は信じて0に.SizeLimitを設定すると「無限」が、私よりも大きな知識を持つものから補正するために、再度、オープンに相当...)

With searcher 
    .Filter = "(&(|(objectClass=user)(objectClass=group))(proxyAddresses=*))" 
    .PageSize = 1000 
    .SizeLimit = 0 
    .SearchScope = SearchScope.Subtree 
    .CacheResults = False 
    .PropertiesToLoad.Add("sAMAccountName") 
    .PropertiesToLoad.Add("distinguishedName") 
    .PropertiesToLoad.Add("displayName") 
    .PropertiesToLoad.Add("proxyAddresses") 
End With 

過去20時間ほどで15分間隔でスクリプトを実行していましたが、イベントログで5または6が「失敗」することがありますが、以前はこれで致命的な終了が発生していましたサービスは単に中止されます)。今度は単に例外を報告し、次の反復で再度試行します。

フェイルがまとまって(同じ時間/時間半以内に連続して '実行されます')、同じサービスが中断されずにエラーなしで約15時間実行され、それらが失敗した可能性がありますサーバー上で何らかのメンテナンスが行われたり、例外をスローしていた何らかの種類のレコードの更新が中断されたりしていました。再び、この行動に関する洞察または意見を歓迎する。

しかし、スクリプトが一般的に正常に実行され、発生した場合に永久に落ちない限り、このような「例外的」例外で暮らすことができます。

Vesperのアドバイスをお寄せいただきありがとうございます。

関連する問題