首页 > 解决方案 > 无法使用 NameSpace.Logon 启动带有特定配置文件的 Outlook

问题描述

我尝试使用以下代码启动 Outlook:

static Application outlook;
static NameSpace ns;

static void Main(string[] args)
{
    Console.WriteLine($"Outlook already running: {Process.GetProcessesByName("Outlook").Any()}");
    Console.Write("Enter Profile: ");
    var profile = Console.ReadLine().Trim();

    Console.WriteLine($"Using Profile: '{profile}' ...");

    outlook = new Application();
    ns = outlook.GetNamespace("MAPI");
    ns.Logon(profile, "", false, true);

    ns.GetDefaultFolder(OlDefaultFolders.olFolderInbox).Display();
}

输出是

Outlook already running: False
Enter Profile: Koch
Using Profile: 'Koch' ...

有一个名为“Koch”的配置文件但是使用此代码,无论输入哪个配置文件,Outlook 始终会打开默认配置文件(称为“Outlook”)。

“手动”启动 Outlook 时,它会询问配置文件,然后从选定的配置文件开始。

使用Process.Start一切启动 Outlook 时,一切都按预期工作。

Process.Start("Outlook", $"/profile \"{profile}\"");

我如何确保NameSpace.Logon按预期工作?

编辑 我注意到使用RDOSession.Logonfrom Redemption 有效:

RDOSession session = new RDOSession();
session.Logon(profile, Type.Missing, false, false);

使用此代码时选择了正确的配置文件。但是因为我想使用 Outlook Interop 启动 Outlook,所以这不是“解决方案”。

标签: c#outlookoffice-interop

解决方案


MSDN 文档声明如下:

当用户第二次启动 Outlook 时,该 Outlook 实例在同一个 Outlook 进程中运行,不会创建新进程,而是使用相同的配置文件。

如果 Outlook 已在运行,则使用此方法不会创建新的 Outlook 会话或将当前配置文件更改为其他配置文件。

您似乎正在另一个安全上下文中运行您的应用程序。查看任务管理器中正在运行的进程列表,确保没有 Outlook 进程仍在运行。

此外,您可以尝试使用 UI 选项来选择传递的配置文件true以显示 MAPI 登录对话框,以允许用户选择 MAPI 配置文件。因此,您可以确定该Logon方法正常工作。


推荐阅读