2010-02-09 5 views
5

Estoy usando EWS y deseo obtener la lista global de direcciones de intercambio para la compañía. Sé cómo recuperar la lista de contactos personales.¿Cómo recupero contactos globales con los servicios web de Exchange (EWS)?

Todas las muestras en la documentación de la API se ocupan de actualizar la información del usuario, pero no específicamente de cómo recuperarlas.

Incluso he intentado lo siguiente para enumerar las carpetas, pero no arroja los resultados correctos.

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) { 
      } 
     } 
    } 
} 

Mientras que la cuestión se ha planteado ya ofertas (How to get contact list from Exchange Server?) esta pregunta específicamente con el uso de sistemas de alerta temprana para obtener la lista global de direcciones, mientras que esta pregunta le pide consejo a un nivel general.

Respuesta

2

es posible que tiene ItemType objetos en un specifiedfolder con el siguiente fragmento de código y luego echados ItemType objetos a ContactItemType (para objetos de contacto) ....

/// <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 porque en realidad está respondiendo a su pregunta. Aunque solo quería reiterar que esto solo captará a los usuarios que tengan buzones en Exchange, que es un subconjunto de usuarios en AD. –

+0

¿No veo cómo responde esto a la pregunta? Brett menciona que sabe cómo obtener esta información para una carpeta específica (Contactos) pero no cómo hacerlo para la Lista global de direcciones. – Miles

0

que acabo de hacer una cosa similar. Sin embargo, no pude obtener la lista de contactos a través de Exchange, ya que solo obtiene usuarios que tienen buzones de correo, y no necesariamente todos los usuarios o grupos. Finalmente terminé obteniendo todos los usuarios a través de AD

aquí está el código para obtener todos los contactos en AD. Todo lo que necesita es el folderID de la lista global de direcciones que se puede obtener usando la herramienta ADSI.msc en su servidor AD y navegando a la carpeta de la lista global de direcciones, observe las propiedades y obtenga el valor de la "búsqueda pretendida". En mi sistema de la SearchPath de la lista global de direcciones es "(& (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; 
    } 
Cuestiones relacionadas