Получение контактов из Exchange вместо Outlook - PullRequest
0 голосов
/ 26 мая 2020

В настоящее время я разрабатываю приложение для внутреннего использования только на работе. Мне нужно получить контакты текущего зарегистрированного пользователя для использования в приложении, и в настоящее время я получаю следующие контакты:

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. Я также хотел бы, чтобы любая аутентификация выполнялась автоматически на основе аутентификации домена с текущим зарегистрированным in user вместо того, чтобы требовать от пользователя ввода пароля.

Я попытался использовать это: https://docs.microsoft.com/en-us/exchange/client-developer/exchange-web-services/get-started-with-ews-managed-api-client-applications однако ExchangeVersion имеет параметры только до Exchange 2013.

Что я должен использовать для этого? Приветствуются любые pu sh в правильном направлении.

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

Вы получаете запрос безопасности, потому что на вашем компьютере нет актуального антивирусного приложения.

Если вы не можете контролировать среду, в которой работает ваше приложение, единственными вариантами являются расширенный MAPI (C ++ или Delphi) или Redemption (любой язык).

Имейте в виду, что объектная модель Outlook не может работать в службе Windows (например, IIS) - вам необходимо переключитесь на EWS, Extended MAPI или Redemption (используйте его семейство объектов RDO).

0 голосов
/ 26 мая 2020

Используйте active directory вместо EWS для получения данных о сетевых пользователях, включая адрес электронной почты. соответствующее пространство имен: System.DirectoryServices Вот пример, который я написал в своем проекте, чтобы получить данные пользователя, включая электронную почту, по имени и фамилии из AD. Примечание : ActiveDirectoryEntity нас класс мой. также, что касается другой проблемы, которую вы указали в своем вопросе, ввод пользователя и пароля не требуется, поскольку аутентификация уже была выполнена, когда пользователь аутентифицировался на 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;
    }

}
...