首页 文章

如何使用Exchange Web服务(EWS)检索全局联系人?

提问于
浏览
5

我正在使用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) {
            }
        }
    }
}

虽然问题已经提出(How to get contact list from Exchange Server?),但这个问题特别涉及使用EWS获取全球地址列表,而这个问题在一般层面上征求建议 .

2 回答

  • 0

    您可以使用下面的代码片段在指定的文件夹中获得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;
        }
    
  • 2

    我只是做了一个类似的事情 . 但是,我无法通过Exchange获取联系人列表,因为这只会使用户拥有邮箱,而不一定是所有用户或组 . 我最终通过AD获得了所有用户

    这是获取AD中所有联系人的代码 . 您只需要全局地址列表的folderID,可以使用AD服务器上的ADSI.msc工具并浏览到全局地址列表文件夹,查看属性并获取"purported search"的值 . 在我的系统中,全局地址列表的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;
        }
    

相关问题