2010-02-09 8 views
5

Sto utilizzando EWS e desidero ottenere l'elenco indirizzi globale dallo scambio per l'azienda. So come recuperare la lista dei contatti personali.Come posso recuperare i contatti globali con Exchange Web Services (EWS)?

Tutti gli esempi nella documentazione dell'API riguardano l'aggiornamento delle informazioni dell'utente ma non specificamente come recuperarle.

Ho anche provato quanto segue per elencare le cartelle ma non ha i risultati corretti.

private static void ListFolder(ExchangeService svc, FolderId parent, int depth) { 
    string s; 
    foreach (var v in svc.FindFolders(parent, new FolderView(int.MaxValue))) { 
     Folder f = v as Folder; 
     if (f != null) { 
      s = String.Format("[{0}]", f.DisplayName); 
      Console.WriteLine(s.PadLeft(s.Length + (depth * 2))); 
      ListFolder(svc, f.Id, depth + 1); 

      try { 
       foreach (Item i in f.FindItems(new ItemView(20))) { 
        Console.WriteLine(
         i.Subject.PadLeft(i.Subject.Length + ((depth + 1) * 2))); 
       } 
      } catch (Exception) { 
      } 
     } 
    } 
} 

Mentre la questione è già stata sollevata offerte (How to get contact list from Exchange Server?) questa domanda particolare con l'utilizzo di EWS per ottenere l'elenco indirizzi globale, mentre questa domanda chiede consigli a livello generale.

risposta

2

si può ottenuto ItemType oggetti in uno specifiedfolder con il frammento di codice qui sotto e poi gettati ItemType oggetti per ContactItemType (per gli oggetti a contatto) ....

/// <summary> 
    /// gets list of ItemType objects with maxreturncriteria specicification 
    /// </summary> 
    /// <param name="esb">ExchangeServiceBinding object</param> 
    /// <param name="folder">FolderIdType to get items inside</param> 
    /// <param name="maxEntriesReturned">the max count of items to return</param> 
    public static List<ItemType> FindItems(ExchangeServiceBinding esb, FolderIdType folder, int maxEntriesReturned) 
    { 
     List<ItemType> returnItems = new List<ItemType>(); 
     // Form the FindItem request 
     FindItemType request = new FindItemType(); 
     request.Traversal = ItemQueryTraversalType.Shallow; 
     request.ItemShape = new ItemResponseShapeType(); 
     request.ItemShape.BaseShape = DefaultShapeNamesType.AllProperties; 
     request.ParentFolderIds = new FolderIdType[] { folder }; 
     IndexedPageViewType indexedPageView = new IndexedPageViewType(); 
     indexedPageView.BasePoint = IndexBasePointType.Beginning; 
     indexedPageView.Offset = 0; 
     indexedPageView.MaxEntriesReturned = 100; 
     indexedPageView.MaxEntriesReturnedSpecified = true; 
     request.Item = indexedPageView; 
     FindItemResponseType response = esb.FindItem(request); 
     foreach (FindItemResponseMessageType firmtMessage in response.ResponseMessages.Items) 
     { 
      if (firmtMessage.ResponseClass == ResponseClassType.Success) 
      { 
       if (firmtMessage.RootFolder.TotalItemsInView > 0) 
        foreach (ItemType item in ((ArrayOfRealItemsType)firmtMessage.RootFolder.Item).Items) 
         returnItems.Add(item); 
         //Console.WriteLine(item.GetType().Name + ": " + item.Subject + ", " + item.DateTimeReceived.Date.ToString("dd/MM/yyyy")); 
      } 
      else 
      { 
      //handle error log here 
      } 
     } 
     return returnItems; 
    } 
+0

+1 perché si sta effettivamente rispondere alla sua domanda. Anche se volevo solo ripetere che questo catturerà solo gli utenti che hanno cassette postali in Exchange, che è un sottoinsieme di utenti in AD. –

+0

Non vedo come questo risponda alla domanda? Brett afferma di sapere come estrarre queste informazioni per una cartella specifica (Contatti) ma non come farlo per l'Elenco indirizzi globale. – Miles

0

Ho appena fatto una cosa simile. Tuttavia, non sono riuscito a ottenere l'elenco dei contatti tramite Exchange poiché solo gli utenti che dispongono di cassette postali e non necessariamente tutti gli utenti o i gruppi. Alla fine ho finito per ottenere tutti gli utenti tramite AD

