2012-08-09 1 views
3

Je suis en train de développer un Outlook AddIn pour Outlook 2007. En résumé: Je dois obtenir l'objet principal Active Directory de l'expéditeur d'e-mails lorsqu'un utilisateur ouvre un e -courrier.Récupère le principal utilisateur de l'expéditeur Active Directory à partir de Outlook.MailItem

Ce que je suis en train de réaliser:

  1. Obtenez l'expéditeur de cet e-mail
  2. Obtenez le compte de répertoire actif correspondant derrière cet expéditeur
  3. Obtenez un attribut spécifique de cette ad- account ("physicalDeliveryOfficeName")

Je peux gérer les étapes 1 et 3, mais je ne sais pas comment obtenir le lien entre l'utilisateur d'échange- compte et le compte de répertoire actif

Ce que j'ai essayé

string senderDisplayName = mailItem.SenderName; 

Trouver un utilisateur par displayname est impossible en raison de doublons

string senderDistinguishedName = mailItem.SenderEmailAddress; 

Cela renverra quelque chose comme « O = société/OU = Some_OU/CN = RECIPIENTS/CN = USERNAME " Je peux extraire le nom d'utilisateur de cette chaîne, mais ce" nom d'utilisateur "est le nom d'utilisateur de la boîte aux lettres de l'utilisateur ou quelque chose comme ça. Il ne correspond pas toujours au nom d'utilisateur du répertoire actif.

Existe-t-il un moyen d'obtenir l'utilisateur de l'annuaire actif derrière l'objet-expéditeur?

Environnement

  • Outlook 2007/C# .NET 4
  • Exchange 2010
  • Active Directory

Répondre

2

La technique décrite ci-dessous suppose la boîte aux lettres Exchange Alias ​​ correspond à votre ID de compte AD.

D'abord, vous devez créer un Recipient à l'adresse Exchange, résoudre le Recipient à un ExchangeUser, puis intégrer PrincipalContext pour la recherche AD par ID de compte. Une fois que le UserPrincipal est localisé, vous pouvez interroger le DirectoryEntry pour les propriétés AD personnalisées.

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

Remarque: Pour l'intégration AD, vous avez besoin des références à System.DirectoryServices et System.DirectoryServices.AccountManagement.

Questions connexes