新对象 -ComObject 不一致
Posted
技术标签:
【中文标题】新对象 -ComObject 不一致【英文标题】:New-Object -ComObject inconsistency 【发布时间】:2021-08-30 09:33:23 【问题描述】:我想启动 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 Office\root\Office16\OUTLOOK.EXE"
但是接下来连接就出现问题了:
#sleep 30
$Outlook = [Runtime.InteropServices.Marshal]::GetActiveObject("Outlook.Application")
我需要在代码中设置睡眠以等待 MS Outlook 启动并运行。否则 PowerShell 会再次抛出错误。
【问题讨论】:
您是否在单台机器上看到这种行为,它在一分钟工作而不是下一分钟?或者您只是在某些计算机上遇到这种情况,而在其他计算机上则没有?我怀疑如果 Office/Outlook 在初始安装后没有启动和配置,就会发生这种情况。 @MathiasR.Jessen 那台机器上的 MS Office 已经使用了大约一年。我不认为我经常使用的电脑有问题。无论如何,我认为这是一条错误的调查之路 【参考方案1】:不清楚代码在何时何地运行。 MS 声明如下:
Microsoft 目前不推荐也不支持任何无人值守、非交互式客户端应用程序或组件(包括 ASP、ASP.NET、DCOM 和 NT 服务)的 Microsoft Office 应用程序自动化,因为 Office 可能表现出不稳定Office 在此环境中运行时的行为和/或死锁。
如果您要构建在服务器端上下文中运行的解决方案,您应该尝试使用已确保无人值守执行安全的组件。或者,您应该尝试找到允许至少部分代码在客户端运行的替代方案。如果您使用服务器端解决方案中的 Office 应用程序,该应用程序将缺少许多成功运行所需的功能。此外,您将在整体解决方案的稳定性方面承担风险。
在Considerations for server-side Automation of Office 文章中了解更多信息。如果您只处理 Exchange 帐户,则可以考虑使用 Exchange 网络服务,请参阅Start using web services in Exchange 了解更多信息。
当您尝试从辅助线程处理 OOM 对象时,Office 应用程序也可能会出现异常。您可能会发现 RPC_E_CALL_REJECTED 0x80010001 on Outlook new Mail creation from Thread 帖子很有帮助。
【讨论】:
这是一个例程。我启动了我的工作站,启动了 MS Outlook 来检查电子邮件,关闭了 MS Outlook,因为我要开始从事自动化工作,所以我运行 $Outlook = New-Object -ComObject Outlook.Application。这里出现了一个错误。【参考方案2】:RPC_E_CALL_REJECTED
很可能意味着其中一个进程正在以提升的权限运行(以管理员身份运行)。 COM 系统拒绝编组在不同安全上下文中运行的进程之间的调用。
确保两个应用都没有提升。
【讨论】:
我们的机器上安装了 SCCM Client、FireEye、Digital Guardian、Symantec、Phishing Alarm。我猜有些东西可能会干扰元帅呼叫。问题是随机发生的:我打了一个电话 - 这里出错了,我在 5 秒后打了同样的电话,它可以工作。我有两个帐户:用户和管理员。如果我以管理员身份进行封送呼叫,我想我将无法访问用户的 $NameSpace.stores?有什么解决办法吗?以上是关于新对象 -ComObject 不一致的主要内容,如果未能解决你的问题,请参考以下文章