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 

这应该是更多的清理,但这个想法和根源是相同的 - 我们正在努力避免访问数组的值,直到我们确信我们有一个有值被访问数组首先。始终验证您的数据。