PowerShell远程调用ExecWB后IE COM对象丢失属性问题求助
问题根因
该问题本质是PowerShell远程会话默认运行在会话0隔离上下文中,IE作为用户交互式桌面应用,调用ExecWB这类涉及UI交互、用户打印配置的COM方法时,无法在无交互式桌面的非用户会话中正常执行,调用后IE COM对象会被系统强制回收或上下文丢失,因此仅能返回基础COM对象的通用方法。本地PowerShell运行在用户交互式会话中,不存在该限制,因此执行正常。
解决方案
- 方案一:通过计划任务绕过会话0限制
- 在远程会话中创建临时计划任务,设置触发条件为「立即运行一次」,执行身份为目标计算机上已登录的交互式用户,执行操作是运行PowerShell打印脚本,脚本示例如下:
# 打印脚本内容 $ieObj = New-Object -ComObject InternetExplorer.Application $ieObj.Visible = $false $ieObj.Navigate2("C:\本地存储路径\目标打印文件.htm") # 等待页面加载完成 while($ieObj.Busy) { Start-Sleep -Milliseconds 300 } # 执行无提示打印 $ieObj.ExecWB(6,2) # 等待打印任务提交完成 Start-Sleep -Seconds 5 $ieObj.Quit() # 释放COM对象 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ieObj) | Out-Null Remove-Variable ieObj- 远程调用启动该计划任务即可正常完成打印,任务执行完成后可删除该临时计划任务。
- 方案二:配置WinRM远程会话使用交互式上下文
- 首先在目标计算机本地执行以下命令配置WinRM权限:
Set-Item WSMan:\localhost\Shell\AllowRemoteShellAccess -Value $true - 建立远程会话时添加
-EnableNetworkAccess参数,确保会话继承用户身份的交互式权限:Enter-PSSession -ComputerName 目标计算机名 -Credential 登录凭据 -EnableNetworkAccess - 打开目标计算机IE浏览器的「Internet选项」-「高级」标签页,勾选「允许活动内容在我的计算机上的文件中运行」选项,保存后重启IE即可。
- 首先在目标计算机本地执行以下命令配置WinRM权限:
- 方案三:替换IE COM打印方案
直接使用系统原生打印命令或第三方轻量HTM打印工具,完全规避IE COM的会话限制,例如直接调用Print动词执行HTM文件打印:Start-Process -FilePath "C:\目标文件.htm" -Verb Print -Wait
内容的提问来源于stack exchange,提问作者Wiktor
相关产品推荐
相关产品推荐

