我一直在开发一个使用Office 2007 PIA与Outlook 2007集成的C#(WinForms)应用程序。在我的开发环境中,UAC被禁用,我的所有功能都有效,但我的测试环境是Vista 32位启用UAC。
在测试环境中,默认情况下,Outlook以中等完整性级别运行(由用户启动时)。我的应用程序需要高完整性级别(即它在启动时呈现UAC提示)。在这种情况下,从我的应用程序中实例化Microsoft.Office.Interop.Outlook.Application
类失败,并显示CO_E_SERVER_EXEC_FAILURE
(COMException
,HRESULT = 0x80080005)。
我可以通过两种方式解决这个问题:
Application
时,确保Outlook未运行 - 这会强制Outlook以高完整性模式运行,因为启动它的进程也以高完整性运行。值得注意的是Word和Excel PIA 不会出现此问题。
有没有解决这个问题的方法?我的应用程序不能以低完整性运行,但它有可能适应中等完整性级别运行 - 但是,我无法弄清楚如何执行此操作。 .NET可执行文件甚至可以在这种模式下运行吗?
或者,即使存在不匹配的完整性级别,是否有某种方式与Outlook通信?正如我所说,Word和Excel似乎对此没有任何问题。
答案 0 :(得分:4)
.NET可执行文件是否可以在此模式下运行?
.NET应用程序可以在任何UAC完整性级别(包括系统和低级别)运行。
但是,一个进程只有一个完整性级别(将完整性列添加到Process Explorer以查看完整性级别的进程分布。)
如果您尝试运行第二个Outlook实例,它只会将现有实例置于视图中,它会主动阻止两个实例运行。 Word和Excel没有。
这些一起解释了你所看到的。实例化Word或Excel应用程序对象时,将运行具有匹配完整性级别的新Work或Excel进程。如果您使用Outlook执行此操作并且Outlook已在运行,则它将尝试附加到该现有进程。但除非Outlook已经以高完整性运行,否则这将失败。您应该能够通过以管理员身份运行Outlook(即高完整性)然后运行应用程序以附加到它来验证这一点。
要求用户以管理员身份运行Outlook是一个糟糕的主意(由于来自未知方的电子邮件附件的风险,以高完整性运行Outlook只会引起恶意软件感染)。
最好的方法(这就是资源管理器等的工作方式)是将您的过程分成两部分,使用COM标记仅提升应用程序中真正需要提升的部分。请参阅以下有关如何执行此操作的问题:How to UAC elevate a COM component with .NET