c# - .NET 在执行调用需要较低权限的 COM+ 的特定代码块时降级管理员权限或模拟当前用户

标签 c# office-interop com+ windows-identity

我有一个 .NET Windows 窗体应用程序,用户以管理员身份运行,因为它需要对文件的特定访问权限。
该应用程序多年来一直运行良好,但我们需要添加一项功能,让用户可以使用 Microsoft.Office.Interop.Outlook 从应用程序内部生成电子邮件。
一旦我们在 Outlook 对象上调用“new”,它就会崩溃并出现以下错误:

System.Runtime.InteropServices.COMException (0x80080005): 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)).

这是因为默认情况下,MS Outlook 在没有提升权限的情况下运行,而 Windows 窗体应用程序在具有提升权限的情况下运行,但 COM+ 无法处理此设置。

因此,我需要一种方法以当前用户身份调用 .NET Outlook 代码,但权限较低。

我看过WindowsIdentity类,但似乎不起作用。我需要以某种方式以当前用户身份运行方法或代码块,但权限较低。

最佳答案

The app has been working fine for years but we need to add a feature where users can generate email from inside the application using Microsoft.Office.Interop.Outlook.

如果您想在这种情况下自动化 Outlook,则需要在没有管理员权限的情况下运行 WinForms 应用程序。或者只是在与您的应用程序相同的安全上下文下运行 Outlook。否则,您可以考虑其他技术来发送电子邮件 - EWS,Graph API ,使用MailMessage Class来自.net BCL等。

关于c# - .NET 在执行调用需要较低权限的 COM+ 的特定代码块时降级管理员权限或模拟当前用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69531200/

相关文章:

c# - datagridview 中多列的搜索栏

c# - 无法将 Microsoft Office Interop 程序集添加到项目中

c# - 如何隐藏word文本框边框?

c# - COM+、事务和 ContextUtil.SetAbort()

.net - COM+ 组件调用其他 COM+ 组件 - "Cannot load type"

c# - 只返回特定属性

c# - 如何从 Gtk.TreeStore 中删除父 TreeIter 的所有子节点?

c# - ASP、Server.CreateObject、MTS 和 C# 对象池——重用问题?

c# - .Net XmlWriter - 意外的编码让我感到困惑

outlook - 使用HTML正文发送Outlook 2007 session 请求