因此,问题如下:
下面的代码在Outlook应用程序未运行的情况下在我的桌面应用程序中运行良好。当Outlook以管理员权限运行时,它也可以正常工作。但是,当Outlook正常运行时,代码确实会引发错误。现在另一个问题是,不能要求用户以管理员身份继续运行Outlook,因为这样即时搜索将停止工作。
我的应用程序以对我的应用程序具有强制性的管理权限运行。
平台: Microsoft.NET Framework 4.6.2 展望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);
}
}
答案 0 :(得分:0)
COM系统不会在不同安全上下文中运行的应用程序(例如,常规应用程序和以管理员身份提升权限的应用程序)之间封送调用。它是如何设计的。
一种可能的解决方法是避免使用Outlook对象模型(进程外)并使用扩展MAPI(进程内加载了扩展MAPI),但这将您限制为C ++或Delphi。您还可以使用包装的扩展MAPI(例如Microsoft不再支持的CDO 1.21)或Redemption(其RDOSession对象类似于CDO 1.21中的Session或OOM中的命名空间对象)。请注意,您仍然遇到问题,因为PST和缓存的Exchange存储提供程序将无法共享在同一配置文件中使用的PST和OST文件,但在不同安全上下文中运行的进程之间将使用不同的MAPI会话。