Invoke-Command调用Get-ChildItem报错:无法找到网络共享路径
解决Invoke-Command远程执行时无法访问网络共享的问题
问题本质
这个错误是典型的Kerberos双跳权限问题:当从ServerA通过Invoke-Command远程到ServerB时,你的域账号身份只能完成从ServerA到ServerB的第一跳认证,但无法自动将身份传递到第三台共享服务器(网络共享所在机器)。此时ServerB访问共享时使用的是本地系统账号,自然没有权限访问域内共享资源。
可行解决方案
1. 启用Kerberos约束委派(域环境推荐方案)
这是域环境下解决双跳问题的标准安全方案,通过AD配置允许ServerB将你的域身份委派给共享服务器:
- 登录域控制器,打开Active Directory用户和计算机
- 找到ServerB的计算机对象,右键选择属性 → 切换到委派选项卡
- 选择信任此计算机以委派指定的服务,点击添加
- 在弹出窗口中点击用户或计算机,找到共享服务器名称并添加
- 从可用服务中选择
CIFS(网络共享依赖的协议),确认添加 - 配置完成后重启ServerB生效
2. 在ServerB本地预存共享凭据
通过在ServerB上预先保存域账号的共享访问凭据,让远程执行时可以直接使用:
- 在ServerB本地执行以下命令(替换为你的域账号和密码):
cmdkey /add:share-ip-address /user:DOMAIN\your-domain-account /pass:your-password - 之后远程脚本无需修改即可正常执行,因为ServerB本地已经缓存了访问该共享的凭据
- 注意:凭据会保存在ServerB本地,密码变更后需要重新执行命令更新
3. 远程脚本中显式传递凭据
在Invoke-Command时带上凭据,在远程会话中用该凭据访问共享:
- 先在ServerA上获取域账号凭据:
$cred = Get-Credential DOMAIN\your-domain-account - 修改远程执行脚本,通过
New-PSDrive挂载共享并指定凭据:$CurrentPath = '\\share-ip-address\hidden_share$\sub-folder\' $cred = Get-Credential DOMAIN\your-domain-account Invoke-Command -ComputerName ServerB -Credential $cred -ScriptBlock { # 临时挂载共享 New-PSDrive -Name TempShare -PSProvider FileSystem -Root $using:CurrentPath -Credential $using:cred | Out-Null # 执行文件查询 Get-ChildItem -LiteralPath TempShare:\ -Filter "*string*.ext" -Recurse | Sort-Object LastWriteTime | Select-Object Name, LastWriteTime -Last 1 # 清理临时驱动器 Remove-PSDrive TempShare -ErrorAction SilentlyContinue }
4. 使用CredSSP认证(不推荐,安全风险高)
CredSSP允许身份跨跳传递,但会将凭据明文发送到远程服务器,仅适合完全信任的环境:
- 在ServerA(客户端)执行:
Enable-WSManCredSSP -Role Client -DelegateComputer ServerB - 在ServerB(服务器)执行:
Enable-WSManCredSSP -Role Server - 执行远程命令时指定认证方式:
$CurrentPath = '\\share-ip-address\hidden_share$\sub-folder\' Invoke-Command -ComputerName ServerB -Authentication Credssp -ScriptBlock { Get-ChildItem -LiteralPath $using:CurrentPath -Filter "*string*.ext" -Recurse | Sort-Object LastWriteTime | Select-Object Name, LastWriteTime -Last 1 }
内容的提问来源于stack exchange,提问作者JustMike
相关产品推荐
相关产品推荐

