目录服务搜索超出范围错误

DirectoryServices Search Out of Range Error

我正在尝试获取完整的用户列表及其电子邮件地址。在尝试了很多事情之后,下面终于给了我某种形式的快乐但是我得到了这个错误这个错误:

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

看起来这是假设 res.Properties 具有键 "cn" 和 "mail",其值是至少包含一个元素的数组。

res.Properties("cn")(0).ToString()

这表示 'convert the first element in the array from res.Properties whose key name is cn to a string.' 这听起来令人困惑,因为它确实如此。它假定您 知道 :

  1. res.Properties 有一个键名为 cn
  2. 的元素
  3. 该元素有一个数组类型的值
  4. 该数组在位置 0 处有一个元素
  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

这应该更清楚,但想法和根本原因是相同的 - 我们试图避免访问数组的值,直到我们确定我们有一个数组,该数组具有要在第一名。始终验证您的数据。