PowerShell远程导入自定义模块时遭遇权限拒绝错误的解决方法咨询
问题描述
我现在遇到一个PowerShell远程操作的权限问题,想请教大家怎么解决。情况是这样的:
我想在多台远程PC上使用自己写的自定义模块,但不想把模块文件挨个复制到每台远程机器上。已经在目标远程PC(WorkPC2)上运行了winrm quickconfig开启了远程管理,然后执行了以下代码:
$sessionPC = new-pssession -Credential(Get-Credential) -computername WorkPC2 Invoke-Command -Session $sessionPC{ Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process import-module "\\jumpAdmin2\c$\Users\admin\Desktop\MODULES\InstallQuietly-Application.psm1" -Force import-module "\\jumpAdmin2\c$\Users\admin\Desktop\MODULES\ConsoleNotifications.psm1" -Force }
输入管理员凭据后,却收到了权限拒绝的错误:
Access is denied
- CategoryInfo : NotSpecified: (:) [Import-Module], UnauthorizedAccessException
- FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.ImportModuleCommand
- PSComputerName : WorkPC2
有没有办法解决这个问题,或者能帮我把背后的逻辑理清楚?谢谢大家!
可能的原因与解决方案
我来帮你分析下可能的问题点,以及对应的解决办法:
双跳认证(Double-Hop)问题
这是远程PowerShell里最常见的坑:当你从本地连接到远程PC(第一跳)后,远程PC没办法自动把你的凭据传递给另一台机器(这里的\\jumpAdmin2就是第二跳),默认Kerberos协议不支持这种跨机器的凭据接力。
解决步骤:- 在发起会话的本地机器(需管理员权限)执行:
Enable-WSManCredSSP -Role Client -DelegateComputer WorkPC2 - 在远程PC(WorkPC2,需管理员权限)执行:
Enable-WSManCredSSP -Role Server - 之后创建会话时指定用CredSSP认证:
$sessionPC = New-PSSession -Credential(Get-Credential) -ComputerName WorkPC2 -Authentication CredSSP
注意:CredSSP会把凭据明文传递给远程服务器,只在你完全信任的内部网络环境里使用。
- 在发起会话的本地机器(需管理员权限)执行:
共享文件夹权限不足
检查\\jumpAdmin2\c$\Users\admin\Desktop\MODULES的权限设置:- 确保你远程登录用的账号,同时拥有这个共享的共享权限和NTFS权限的读取权限;
- 系统默认的
C$共享权限比较严格,你可以把MODULES文件夹单独设置一个普通共享,给目标账号明确的读取权限,可能会更稳妥。
执行策略的补充验证
虽然你在远程会话里设置了进程级的Bypass执行策略,但可以在远程会话里先执行Get-ExecutionPolicy -List,查看所有级别的执行策略设置,确认没有更高优先级的策略限制模块导入。SMB连接问题
先在远程PC上手动尝试访问\\jumpAdmin2\c$\Users\admin\Desktop\MODULES,如果手动都打不开,说明是基础的SMB网络连接或者共享权限问题,得先解决这个才能继续导入模块。
总结
最大概率是双跳认证导致的问题,先试试配置CredSSP的方法,同时检查共享权限是否正确。如果还是不行,先从手动访问共享文件夹开始排查基础问题。
备注:内容来源于stack exchange,提问作者Dermot Bohan

