使用Outlook COM类组件仅使用管理员权限

时间:2017-03-12 10:52:31

标签: windows powershell outlook com uac

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

仅在未加工的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使用相同的用户帐户,该帐户位于Administrator组中。为什么会这样?以及如何解决它?据我所知,未提升的应用程序不允许直接与提升的应用程序通信,但反过来应该工作,不应该吗?我也尝试以管理员身份启动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

在Office 10 Home&amp ;;的Win 10上它是PoSh 5商业

1 个答案:

答案 0 :(得分:1)

感谢@Lieven帮助我研究这个问题。如果有人到处寻找解决方案,我想保持开放状态。正如@Lieven所说的以及一些正在进行的关于我自己的研究,对此没有“解决方案”

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

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

这适用于我,因为从PowerShell执行Outlook会话的任务非常基本。但它仍然是一种解决方法。