繁体   English   中英

从 Exchange 而不是 Outlook 获取联系人

[英]Getting contacts from Exchange instead of Outlook

我目前正在开发一个在工作中内部使用的应用程序。 我需要获取当前登录用户的联系人以在应用程序中使用,我目前正在获取以下联系人:

Microsoft.Office.Interop.Outlook.Application app = new Microsoft.Office.Interop.Outlook.Application();
            Microsoft.Office.Interop.Outlook.NameSpace NameSpace = app.GetNamespace("MAPI");
            Microsoft.Office.Interop.Outlook.MAPIFolder ContactsFolder = NameSpace.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderContacts);
            Microsoft.Office.Interop.Outlook.Items ContactItems = ContactsFolder.Items;
            foreach (Microsoft.Office.Interop.Outlook.ContactItem item in ContactItems)
            {

                //do stuff with the contacts here

            }

这种方法的问题是,每当用户打开应用程序而 Outlook 尚未打开时,会出现一个 Outlook 弹出窗口,要求用户允许或拒绝应用程序访问 Outlook 联系人。 这是不必要的,我唯一想到的是如何阻止这种形式的发生,而不是使用 Outlook 本身,从 Exchange 服务器获取联系人。

我已经查看了一堆关于 EWS 之类的文档,但是我没有找到保证 EWS 与 Exchange 2019 一起工作的参考资料。我还希望根据当前登录用户的域身份验证自动完成任何身份验证,而不是要求用户输入密码。

我确实尝试使用这个: https://learn.microsoft.com/en-us/exchange/client-developer/exchange-web-services/get-started-with-ews-managed-api-client-applications但是ExchangeVersion只有 Exchange 2013 的选项。

我应该用什么来实现这一目标? 任何朝着正确方向的推动将不胜感激。

使用active directory而不是EWS来获取网络用户数据,包括 email 地址。
相关的命名空间是: System.DirectoryServices
这是我在项目中编写的一个示例,用于通过 AD 中的名字和姓氏获取包括 email 在内的用户数据。
注意ActiveDirectoryEntity我们是我的 class。
另外,关于您在问题中写的另一个问题,不需要输入用户名和密码,因为当用户通过 windows 进行身份验证时,身份验证已经完成。

public static List<ActiveDirectoryEntity> GetActiveDirectoryData(string sname, string fname)
{
    try
    {
        DirectorySearcher search = new DirectorySearcher();
        search.Filter = String.Format("(&(objectCategory=person)(objectClass=user)(givenname={0}*)(sn={1}*))", sname, fname);
        search.PropertiesToLoad.Add("givenName");
        search.PropertiesToLoad.Add("sn");
        search.PropertiesToLoad.Add("mail");
        search.PropertiesToLoad.Add("mobile");
        search.PropertiesToLoad.Add("department");

        var result = search.FindAll();

        List<ActiveDirectoryEntity> resultlist = new List<ActiveDirectoryEntity>();

        foreach (SearchResult r in result)
        {
            if (r.Properties["mail"] != null)
            {
                if (r.Properties["mail"].Count > 0)
                {
                    ActiveDirectoryEntity ade = new ActiveDirectoryEntity();
                    if ((r.Properties["givenname"].Count > 0))
                        ade.FirstName = r.Properties["givenName"][0].ToString();
                    if ((r.Properties["sn"].Count > 0))
                        ade.LastName = r.Properties["sn"][0].ToString();
                    if ((r.Properties["mail"].Count > 0))
                        ade.Email = r.Properties["mail"][0].ToString();
                    if ((r.Properties["department"].Count > 0))
                        ade.Department = r.Properties["department"][0].ToString();
                    resultlist.Add(ade);
                }
            }
        }

        return resultlist;
    }
    catch
    {
        return null;
    }

}

您收到安全提示是因为您的机器没有最新的防病毒应用程序。

如果您无法控制应用程序运行的环境,您唯一的选择是 Extended MAPI(C++ 或 Delphi)或Redemption (任何语言)。

Keep in mind that Outlook Object Model cannot run in a Windows service (such as as IIS) - you woudl need to switch to EWS, Extended MAPI, or Redemption (use its RDO family of objects).

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM