查询Active Directory中主要电子邮件地址以外的电子邮件地址

时间:2009-07-24 21:51:22

标签: sql email active-directory

我正在尝试使用OPENQUERY从存储过程查询Active Directory,并将值添加到临时表中。我已经完成了所有工作,除非我在查询中添加'proxyAddresses'字段,否则会抛出此错误:

“OLE DB错误跟踪[OLE / DB提供程序'ADSDSOOBject'IRowset :: GetData返回0x80040e21:从提供程序返回的数据状态:[COLUMN_NAME = proxyAddresses STATUS = DBSTATUS_E_CANTCONVERTVALUE]]。 Msg 7346,Level 16,State 2,Line 2 无法从OLE DB提供程序“ADSDSOOBject”获取该行的数据。由于符号不匹配或溢出以外的原因,无法转换数据值。“

有没有人有从SQL查询'ProxyAddresses'属性的经验?我想我读到的地方是作为一个数组返回的。也许这就是问题?

谢谢!

2 个答案:

答案 0 :(得分:2)

我想这里的问题是proxyAddresses可以是多值的(即包含多个值),我怀疑SQL Server中的OPENQUERY无法处理它。不确定是否有任何东西可以让它发挥作用,真的。

article on CodeProject中发现这似乎证实了您和我的怀疑:

  

<强>限制

     

不幸的是,有一些Active   无法读取的目录值   与ADSI链接的服务器。那些   值称为“数组值”。   Active Directory中的数组值   是允许插入的字段   无限多个值。对于   例如,如果您存储多个电话   Active Directory中的数字   “电话”下的常规标签   数字/其他......“,你将无法做到   通过ADSI将这些内容读入您的SQL   服务器

你可以跳过它并在C#中查询这些地址吗?我可以告诉你一个样本。

马克

<强>更新
好的,这是用于将多值属性捕获到字符串列表中的方法的更新(假设您已经有一个代表该用户的DirectoryEntry):

public List<string> GetMultiValues(DirectoryEntry entry, string propertyName)
{
  if(entry == null)
  {
     return null;
  }

  List<string> results = new List<string>();

  if (entry.Properties.Contains(propertyName))
  {
     foreach (object propertValue in entry.Properties[propertyName])
     {
        results.Add(propertValue.ToString());
     }
  }

  return results;
}

您现在可以这样调用此函数:

List<string> proxyAddresses = GetMultiValues(userEntry, "proxyAddresses");

答案 1 :(得分:0)

您是否尝试在proxyAddresses声明中手动转换OPENQUERY字段?