使用CLSCTX_REMOTE_SERVER调用CoCreateInstanceEx时PowerShell提权仍遇拒访
问题背景
我有几款基于同一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调用,也会经过远程访问权限校验:
- 打开
dcomcnfg进入组件服务,展开组件服务 > 计算机 > 我的电脑 > DCOM配置 - 找到目标DCOM组件(按CLSID或名称查找),右键打开属性
- 在安全选项卡中,检查启动和激活权限、访问权限,确保当前用户(含管理员组)拥有对应的远程操作权限
- 参考
Get-WmiObject依赖的WMI组件权限配置,调整目标组件的权限设置
4. 对比进程令牌权限差异
普通CMD/GUI进程与PowerShell进程的令牌可能存在差异(如是否启用受限令牌):
- 用Process Explorer查看两类进程的令牌权限,重点检查
SeRemoteInteractiveLogonRight、SeIncreaseQuotaPrivilege等远程访问相关权限是否已启用
5. 启用DCOM日志获取详细错误信息
通过系统日志定位具体权限缺失环节:
- 打开事件查看器 > 应用程序和服务日志 > Microsoft > Windows > DCOM
- 启用日志记录(未启用时需手动开启),重新触发错误后查看日志,日志会明确指出拒绝访问的具体原因
6. 验证C++/CLI DLL的远程加载行为
底层C++/CLI DLL的加载路径或权限可能受PowerShell环境影响:
- 确认该DLL在远程DCOM服务端(本地测试时即本机)的正确路径中(系统路径或组件指定路径)
- 检查DLL文件权限,确保DCOM服务进程(通常是
svchost.exe)拥有读取和执行权限
内容的提问来源于stack exchange,提问作者Padre Pedro

