10

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

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

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

它说“找不到驱动器。名称为 X 的驱动器不存在”。

此外,当我尝试在脚本块中使用 net use 命令映射驱动器时,它也会引发错误 - 系统错误 1223 - 本机命令错误。

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

谁能帮我解决这个问题,我想做的就是远程运行驻留在这个 UNC 路径上的脚本吗?

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

提前致谢。TS

4

3 回答 3

12

你真的有3个不同的事情发生在这里。

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

2. 当您尝试在远程 PS 会话中映射驱动器时,您会遇到所谓的“双跳”问题。有一个解决方案,但是您必须做一些额外的设置。请参阅 无需 CredSSP 的双跳访问复制文件

于 2013-07-23T15:54:03.337 回答
4

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

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

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

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

  • 然后在会话中也使用这些凭据- 例如,作为$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
}

笔记:

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

  • 由于由创建的驱动器New-PSDrive不是持久的(除非您通过-Persist),因此无需再次显式删除虚拟驱动器,但您可以使用Remove-PSDrive.

    • 另请注意,PS 驱动器定义是有范围的,因此只有调用范围及其后代才能看到驱动器;这使得包装语句可以在& { ... }范围内调用它们,这意味着在该块内创建的 PS 驱动器将在退出该块时自动超出范围。
于 2018-02-08T18:53:30.180 回答
-2

您可以尝试通过调用 WmiMethod 打开脚本:

$cmd = "CMD.EXE /c *\\\servername\somefolder\yourscript*.cmd" 

Invoke-WmiMethod -class Win32_process -name Create -ArgumentList $cmd -ComputerName *servername*

请注意,这将在服务器上运行脚本。你可以用它做更多的事情,比如远程安装一个包(在远程机器上本地复制包之后)。

希望这有帮助!

于 2013-09-24T20:50:10.077 回答