Как получить глобальные контакты с помощью веб-служб Exchange (EWS)? - PullRequest
5 голосов
/ 09 февраля 2010

Я использую EWS и хочу получить глобальный список адресов от биржи для компании. Я знаю, как получить личный список контактов.

Все примеры в документации API имеют дело с обновлением информации о пользователях, но не конкретно с тем, как их получить.

Я даже пытался перечислить следующие папки, но это не дает правильных результатов.

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

Хотя вопрос уже был поднят ( Как получить список контактов с Exchange Server? ), этот вопрос конкретно касается использования EWS для получения глобального списка адресов, в то время как этот вопрос требует совета общий уровень.

Ответы [ 2 ]

2 голосов
/ 24 февраля 2010

вы можете получить объекты ItemType в указанной папке с фрагментом кода ниже а затем приведите объекты ItemType к ContactItemType (для контактных объектов) ....

/// <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 голосов
/ 24 мая 2011

Я просто сделал похожую вещь.Однако я не смог получить список контактов через Exchange, поскольку он получает только пользователей, у которых есть почтовые ящики, а не обязательно всех пользователей или групп.В конечном итоге я получил всех пользователей через AD

, вот код, чтобы получить все контакты в AD.Все, что вам нужно, это folderID глобального списка адресов, который можно получить с помощью инструмента ADSI.msc на вашем сервере AD и поиска в папке Global address list, просмотра свойств и получения значения «предполагаемого поиска».В моей системе searchPath для глобального списка адресов имеет вид "(& (objectClass = user) (objectCategory = person) (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;
    }
...