新对象-ComObject不一致



我想启动一个用于自动化的MS Outlook。所以我键入:

$Outlook = New-Object -ComObject Outlook.Application

然而,有时进程启动,但PowerShell抛出错误:

New-Object : Creating an instance of the COM component with CLSID {0006F03A-0000-0000-C000-000000000046} from the IClassFactory failed due to the following error: 800100
01 Call was rejected by callee. (Exception from HRESULT: 0x80010001 (RPC_E_CALL_REJECTED)).
At line:1 char:12
+ $Outlook = New-Object -ComObject Outlook.Application

这是什么意思?如何在没有错误的情况下一致地创建com对象?这条线总是有效的:

Start-Process "C:Program Files (x86)Microsoft OfficerootOffice16OUTLOOK.EXE"

但连接到它时出现了一个问题:

#sleep 30
$Outlook = [Runtime.InteropServices.Marshal]::GetActiveObject("Outlook.Application")

我需要在代码中加入睡眠,以等待MS Outlook启动并运行。否则PowerShell将再次引发错误。

不清楚代码何时何地运行。MS声明如下:

Microsoft目前不建议也不支持从任何无人参与的非交互式客户端应用程序或组件(包括ASP、ASP.NET、DCOM和NT服务(自动化Microsoft Office应用程序,因为在这种环境中运行Office时,Office可能会表现出不稳定的行为和/或死锁。

如果您正在构建一个在服务器端上下文中运行的解决方案,则应尝试使用可安全执行无人值守的组件。或者,您应该尝试找到至少允许部分代码运行客户端的替代方案。如果使用服务器端解决方案中的Office应用程序,则该应用程序将缺乏成功运行所需的许多功能。此外,您将在整体解决方案的稳定性方面承担风险。

在"Office服务器端自动化注意事项"一文中了解更多信息。如果只处理Exchange帐户,则可以考虑使用Exchange web服务,有关详细信息,请参阅在Exchange中开始使用web服务。

此外,当您尝试从辅助线程处理OOM对象时,Office应用程序可能会给出异常。您可能会发现RPC_E_CALL_REJECTED 0x80010001在Outlook上从线程帖子创建新邮件很有帮助。

RPC_E_CALL_REJECTED很可能意味着其中一个进程正在以提升的权限运行(以管理员身份运行(。COM系统拒绝封送在不同安全上下文中运行的进程之间的调用。

确保两个应用程序都未提升或两者都未提升。

最新更新