Invoke-Command 看不到本地网络驱动器
Invoke-Command doesn't see local network drives
我有两台计算机:A 和 B。我正在尝试自动执行一些 CI\CD 任务,我的任务是从 A 远程启动 B 上的一些进程。.exe 文件本身已打开R
驱动器,这是一个本地网络驱动器。所以我这样做:
# here $cred has encrypted credentials, but it is off topic...
Invoke-Command -ComputerName B -Credential $cred -ScriptBlock {
R:\WebClient\Platform\UP_110\Proc.exe
}
显然这与在 B 的 PowerShell 上键入 R:\WebClient\Platform\UP_110\Proc.exe
并按 Enter 是一样的。
现在的问题是 运行 在 A:
上使用上述代码时出现此错误
The term 'R:\WebClient\Platform\UP_110\Proc.exe' is not recognized as the name of a cmdlet, function, sc
ript file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is corr
ect and try again.
+ CategoryInfo : ObjectNotFound: (R:\WebClient\Pl...IMS.UP.Host.exe:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
+ PSComputerName : B
貌似说我的B电脑上没有R:\WebClient\Platform\UP_110\Proc.exe
这个文件。但事实并非如此。我有:
事实上,我在A和B上都有这个R盘。
如果我将 .exe 移动到 C
驱动器(对我来说是系统磁盘)下的任何目录,代码工作正常,但不适用于 R
。
现在更有趣的是,我可以在 A 和 B 上手动 运行 R:\WebClient\Platform\UP_110\Proc.exe
。并且有效。
那么我现在面临的问题是什么?谢谢。
默认情况下,PowerShell Remoting 只能访问在系统上下文中映射的驱动器。最常见的是,这将是基于附加硬件(无论是 USB、SATA、SCSI 等)的盘符驱动器。
在 user 上下文中映射的驱动器(例如远程驱动器)未映射,因为完全登录的发生方式与本地登录方式不同。您可以使用两种解决方法:
通过 SMB/CIFS 共享访问文件时使用 UNC 路径(例如 \server.domain.tld\ShareName\Path\To\Folder\Or\file.ext
使用 New-PSDrive
:
映射传递给 Invoke-Command
的 ScriptBlock
中的驱动器
# Single letter drive name
New-PSDrive -Name "R" -PSProvider FileSystem -Root "\server.domain.tld\ShareName"
Get-ChildItem R:
# More descriptive drive name
New-PSDrive -Name "RemoteDrive" -PSProvider FileSystem -Root "\server.domain.tld\ShareName"
Get-ChildItem RemoteDrive:
三点注意事项:
上例中的 Get-ChildItem
是为了表明列出新驱动器的内容应该显示您希望在远程目录中看到的文件。一旦您确定它适合您,就可以省略它。
此外,使用更长的驱动器名称是 PowerShell 的一项功能,并不意味着您可以从文件资源管理器中将共享文件夹映射为驱动器比单个字符。
您可能 运行 尝试以这种方式映射到远程驱动器时遇到双跃点问题,如果您尝试使用与启动 Invoke-Command
时相同的凭据。 正确解决它超出了 Stack Overflow 的范围,因为这是 Active Directory 的主要架构考虑因素。
但是,您可以通过构建凭据对象并将其从 ScriptBlock
中传递给
New-PSDrive
来解决它,或 运行宁 Invoke-Command
与
-Authentication CredSSP
如果您的组织不阻止它(很多人这样做)。
我有两台计算机:A 和 B。我正在尝试自动执行一些 CI\CD 任务,我的任务是从 A 远程启动 B 上的一些进程。.exe 文件本身已打开R
驱动器,这是一个本地网络驱动器。所以我这样做:
# here $cred has encrypted credentials, but it is off topic...
Invoke-Command -ComputerName B -Credential $cred -ScriptBlock {
R:\WebClient\Platform\UP_110\Proc.exe
}
显然这与在 B 的 PowerShell 上键入 R:\WebClient\Platform\UP_110\Proc.exe
并按 Enter 是一样的。
现在的问题是 运行 在 A:
上使用上述代码时出现此错误The term 'R:\WebClient\Platform\UP_110\Proc.exe' is not recognized as the name of a cmdlet, function, sc
ript file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is corr
ect and try again.
+ CategoryInfo : ObjectNotFound: (R:\WebClient\Pl...IMS.UP.Host.exe:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
+ PSComputerName : B
貌似说我的B电脑上没有R:\WebClient\Platform\UP_110\Proc.exe
这个文件。但事实并非如此。我有:
事实上,我在A和B上都有这个R盘。
如果我将 .exe 移动到 C
驱动器(对我来说是系统磁盘)下的任何目录,代码工作正常,但不适用于 R
。
现在更有趣的是,我可以在 A 和 B 上手动 运行 R:\WebClient\Platform\UP_110\Proc.exe
。并且有效。
那么我现在面临的问题是什么?谢谢。
默认情况下,PowerShell Remoting 只能访问在系统上下文中映射的驱动器。最常见的是,这将是基于附加硬件(无论是 USB、SATA、SCSI 等)的盘符驱动器。
在 user 上下文中映射的驱动器(例如远程驱动器)未映射,因为完全登录的发生方式与本地登录方式不同。您可以使用两种解决方法:
通过 SMB/CIFS 共享访问文件时使用 UNC 路径(例如
\server.domain.tld\ShareName\Path\To\Folder\Or\file.ext
使用
映射传递给New-PSDrive
:Invoke-Command
的ScriptBlock
中的驱动器# Single letter drive name New-PSDrive -Name "R" -PSProvider FileSystem -Root "\server.domain.tld\ShareName" Get-ChildItem R: # More descriptive drive name New-PSDrive -Name "RemoteDrive" -PSProvider FileSystem -Root "\server.domain.tld\ShareName" Get-ChildItem RemoteDrive:
三点注意事项:
-
上例中的
Get-ChildItem
是为了表明列出新驱动器的内容应该显示您希望在远程目录中看到的文件。一旦您确定它适合您,就可以省略它。此外,使用更长的驱动器名称是 PowerShell 的一项功能,并不意味着您可以从文件资源管理器中将共享文件夹映射为驱动器比单个字符。
您可能 运行 尝试以这种方式映射到远程驱动器时遇到双跃点问题,如果您尝试使用与启动
Invoke-Command
时相同的凭据。 正确解决它超出了 Stack Overflow 的范围,因为这是 Active Directory 的主要架构考虑因素。但是,您可以通过构建凭据对象并将其从
ScriptBlock
中传递给New-PSDrive
来解决它,或 运行宁Invoke-Command
与-Authentication CredSSP
如果您的组织不阻止它(很多人这样做)。