You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CLSCTX_REMOTE_SERVER调用CoCreateInstanceEx时PowerShell提权仍遇拒访

远程DCOM调用在PowerShell Cmdlets中出现0x80070005拒绝访问错误的排查思路

问题背景

我有几款基于同一DLL开发的C# .NET工具,该DLL依赖C++/CLI DLL并使用DCOM技术。以CLSCTX_INPROC_SERVER调用CoCreateInstanceEx时一切正常;切换到CLSCTX_REMOTE_SERVER调用时,GUI工具、传统命令行工具均能正常工作,但一套PowerShell Cmdlets工具却始终返回拒绝访问错误(0x80070005)。

错误出现在工具的多个功能模块中,这些模块调用不同CLSID的CoCreateInstanceEx。已尝试以管理员权限运行该PS Cmdlets,测试目标为本地机器(通过本机名称作为目标搭配CLSCTX_REMOTE_SERVER模拟远程调用),所有工具均通过相同方式调用底层DLL。

目前观察到依赖DCOM的Get-WmiObject -ComputerName能正常工作,怀疑PowerShell对DCOM调用有特殊限制,但暂未找到明确方向,求排查思路。


排查思路

1. 检查PowerShell的权限上下文差异

PowerShell运行时的权限上下文可能和普通CMD/GUI不同,即便拥有管理员权限,也可能受UAC虚拟化或会话隔离影响:

  • 用Start-Process powershell.exe -Verb RunAs强制启动高权限会话后再测试Cmdlets
  • 执行Get-ExecutionPolicy确认执行策略,必要时临时设置为RemoteSigned(虽然执行策略主要管控脚本,但严格策略可能间接影响组件调用)

2. 统一DCOM调用的身份验证级别参数

PowerShell的DCOM默认身份验证级别可能与普通程序不同,需显式指定一致的验证级别:

  • 在调用CoCreateInstanceEx时,明确设置身份验证级别(如RPC_C_AUTHN_LEVEL_PKT_PRIVACY),对比普通工具的调用参数,确保Cmdlets的参数完全匹配

3. 排查本地远程DCOM的权限配置

即便是本地机器的远程DCOM调用,也会经过远程访问权限校验:

  1. 打开dcomcnfg进入组件服务,展开组件服务 > 计算机 > 我的电脑 > DCOM配置
  2. 找到目标DCOM组件(按CLSID或名称查找),右键打开属性
  3. 在安全选项卡中,检查启动和激活权限、访问权限,确保当前用户(含管理员组)拥有对应的远程操作权限
  4. 参考Get-WmiObject依赖的WMI组件权限配置,调整目标组件的权限设置

4. 对比进程令牌权限差异

普通CMD/GUI进程与PowerShell进程的令牌可能存在差异(如是否启用受限令牌):

  • 用Process Explorer查看两类进程的令牌权限,重点检查SeRemoteInteractiveLogonRight、SeIncreaseQuotaPrivilege等远程访问相关权限是否已启用

5. 启用DCOM日志获取详细错误信息

通过系统日志定位具体权限缺失环节:

  1. 打开事件查看器 > 应用程序和服务日志 > Microsoft > Windows > DCOM
  2. 启用日志记录(未启用时需手动开启),重新触发错误后查看日志,日志会明确指出拒绝访问的具体原因

6. 验证C++/CLI DLL的远程加载行为

底层C++/CLI DLL的加载路径或权限可能受PowerShell环境影响:

  • 确认该DLL在远程DCOM服务端(本地测试时即本机)的正确路径中(系统路径或组件指定路径)
  • 检查DLL文件权限,确保DCOM服务进程(通常是svchost.exe)拥有读取和执行权限

内容的提问来源于stack exchange,提问作者Padre Pedro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:23:17