以中等UAC完整性级别运行CLR应用程序?

3
我一直在开发一个使用Office 2007 PIAs与Outlook 2007集成的C# (WinForms)应用程序。在我的开发环境中,UAC已禁用,所有功能都可以正常运行,但是我的测试环境是带有UAC启用的Vista 32位系统。
在测试环境中,Outlook默认以中等完整性级别运行(由用户启动)。我的应用程序需要高完整性级别(即在启动时显示UAC提示)。在这种情况下,从我的应用程序实例化Microsoft.Office.Interop.Outlook.Application类会失败,并出现CO_E_SERVER_EXEC_FAILURE(COMException,HRESULT = 0x80080005)错误。
我可以通过以下两种方式解决此问题:
1. 确保当我的应用程序实例化Application时,Outlook未在运行。这将强制Outlook以高完整性模式运行,因为启动它的进程也正在以高完整性运行。
2. 指示Outlook始终以管理员身份运行(兼容性选项卡)。
值得注意的是,Word和Excel PIAs没有出现此问题。
是否有任何方法可以解决这个问题?我的应用程序不能以低完整性运行,但有可能可以适应中等完整性级别-然而,我无法找到如何做到这一点。 .NET可执行文件能否以这种模式运行?
或者,是否有一些方法可以在存在不匹配的完整性级别时与Outlook通信?正如我所说,Word和Excel似乎没有这个问题。
1个回答

4
“.NET应用程序可以在任何UAC完整性级别下运行(包括系统和低级)。”“但是一个进程只有一个完整性级别(添加完整性列到Process Explorer以查看进程在完整性级别上的分布)。尝试运行第二个Outlook实例时,它只会将现有实例带入视图,它主动防止两个实例运行。Word和Excel不会这样做。”“这些都解释了你所看到的情况。当你实例化一个Word或Excel应用程序对象时,将运行一个新的Word或Excel进程,并具有相匹配的完整性级别。如果你对Outlook执行此操作并且Outlook已经在运行,则它将尝试附加到该现有进程。但是,除非Outlook已经以高完整性运行,否则此操作将失败。您应该能够通过以管理员身份运行Outlook(即高完整性)然后运行应用程序来附加到它来验证这一点。”“要求用户以管理员身份运行Outlook是一个不好的主意(由于来自未知方的电子邮件附件的风险,以高完整性运行Outlook只会邀请恶意软件感染)。 ”

最佳方法(这也是Explorer等的做法)是将您的过程分成两部分,使用COM monikers仅提升真正需要提升的应用程序部分。请参阅此SO问题,了解如何执行此操作:如何使用.NET UAC提升COM组件


所以,如果我正确理解了你的回答,那么我只能使用非提升进程(或在这种情况下是COM对象)与Outlook进行交互?我的应用程序需要更多的管理员权限,因此将Outlook代码分离到单独的组件中是有意义的。高完整性进程能否生成低完整性COM组件?(希望如此,呵呵) - Bradley Smith
是的,提升的进程可以启动非提升的进程。http://www.gregcons.com/KateBlog/LaunchingANonElevatedProcessFromAnElevatedOne.aspx - Kate Gregory
1
@Bandly:或者说一个中等进程可以(通过正确的API)启动一个高进程。因此,将您的应用程序作为中等运行,只有需要在其自己的高进程中运行的部分才能运行。 - Richard
2
很多时候当你认为需要管理员权限时,实际上并不需要,你只是在错误的位置访问文件/设置。 - Miral

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接