Создать почту, где Outlook не работает с правами администратора - PullRequest
0 голосов
/ 17 сентября 2018

Код ниже работает в моем настольном приложении, если:

  • Outlook не работает
  • Outlook работает с правами администратора

Когда Outlook работает нормально, код выдает ошибку.

Ссылка на объект не найдена

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

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

Платформа: Microsoft.NET Framework 4.6.2 Outlook 2016 Windows 10

 public static void CreateOutlookEmail(string email, string subject, string body, string cc, string fileName)
    {
        try
        {
            Microsoft.Office.Interop.Outlook.Application app;
            try
            {
                app = (Microsoft.Office.Interop.Outlook.Application)Marshal.GetActiveObject("Outlook.Application");
            }
            catch
            {
                app = new Microsoft.Office.Interop.Outlook.Application();
            }

            if (app == null)
            {
                return;
            }

            Microsoft.Office.Interop.Outlook.MailItem mailItem = app.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem) as
                                                                 Microsoft.Office.Interop.Outlook.MailItem;
            mailItem.BodyFormat = Microsoft.Office.Interop.Outlook.OlBodyFormat.olFormatHTML;
            mailItem.Importance = Microsoft.Office.Interop.Outlook.OlImportance.olImportanceHigh;
            mailItem.Subject = subject;
            mailItem.To = email;
            mailItem.HTMLBody = body;
            mailItem.CC = cc;

            var fileInfo = new FileInfo(fileName);

            mailItem.Attachments.Add(fileName, Microsoft.Office.Interop.Outlook.OlAttachmentType.olByValue, 1,
                                     fileInfo.Name);
            //mailItem.Display();


            ((Microsoft.Office.Interop.Outlook._MailItem)mailItem).Send();

        }
        catch (Exception eX)
        {
            XtraMessageBox.Show(eX.Message + "\n" + eX.StackTrace + "\n" + eX.Source + "\n" + eX.InnerException);
        }
    }

1 Ответ

0 голосов
/ 17 июля 2019

COM-система не выполняет маршализацию вызовов между приложениями, работающими в разных контекстах безопасности (например, обычное приложение и приложение с повышенными правами администратора).Вот как он спроектирован для работы.

Один из возможных обходных путей - избегать использования объектной модели Outlook (вне процесса) и использования расширенного MAPI (который загружается внутри процесса), но это ограничивает васC ++ или Delphi.Вы также можете использовать расширенный MAPI в оболочке (например, CDO 1.21, который больше не поддерживается Microsoft) или Redemption (его RDOSession объект аналогичен Session в CDO 1.21 или объекту Namespaceв ООМ).Обратите внимание, что у вас все еще есть проблемы, поскольку PST и поставщик кэшированного хранилища Exchange не смогут совместно использовать файлы PST и OST, используемые в одном профиле, но в разных сеансах MAPI между процессами, работающими в разных контекстах безопасности.

...