Active Directory のグループから 1500 を越えるメンバーの一覧を取得する方法
文書番号:20446
.NET アプリケーションから Active Directory へ接続して情報を取得する際、グループのメンバーの一覧を取得しようとすると1500件までしか取得することができません。
1500件を越えるグループメンバーが存在するグループからそのメンバーの一覧を取得する場合には1500件以内の件数ずつ何度かに分けて取得する必要があるようです。
[MSDN] 大きなグループ内のメンバの列挙
「https://msdn.microsoft.com/ja-jp/library/ms180907(v=vs.90).aspx
今回使用したいプロジェクトはvbだったのでMSDN に紹介されているコードをvbにしてみました。
【1500件を越えるグループのメンバーを取得する】
-
参照設定に「System.DirectoryServices」を追加しておきます。
参照した「System.DirectoryServices」をImports しておきます。
Imports System.DirectoryServices
グループのメンバーを1000件ずつ取得するサンプルです。
Dim entry As New DirectoryEntry("LDAP://192.168.0.1/dc=contoso,dc=com", "administrator", "パスワード")
Dim searcher As New DirectorySearcher(entry)
searcher.Filter = "(&(objectClass=group)(CN= グループアカウント))"
Dim rangeStep As Integer = 1000
Dim rangeLow As Integer = 0
Dim rangeHigh As Integer = rangeLow + (rangeStep - 1)
Dim lastQuery As Boolean = False
Dim quitLoop As Boolean = False
Do
Dim attributeWithRange As String
If lastQuery = False Then
attributeWithRange = String.Format("member;range={0}-{1}", rangeLow, rangeHigh)
Else
attributeWithRange = String.Format("member;range={0}-*", rangeLow)
quitLoop = True
End If
searcher.PropertiesToLoad.Clear()
searcher.PropertiesToLoad.Add(attributeWithRange)
Dim results As SearchResult = searcher.FindOne()
searcher.Dispose()
For Each res As String In results.Properties.PropertyNames
System.Diagnostics.Debug.WriteLine(res.ToString)
Next
If results.Properties.Contains(attributeWithRange) Then
For Each member As Object In results.Properties(attributeWithRange)
Select Case member.GetType.Name
Case "String"
'取得したメンバー情報を処理する
End Select
Next
Else
lastQuery = True
End If
If Not lastQuery Then
rangeLow = rangeHigh + 1
rangeHigh = rangeLow + (rangeStep - 1)
End If
Loop While Not quitLoop