DirectoryServices搜索超出范围错误

时间:2016-08-23 07:53:09

标签: vb.net vb.net-2010 directoryservices outofrangeexception directorysearcher

我正在尝试获取完整的用户列表及其电子邮件地址。在尝试了很多事情之后,下面最终给了我一些喜悦但是我得到了这个错误这个错误:

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()

有人知道为什么会这样,以及如何防止这种情况发生? 完整的代码如下。

 test1.sec.com  192.168.1.8:8001<br>
 test2.sec.com  192.168.1.8:8002<br>
 test3.sec.com  192.168.1.8:8003<br>

 http://www.sec.com/test1/   192.168.1.8:8001<br>
 http://www.sec.com/test2/   192.168.1.8:8002<br>  
 http://www.sec.com/test3/   192.168.1.8:8003<br>

1 个答案:

答案 0 :(得分:0)

看起来这是假设res.Properties有键&#34; cn&#34;和&#34;邮件&#34;值为具有至少一个元素的数组。

<强> res.Properties(&#34; CN&#34)(0)的ToString()

这表示将数组中的第一个元素从名称为 cn 的res.Properties转换为字符串。&#39;那种听起来很混乱,因为它是。它假设你知道

  1. res.Properties有一个元素,其键名为 cn
  2. 该元素的值是数组的类型
  3. 该数组在位置0处有一个元素
  4. 该位置的元素可以转换为字符串
  5. 在尝试访问它们之前,请尝试检查这些内容。我没有考虑任何特定类型的功能,但下面应该可以使用。

    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
    

    这应该更加清理,但想法和根本原因是一样的 - 我们试图避免访问数组的值,直到我们确定我们有一个值有待访问的值的数组首先。始终验证您的数据。