代码之家  ›  专栏  ›  技术社区  ›  Bradley Smith

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

  •  3
  • Bradley Smith  · 技术社区  · 14 年前

    我一直在开发一个C(WinForms)应用程序,它使用Office2007 PIA与Outlook2007集成。在我的开发环境中,UAC被禁用,并且我的所有功能都可以工作,但是我的测试环境是VISTA 32位,并且启用了UAC。

    在测试环境中,默认情况下,Outlook以中等完整性级别运行(由用户启动时)。我的应用程序需要高完整性级别(即,它在启动时显示UAC提示)。在这个场景中,实例化 Microsoft.Office.Interop.Outlook.Application 应用程序中的类失败 CO_E_SERVER_EXEC_FAILURE ( COMException ,hresult=0x80080005)。

    我可以用两种方式来解决这个问题:

    1. 确保我的应用程序实例化时,Outlook未运行 Application -这迫使Outlook以高完整性模式运行,因为启动它的进程也以高完整性运行。
    2. 指示Outlook始终以管理员身份运行(兼容性选项卡)。

    值得注意的是,Word和Excel 展示这个问题。

    有没有办法解决这个问题?我的应用程序不能在低完整性下运行,但有一个机会它可以适应在中等完整性级别上运行——但是,我不知道如何做到这一点。.NET可执行文件是否可以在此模式下运行?

    或者,即使存在不匹配的完整性级别,是否有某种方法可以与Outlook通信?正如我所说,Word和Excel似乎对此没有问题。

    1 回复  |  直到 14 年前
        1
  •  4
  •   Community CDub    7 年前

    .NET可执行文件是否可以在此模式下运行?

    .NET应用程序可以在任何UAC完整性级别(包括系统级和低级)运行。

    但是一个进程只有一个完整性级别(将完整性列添加到 Process Explorer 查看流程在完整性级别上的分布)。

    如果尝试运行另一个Outlook实例,它只会将现有实例置于视图中,它会主动阻止两个实例运行。Word和Excel没有。

    这些共同解释了你所看到的。当您实例化Word或Excel应用程序对象时,将以匹配的完整性级别运行新的工作或Excel进程。如果对Outlook执行此操作,并且Outlook已在运行,则它将尝试附加到现有进程。但这将失败,除非Outlook已经在高完整性下运行。您应该能够通过以管理员身份运行Outlook(即高完整性)并运行应用程序以附加到它来验证这一点。

    要求用户以管理员身份运行Outlook是一个糟糕的主意(由于来自未知方的电子邮件附件存在风险,以高完整性运行Outlook只会导致恶意软件感染)。

    最好的方法(这就是explorer等的方法)是将流程分成两部分,使用com标记只提升真正需要提升的应用程序部分。关于如何执行此操作,请参见本问题: How to UAC elevate a COM component with .NET