目的:事前定義されたプロパティに制限された基本フィルタを使用して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
'searcher'が' resultsize'プロパティを持っていれば、頭文字をつけて、 "無制限"の実際の等価物であるmaxintを送信してみてください。 – Vesper