1

ActiveDirectoryからのユーザー名を入力するデータテーブルにバインドされたコンボボックスがあります。このコードは完了するのに約1分かかります。私が行方不明になっているより良い方法はありますか?

Function users() As DataTable
    Dim dt As DataTable
    Dim dr As DataRow
    Dim idCoulumn As DataColumn
    Dim nameCoulumn As DataColumn

    Dim dirEntry As New System.DirectoryServices.DirectoryEntry("LDAP://CN=Users,DC=myDomain,DC=local")

    Dim oSearcher As DirectorySearcher = New DirectorySearcher(dirEntry)
    Dim oResults As SearchResultCollection

    oSearcher.PropertiesToLoad.Add("samAccountName")
    oSearcher.PropertiesToLoad.Add("givenname")
    oSearcher.PropertiesToLoad.Add("sn")
    oSearcher.PropertiesToLoad.Add("cn")
    oSearcher.Filter = "objectCategory=person"
    oResults = oSearcher.FindAll

    dt = New DataTable()
    idCoulumn = New DataColumn("ID", Type.GetType("System.String"))
    nameCoulumn = New DataColumn("Name", Type.GetType("System.String"))

    dt.Columns.Add(idCoulumn)
    dt.Columns.Add(nameCoulumn)

    For Each oResult In oResults
        With oResult.GetDirectoryEntry()
            If .Properties("cn").Value <> "" AndAlso .Properties("samAccountName").Value <> "" AndAlso .Properties("sn").Value <> "" Then
                dr = dt.NewRow()
                dr("ID") = .Properties("samAccountName").Value
                dr("Name") = String.Format("{0},{1} : {2}", .Properties("sn").Value, .Properties("givenname").Value, .Properties("samAccountName").Value)
                dt.Rows.Add(dr)
            End If
        End With
    Next

    dt.DefaultView.Sort = "Name"

    Return dt

End Function
4

2 に答える 2

2

snプロパティとcnプロパティを含めないでください。以下のフィルターを試して、ifを削除してください。

(&(objectCategory=user)(objectClass=user)(samAccountName=*))

これは、既存のsamAccount名を持つすべてのユーザーに対してクエリを実行します。これにより、ifステートメントが不要になり、SNまたはCNがチェックされます。また、Datatableよりも軽いものにバインドすることを検討することもできます。

それを超えると、コードはかなりタイトに見えます。これを独自のスレッドに入れる必要があるかもしれません。

于 2012-11-12T18:16:10.023 に答える
1

@Spevyは、提案された回答でこの解決策にたどり着くのを助けてくれました。

ディレクトリエントリを次のように変更しました。

Dim dirEntry As New System.DirectoryServices.DirectoryEntry("LDAP://myDomain")

検索フィルターを設定しました:

oSearcher.Filter = "(&(objectCategory=user)(objectClass=user))"

そして、私のifステートメントを次のように変更しました。

If .Properties("samAccountName").Value <> "" AndAlso .Properties("sn").Value <> "" Then

これらのコード行を追加すると実際に何が行われるのかわかりませんが、それらが存在するかどうかに関係なく同じ結果が得られるため、それらを削除しました。

oSearcher.PropertiesToLoad.Add("samAccountName")
oSearcher.PropertiesToLoad.Add("givenname")
oSearcher.PropertiesToLoad.Add("sn")
oSearcher.PropertiesToLoad.Add("cn")
于 2012-11-12T19:17:28.677 に答える