2016-02-19 5 views
0

J'essaie d'écrire une application de console C# qui peut mettre à jour par programme une liste de distribution Outlook dans la liste d'adresses globale. J'ai la permission de mettre à jour cette DL. Je peux le faire de manière interactive sur mon PC en utilisant Outlook, et je peux le faire en code Perl en utilisant Win32::NetAdmin::GroupAddUsers.Ajouter des membres à la liste de distribution de liste d'attente Outlook en utilisant C# dans une application de console

Après avoir ajouté une référence à la bibliothèque COM "Microsoft Outlook 14.0 Object Library", puis accessible via:

using Outlook = Microsoft.Office.Interop.Outlook; 

Je peux lire avec succès à partir d'un DL, même récursion par DL de l'intérieur de la "principale" DL étant cherché. Voici ce que le code de travail (critiques non nécessaires pour cette pièce):

private static List<Outlook.AddressEntry> GetMembers(string dl, bool recursive) 
{ 
    try 
    { 
     List<Outlook.AddressEntry> memberList = new List<Outlook.AddressEntry>(); 

     Outlook.Application oApp = new Outlook.Application(); 
     Outlook.AddressEntry dlEntry = oApp.GetNamespace("MAPI").AddressLists["Global Address List"].AddressEntries[dl]; 
     if (dlEntry.Name == dl) 
     { 
      Outlook.AddressEntries members = dlEntry.Members; 
      foreach (Outlook.AddressEntry member in members) 
      { 
       if (recursive && (member.AddressEntryUserType == Outlook.OlAddressEntryUserType.olExchangeDistributionListAddressEntry)) 
       { 
        List<Outlook.AddressEntry> sublist = GetMembers(member.Name, true); 
        foreach (Outlook.AddressEntry submember in sublist) 
        { 
         memberList.Add(submember); 
        } 
       } 
       else { 
        memberList.Add(member); 
       } 
      } 
     } 
     else 
     { 
      Console.WriteLine("Could not find an exact match for '" + dl + "'."); 
      Console.WriteLine("Closest match was '" + dlEntry.Name +"'."); 
     } 

     return memberList; 
    } 
    catch 
    { 
     // This mostly fails if running on a PC without Outlook. 
     // Return a null, and require the calling code to handle it properl 
     // (or that code will get a null-reference excception). 
     return null; 
    } 
} 

Je peux utiliser la sortie de ce pour examiner les membres de près, donc je pense que je comprends les objets DL/membre un peu.

Mais, le code suivant ne sera pas ajouter un membre à un DL:

private static void AddMembers(string dl) 
{ 
    Outlook.Application oApp = new Outlook.Application(); 
    Outlook.AddressEntry ae = oApp.GetNamespace("MAPI").AddressLists["Global Address List"].AddressEntries[dl]; 
    try { 
     ae.Members.Add("EX", "Tuttle, James", "/o=EMC/ou=North America/cn=Recipients/cn=tuttlj"); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
    ae.Update(); 
} 

Les arguments à Members.Add() sont définis here et les valeurs indiquées dans mon code viennent exactement d'examiner mon propre objet membre d'un autre DL.

L'exception affichée est simplement "Le signet n'est pas valide". Un similar question a déjà été demandé, mais la solution était d'utiliser P/Invoke ou LDAP. Je n'ai vraiment aucune idée de comment utiliser P/Invoke (strictement un programmeur C# et Perl, pas un programmeur Windows/C/C++), et je n'ai pas accès au serveur LDAP, donc je veux vraiment que ça marche les objets Microsoft.Office.Interop.Outlook.

Toute aide est grandement appréciée!

Répondre