qui è il codice per ottenere tutti i contatti in AD. Tutto ciò di cui hai bisogno è il folderID dell'elenco indirizzi globale che può essere ottenuto utilizzando lo strumento ADSI.msc sul tuo server AD e sfogliando la cartella Elenco indirizzi globale, guarda le proprietà e acquisisci il valore della "ricerca presunta". Nel mio sistema la SearchPath per l'elenco indirizzi globale è "(& (objectClass = user) (objectCategory = persona) (mailNickname = ) (msExchHomeServerName =))"

public List<ListItem> SearchAD(string keyword, XmlDocument valueXml) 
    {   
     List<ListItem> ewsItems = new List<ListItem>(); 

     using (DirectoryEntry ad = Utils.GetNewDirectoryEntry("LDAP://yourdomain.com")) 
     { 
      Trace.Info("searcherをつくる"); 
      using (DirectorySearcher searcher = new DirectorySearcher(ad)) 
      { 
       if (this.EnableSizeLimit) 
       {   
        searcher.SizeLimit = GetMaxResultCount(); 

        if (Utils.maxResultsCount > 1000) 
        { 
         searcher.PageSize = 100; 
        } 
       } 
       else 
       { 
        searcher.SizeLimit = 1000; 
        searcher.PageSize = 10; 
       } 

       string sisya = Utils.DecodeXml(valueXml.SelectSingleNode("Folder/SearchPath").InnerText); //this is the folder to grab your contacts from. In your case Global Address list 

       //Container 
       if(String.IsNullOrEmpty(sisya)) 
       { 
        return null; 
       } 

       keyword = Utils.EncodeLdap(keyword); 

       string text = Utils.DecodeXml(valueXml.SelectSingleNode("Folder/Text").InnerText); 

       searcher.Filter = this.CreateFilter(keyword, sisya); 
       searcher.Sort = new SortOption("DisplayName", System.DirectoryServices.SortDirection.Ascending); 

       //一つのPropertyをロードすると、全Propertyを取らないようになる 
       searcher.PropertiesToLoad.Add("SAMAccountName"); //どのPropertyでもいい。 


       SearchResultCollection searchResults = searcher.FindAll(); 



       foreach (SearchResult searchResult in searchResults) 
       { 
        //ListItem contact = null; 
        using (DirectoryEntry userEntry = searchResult.GetDirectoryEntry()) 
        { 
         try 
         { 
          string schemaClassName = userEntry.SchemaClassName; 
          switch (schemaClassName) 
          { 
           case "user": 
           case "contact": 
            string fname = userEntry.Properties["GivenName"].Value == null ? "" : userEntry.Properties["GivenName"].Value.ToString(); 
            string lname = userEntry.Properties["sn"].Value == null ? "" : userEntry.Properties["sn"].Value.ToString(); 
            string dname = userEntry.Properties["DisplayName"][0] == null ? lname + " " + fname : userEntry.Properties["DisplayName"][0].ToString(); 

            //No Mail address 
            if ((userEntry.Properties["mail"] != null) && (userEntry.Properties["mail"].Count > 0)) 
            { 


             string sAMAccountName = ""; 
             if(userEntry.Properties["SAMAccountName"].Value != null){ 
              sAMAccountName = userEntry.Properties["SAMAccountName"].Value.ToString(); 
             } 
             else{ 
              sAMAccountName = userEntry.Properties["cn"].Value.ToString(); 
             } 
             string contactXml = Utils.ListViewXml(sAMAccountName, UserType.User, Utils.UserXml(fname, lname, userEntry.Properties["mail"].Value.ToString(), dname, null), ServerType.Ad); 
             ewsItems.Add(new ListItem(dname + "<" + userEntry.Properties["mail"].Value.ToString() + ">", contactXml)); 
            } 
            else 
            { 
             ListItem contact = new ListItem(dname, null); 
             contact.Enabled = false; 

             ewsItems.Add(contact); 

             Trace.Info("追加できないユーザ: " + searchResult.Path); 
            } 
            break; 
           case "group": 
            ewsItems.Add(new ListItem(userEntry.Properties["DisplayName"].Value.ToString(), Utils.ListViewXml(userEntry.Properties["SAMAccountName"].Value.ToString(), UserType.Group, null, ServerType.Ad))); 
            break; 
           default: 
            userEntry.Properties["SAMAccountName"].Value.ToString()); 
            ewsItems.Add(new ListItem(userEntry.Properties["name"].Value.ToString(), Utils.ListViewXml(userEntry.Properties["SAMAccountName"].Value.ToString(), UserType.Group, null, ServerType.Ad))); 
            break; 

          } 
         } 
         catch (Exception ex) 
         { 
          Trace.Error("User data取得失敗", ex); 
         } 
        } 
       } 

       searchResults.Dispose(); 

      } 
     }  
     return ewsItems; 
    } 
Problemi correlati