2012-11-12 50 views
1

我有一個組合框綁定到一個數據表,我用活動目錄中的用戶名填寫。此代碼需要大約一分鐘才能完成。有沒有更好的方法,我失蹤了?填寫WPF組合框與Active Directory用戶需要的時間太長

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 

回答

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") 
2

請不要包含sn和cn屬性,請嘗試下面的過濾器並刪除if。

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

這會查詢具有現有samAccount名稱的所有用戶。這應該消除if語句的需要並檢查SN或CN。你也可以考慮綁定到比Datatable更輕的東西。

除此之外,你的代碼看起來非常緊密。你可能只需要把它放在它自己的線程中。

+0

太棒了!這不是完全的答案,但它確實幫助我到達那裏。謝謝。 – donL