2010-01-15 6 views
14

Qualcuno può dirmi il modo più semplice per ottenere un elenco di contatti da Exchange Server? Sto usando C#Come ottenere l'elenco dei contatti da Exchange Server?

Da quello che ho scoperto, Exchange Web Services esiste solo per Exchange Server 2007 e oltre. Questa sarebbe la mia prima opzione, ma mi piacerebbe anche un'alternativa per le versioni precedenti di Exchange (WebDav o qualcosa del genere). I servizi di directory non sono un'opzione.

+0

EWS Managed API (.Net 3.5 pre-req) un'opzione? –

+0

Alfred, ho indagato un po 'e, poiché ci sono diversi modi per connettersi a Exchange a seconda della versione, questo è ora in attesa. Ma la mia prima opzione sarebbe l'API gestita EWS, sì. Grazie! – Johnny

+0

Quello che ho fatto per le versioni precedenti di Exchange è semplicemente recuperare gli elenchi dalla directory active. Libreria commerciale –

risposta

11

Ecco come ottenere l'elenco contatti dall'elenco dei contatti in cambio tramite EWS. Non so ancora come ottenere contatti dalla lista globale, ho guardato l'API solo un'ora fa.

private static void ListContacts(ExchangeService svc) { 
    foreach (var v in svc.FindItems(WellKnownFolderName.Contacts, 
            new ItemView(20))) { 
     Contact contact = v as Contact; 
     ContactGroup contactGroup = v as ContactGroup; 

     //v.Load(); // Turns out you don't need to load for basic props. 
     if (contact != null) { 
      Console.WriteLine("Contact: {0} <{1}>", 
       contact.DisplayName, 
       contact.EmailAddresses[EmailAddressKey.EmailAddress1]); 
     } else if (contactGroup != null) { 
      Console.WriteLine("Contact Group: {0}", contactGroup.DisplayName); 
      switch (svc.RequestedServerVersion) { 
       case ExchangeVersion.Exchange2007_SP1: 
        ExpandGroupResults groupResults 
         = svc.ExpandGroup((contactGroup.Id)); 
        foreach (var member in groupResults) { 
         Console.WriteLine("+ {0} <{1}>", 
          member.Name, member.Address); 
        } 
        break; 
       case ExchangeVersion.Exchange2010: 
        foreach (GroupMember member in contactGroup.Members) { 
         Console.WriteLine("+ {0} <{1}>", 
         member.AddressInformation.Name, 
         member.AddressInformation.Address); 
        } 
        break; 
       default: 
        Console.WriteLine(
         "** Unknown Server Version: {0}", 
         svc.RequestedServerVersion); 
        break; 
      } 
     } else { 
      Console.WriteLine("Unknown contact type: {0} - {1}", 
       contact.GetType(), v.Subject); 
     } 
    } 
} 

ho ommited creazione del servizio per verbocity, hanno uno sguardo al Exchange Web Services API per ulteriori informazioni.

+0

Ho trovato che il GettingStarted.doc che viene installato con l'API gestita è in realtà piuttosto utile per impostare il riferimento del servizio –

1

Prima di tutto, non dimenticare di aggiungere un riferimento alla libreria dei servizi Web di Microsoft Exchange.

private static void ConnectToExchangeService() 
{ 
    service = new ExchangeService(); 
    service.Credentials = new WebCredentials(USERNAME, PASSWORD, DOMAIN_NAME); 
    service.AutodiscoverUrl(USER_ADDRESS); 
} 

private static void ListGlobalContacts(ExchangeService service) 
{ 
    /* passing true as the third parameter to "ResolveName" is important to 
     make sure you get the contact details as well as the mailbox details */ 
    NameResolutionCollection searchResult = service.ResolveName(NAME_YOURE_LOOKING_FOR, ResolveNameSearchLocation.DirectoryOnly, true); 
    foreach (NameResolution resolution in searchResult) 
    { 
     Console.WriteLine("name is " + resolution.Contact.DisplayName); 
     Console.WriteLine("address is " + resolution.Mailbox.Address); 
     Console.WriteLine("business phone is " + resolution.Contact.PhoneNumbers[PhoneNumberKey.BusinessPhone]); 
     Console.WriteLine("mobile phone is " + resolution.Contact.PhoneNumbers[PhoneNumberKey.MobilePhone]); 
    } 
} 

... e Brett Ryan ha già fornito il codice per ottenere l'elenco dei contatti locali.

Il problema con questo metodo di recupero dell'elenco di contatti globale (beh, almeno uno di essi) è che la funzione "ResolveName" restituisce fino a 100 contatti in modo che se la tua organizzazione ha più record di quello, sei nei guai. Una soluzione possibile (e quella che ho implementato) consiste nel condurre una ricerca separata per ogni lettera (supponendo che sia possibile verificare che tale ricerca restituisca sempre meno di 100 risultati) e stringa tutte le voci univoche in un'unica lista.