无法在Powershell远程会话中访问UNC路径

use*_*958 7 mapping powershell remoting invoke

我无法从本地计算机访问Powershell远程会话中的服务器上的UNC路径.我可以直接在Servers Cmd提示符中使用它们.

实际上,我已登录到服务器并将UNC路径映射为本地驱动器(例如X :).使用登录时重新连接选项.

我有一个批处理文件驻留在这个X:驱动器中,我想使用本地脚本中的invoke命令远程运行它.但是,它失败了.

它说"找不到驱动器.名称为X的驱动器不存在".

此外,当我尝试使用scriptblock中的net use命令映射驱动器时,它也会抛出错误 - 系统错误1223 - 本机命令错误.

我使用管理员凭据登录此服务器.

任何人都可以请帮助我,我想要做的就是远程运行脚本驻留在这个UNC路径?

此外,当我将服务器中的UNC路径映射为本地驱动器时,为什么我无法在PS远程会话中使用它?

提前致谢.TS

alr*_*roc 10

你真的有三件不同的事情在这里发生.

1和3.仅在以交互方式登录时映射驱动器.因此,当您远程连接到另一台计算机,映射驱动器,然后注销/断开连接时,该映射驱动器已断开连接.除了在交互式GUI用户会话中,您不能依赖于您自己不创建的映射驱动器号.在脚本或任何远程会话中,只需使用UNC路径即可 - 它更可靠.

2.当您尝试在远程PS会话中映射驱动器时,您遇到了所谓的"双跃点"问题.有一个解决方案,但你需要做额外的设置.请参阅http://blogs.msdn.com/b/clustering/archive/2009/06/25/9803001.aspx双跳访问以复制没有CredSSP的文件


mkl*_*nt0 8

alroc 的有用答案很好地解释了问题,并指出了通过事先配置解决问题的资源。

  • 可以在这篇博客文章中找到对根本问题(臭名昭著的 Kerberos双跳问题)的解释以及可用解决方案的概述

至于在远程会话(PSv3+)中访问网络共享的临时解决方案

  • 通过变量传递会话的凭据;例如,-Credential $cred

  • 然后也在会话内使用这些凭据- 例如,as $using:cred- 来建立映射网络位置的会话范围辅助驱动器,使用New-PSDrive.
    映射驱动器后,即可访问目标位置 - 无论是通过驱动器名称还是直接通过 UNC 路径。

注意:这是OP他/她自己发现的方法的一种变体,并在对alroc答案的评论中进行了简要讨论,除了New-PSDrive使用的是而不是net use,这消除了以纯文本形式检索密码的需要。

以下示例代码演示了从远程会话内部的网络共享运行脚本:

# A sample script to run from a network share on a remote computer.
$script = '\\server-001\install\Install-Agent.ps1'

# A sample target computer.
$computer = 'ws-002'

# Obtain the credentials for the remote session and store them in a variable.
$cred = Get-Credential $env:USERNAME

Invoke-Command -ComputerName $computer -Credential $cred {
  # Map the target network share as a dummy PS drive using the passed-through
  # credentials.
  # You may - but needn't - use this drive; the mere fact of having established
  # a drive with valid credentials makes the network location accessible in the
  # session, even with direct use of UNC paths.
  $null = New-PSDrive -Credential $using:cred -Name dummy -Root (Split-Path -Parent $using:script) -PSProvider FileSystem
  # Invoke the script via its UNC path.
  & $using:script
}
Run Code Online (Sandbox Code Playgroud)

笔记:

  • $null = ...抑制New-PSDrive的输出(它输出一个描述新创建的驱动器的对象)。

  • 由于 创建的驱动器New-PSDrive不是持久性的(除非您传递-Persist),因此无需再次显式删除虚拟驱动器,但您可以使用 来执行此操作Remove-PSDrive

    • 另请注意,PS 驱动器定义是有范围的,以便只有调用范围及其后代才能看到该驱动器;这使得包装语句能够在& { ... }作用域中调用它们,这意味着在该块内创建的 PS 驱动器将在退出该块时自动超出作用域。