1

我正在嘗試獲取用戶的完整列表及其電子郵件地址。在嘗試了很多事情之後,下面終於給了我某種形式的喜悅,但是我得到這個錯誤此錯誤:DirectoryServices搜索超出範圍錯誤

A first chance exception of type 'System.ArgumentOutOfRangeException' occurred in mscorlib.dll 

有誰知道爲什麼發生這種情況以及如何防止這種情況? 完整的代碼如下。

Dim entry As DirectoryEntry = Nothing 
Dim search As DirectorySearcher = Nothing 
entry = New DirectoryEntry() 
search = New DirectorySearcher() 
search.Filter = "(&(objectCategory=person)(objectClass=user)(mail=*@companyname.com*))" 
search.Sort.PropertyName = "cn" 
Dim result As SearchResultCollection = search.FindAll() 
For Each res As SearchResult In result 
    Dim Name = res.Properties("cn")(0).ToString() 
    Dim Email = res.Properties("mail")(0).ToString() 
WindowsForm1.ListBox1.Items.Add(Name & " <" & Email & ">") 
Next 
entry.Dispose() 
search.Dispose() 
result.Dispose() 

回答

0

看起來這是假設res.Properties有鑰匙「CN」和「郵件」與是在他們的至少一個元素數組值。

res.Properties( 「CN」)(0)的ToString()

這是說「轉換所述第一元件從res.Properties的數組,其鍵名稱爲CN到的字符串中。 「這種聲音令人困惑,因爲它是。它假定你知道

  1. res.Properties有一個元素,它的鍵名是CN
  2. 該元素具有的值是一個類型的數組
  3. 進行陣列有一個元素在它在位置0
  4. 在所述位置處的元件可以被轉換爲一個字符串

嘗試嘗試之前檢查這些訪問它們。我沒有看過任何類型特定的功能,但下面應該工作。

Dim Name, Email as String 
If Not IsNothing(res.Properties("cn")) AndAlso res.Properties("cn").Count > 0 AndAlso Not IsNothing(res.Properties("mail")) AndAlso res.Properties("mail").Count > 0 Then 

    Name = res.Properties("cn")(0) 
    Email = res.Properties("mail")(0) 
End If 

這應該是更多的清理,但這個想法和根源是相同的 - 我們正在努力避免訪問數組的值,直到我們確信我們有一個有值被訪問數組首先。始終驗證您的數據。