HOME >> Tips >> Microsoft.NET >> コードサンプル

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
    
【参考情報】

[MSDN] 大きなグループ内のメンバの列挙
https://msdn.microsoft.com/ja-jp/library/ms180907(v=vs.90).aspx