【问题标题】:Using Outlooks COM class component fails only with admin privileges仅在管理员权限下使用 Outlooks COM 类组件失败
【发布时间】:2017-08-02 10:58:12
【问题描述】:

我有一个查询当前 Outlook 会话的 PowerShell 脚本。

仅在未提升的 PowerShell 窗口中运行它可以像预期的那样工作,但是当我在提升的提示符中时它会失败,如下所示:

“正常”会话:

PS> New-Object -Com Outlook.Application


Application        : System.__ComObject
Class              : 0
Session            : System.__ComObject
Parent             :
Assistant          :
Name               : Outlook
Version            : 15.0.0.4903
COMAddIns          : System.__ComObject
Explorers          : System.__ComObject
Inspectors         : System.__ComObject
LanguageSettings   : System.__ComObject
ProductCode        : {90150000-000F-0000-0000-0000000FF1CE}
AnswerWizard       :
FeatureInstall     : 1
Reminders          : System.__ComObject
DefaultProfileName : Outlook
IsTrusted          : False
Assistance         : System.__ComObject
TimeZones          : System.__ComObject
PickerDialog       : System.__ComObject

提升一:

PS> New-Object -Com Outlook.Application
New-Object : 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)).
At line:1 char:1
+ New-Object -Com Outlook.Application
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ResourceUnavailable: (:) [New-Object], COMException
    + FullyQualifiedErrorId : NoCOMClassIdentified,Microsoft.PowerShell.Commands.NewObjectCommand

Elevation 使用管理员组中的相同用户帐户。为什么会这样?以及如何解决?据我所知,未提升的应用程序不允许直接与提升的应用程序通信,但反过来应该可以工作,不是吗?我也尝试以管理员身份启动 Outlook,但 - 正如预期的那样 - 它没有任何区别。

编辑:

C:/WINDOWS/system32> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.14393.693
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.14393.693
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

Win 10 上的 PoSh 5 和 Office 2013 Home & Business

【问题讨论】:

  • 如果您以提升会话的形式启动 Outlook,您是否仍会获得与在非提升会话中相同的 Outlook 配置文件负载?
  • 是的,保持不变。
  • 如果我打开了 Outlook 或者我首先在正常会话中打开了实例,我可以重现您的问题。如果 Outlook 关闭并且没有人通过 COM 连接,我提升的 New-Object 工作得很好。我最有根据的猜测是,您无法使用具有不同高度级别的多个进程连接到 Outlook。至于为什么会这样,老实说,我不知道。
  • 使用 procmon,这可能只是对我的 pst 文件的共享违规。如果你也是这种情况,那么这最终与海拔无关。
  • 是的,我可以通过这种方式重现它。问题是,如果提升的 PowerShell 持有我无法启动未提升的 Outlook 的对象。 (说另一个版本的 Outlook 已打开) 似乎没有解决方案。令人困惑的是,我可以在相同的海拔高度打开尽可能多的 PoSh 进程而不会遇到麻烦......

标签: windows powershell outlook com uac


【解决方案1】:

感谢@Lieven 帮助我研究这个问题。如果有人过来并找到解决方案,我想保持开放状态。正如@Lieven 和对我自己的一些正在进行的研究所述,对此没有“解决方案”

Outlook 和 PowerShell 可以通过共享内存同时使用同一个 Outlook 会话。由于具有不同提升级别的进程无法共享内存(需要参考),第二个进程(在我的情况下是提升的 PowerShell)必须自己打开 PST(一个新的 Outlook 会话),这会失败,因为它是由第一个独占打开的(在我的例子中未提升的 Outlook)。

我的解决方法是创建一个低级进程来保存 Outlook 会话,并创建一个providing a pipeline 以供更高级别的进程(以及同级进程)进行连接。反之亦然,因为不允许未提升的进程连接到提升的管道。

这对我有用,因为从 PowerShell 处理 Outlook 会话的任务非常基本。但是,它仍然是一种解决方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    相关资源
    最近更新 更多