3

我正在为 Outlook 2007 开发一个 Outlook 插件。简而言之:当用户打开电子邮件时,我需要获取电子邮件发件人的活动目录用户主体对象。

我想要达到的目标:

  1. 获取此电子邮件的发件人
  2. 获取此发件人背后对应的活动目录帐号
  3. 获取此广告帐户的特定属性(“physicalDeliveryOfficeName”)

我可以处理第 1 步和第 3 步,但我不知道如何获取交换用户帐户和活动目录帐户之间的链接

我试过的

string senderDisplayName = mailItem.SenderName;

由于重复,无法通过显示名称查找用户

string senderDistinguishedName = mailItem.SenderEmailAddress;

这将返回类似“O=Company/OU=Some_OU/CN=RECIPIENTS/CN=USERNAME”的内容,我可以提取此字符串的用户名,但此“用户名”是用户邮箱的用户名或类似名称。它并不总是与活动目录用户名匹配。

有没有办法让活动目录用户在发件人对象后面?

环境

  • 展望 2007 / C# .NET 4
  • 交换 2010
  • 活动目录
4

1 回答 1

2

下面描述的技术假定Exchange 邮箱别名与您的AD 帐户 ID匹配。

首先,您需要Recipient从 Exchange 地址创建一个,将 解析Recipient为一个ExchangeUser,然后集成PrincipalContext以通过帐户 ID 搜索 AD。找到后UserPrincipal,您可以查询DirectoryEntry自定义 AD 属性。

string deliveryOffice = string.Empty;
Outlook.Recipient recipient = mailItem.Application.Session.CreateRecipient(mailItem.SenderEmailAddress);
if (recipient != null && recipient.Resolve() && recipient.AddressEntry != null) 
{
    Outlook.ExchangeUser exUser = recipient.AddressEntry.GetExchangeUser();
    if (exUser != null && !string.IsNullOrEmpty(exUser.Alias))
    {
        using (PrincipalContext pc = new PrincipalContext(ContextType.Domain))
        {
            UserPrincipal up = UserPrincipal.FindByIdentity(pc, exUser.Alias); 
            if (up != null)
            {
                DirectoryEntry directoryEntry = up.GetUnderlyingObject() as DirectoryEntry;
                if (directoryEntry.Properties.Contains("physicalDeliveryOfficeName"))
                    deliveryOffice = directoryEntry.Properties["physicalDeliveryOfficeName"].Value.ToString();
            }
        }
    }
}

注意对于 AD 集成,您需要参考System.DirectoryServicesSystem.DirectoryServices.AccountManagement

于 2012-08-09T12:53:47.570 回答