使用具有管理员权限的C#应用​​程序在没有管理员权限的情况下创建Outlook应用程序/邮件项目

时间:2015-03-08 00:55:32

标签: c# exception outlook administrator

我编写了一个需要具有管理员权限的C#代码。使用此应用程序,我试图创建一个Outlook应用程序/邮件项目,以打开Outlook撰写窗口。但是,Outlook 2013已在没有管理员权限的情况下运行。我使用以下代码,但由于创建的应用程序/邮件项和已运行的outlook实例具有不同的权限,因此会引发异常。

Microsoft.Office.Interop.Outlook.Application app = new Microsoft.Office.Interop.Outlook.Application();
Microsoft.Office.Interop.Outlook.MailItem mailItem = app.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);

无论如何都要将应用程序/邮件项目创建为当前用户而不是管理员(类似于通过提供当前用户的用户名和密码来运行当前用户的流程)?

Outlook需要在没有管理员权限的情况下运行才能拥有功能索引服务。

以下是例外情况:

System.Runtime.InteropServices.COMException was unhandled
HResult=-2146959355
Message=Retrieving the COM class factory for component with CLSID {0006F03A-0000-0000-C000-000000000046} failed due to the following error: 80080005 Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).
Source=mscorlib
ErrorCode=-2146959355

3 个答案:

答案 0 :(得分:2)

不,如果安全上下文不同,COM编组将明确拒绝工作。这是一种安全功能,旨在避免在未经用户明确同意的情况下提升安全权限的情况。

答案 1 :(得分:0)

如果需要从应用程序访问正在运行的实例,则需要使用管理员权限运行Outlook。安全上下文应与您的应用程序相对应。

无论如何,您可以考虑使用Exchange Web服务。有关详细信息,请参阅EWS Managed API, EWS, and web services in Exchange。您也可以考虑使用.net BCL创建和发送电子邮件。

答案 2 :(得分:0)

我提出的一个解决方案是通过提供当前用户的用户名和密码来执行作为当前用户的辅助C#应用程序。然后,此应用程序负责创建Outlook邮件/应用程序项并打开撰写邮件。这样,已经运行的Outlook和创建的邮件/应用程序项都没有管理员权限。

我进一步简化了这一点,甚至避免使用任何辅助C#应用程序,只需重新执行我原来的C#应用​​程序,但没有管理员权限并将输入参数传递给它以创建Outlook邮件/应用程序项目。

这似乎完美无缺。