使用提升的特权运行时如何与Outlook互操作?

时间:2018-06-20 15:38:13

标签: c# .net outlook office-interop com-interop

在调试Outlook Interop的问题时,我注意到以管理员组成员的身份启动进程时,我的应用程序可以正常工作。但是,以同一用户在提升的特权下运行它会失败。

当我们尝试进行互操作时,问题很容易重现。

尝试创建新实例时:

var NewOutlookApp = new Application();
// Crashes if Outlook is already running: System.Runtime.InteropServices.COMException: La récupération de la fabrique de classes COM pour le composant avec le CLSID {0006F03A-0000-0000-C000-000000000046} a échoué en raison de l'erreur suivante : 80080005 Échec de l'exécution du serveur (Exception de HRESULT : 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).
// This translates to: retrieving the COM class factory for componant with CLSID {0006F03A-0000-0000-C000-000000000046} failed due to the following error : 80080005 Failed to run server (HRESULT Exception : 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).
// If Outlook isn't already running this works as expected.

尝试检索现有实例时:

var ExistingOutlookApp = (Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Outlook.Application");
// Crashes if Outlook is not running (Expected behaviour).
// Crashes even if Outlook is already running: System.Runtime.InteropServices.COMException (0x800401E3): Opération non disponible (Exception de HRESULT : 0x800401E3 (MK_E_UNAVAILABLE))
// This translates to: Operation not available.

这是预期的行为吗? 如果是这样,当两个进程以同一用户身份运行时,在具有提升特权的应用程序与没有提升权限的Outlook之间进行交互的合适方法是什么?

环境的配置:

  • Windows 10,最新版本

  • Outlook 2016单击以运行

  • 互操作库:14.0.0.0

  • Visual Studio 2017

1 个答案:

答案 0 :(得分:0)

必须在相同的安全上下文中运行两个应用程序。没有解决该问题的任何可能的方法。最好的办法是让用户知道或要求他们在相同的安全上下文(特权)下运行两个应用程序。例如,您可以检查Windows中正在运行的进程的列表,因此,如果在那里看到Outlook.exe并且无法获取正在运行的Outlook实例,则有必要通知它们。