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

虽然已经提出了这个问题(如何从 Exchange Server 获取联系人列表?),但这个问题专门处理使用 EWS 获取全局地址列表,而这个问题要求提供一般级别的建议。

4

2 回答 2

2

您可以使用下面的代码片段在指定文件夹中获取 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;
    }
于 2010-02-24T12:54:58.347 回答
0

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

这是获取 AD 中所有联系人的代码。您所需要的只是全局地址列表的文件夹 ID,可以通过使用 AD 服务器上的 ADSI.msc 工具并浏览到全局地址列表文件夹,查看属性并获取“声称的搜索”的值。在我的系统中,全局地址列表的 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;
    }
于 2011-05-24T06:37:45.833 回答