1

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

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

1 回答 1

0

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

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

这表示“将数组中的第一个元素从键名为cn的 res.Properties 转换为字符串。” 那种听起来令人困惑,因为它是。它假设你知道

  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

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

于 2016-08-23T08:32:42.617 回答