如何在远程计算机上执行 CMD 文件

我希望使用调用在远程机器中执行命令,但 .cmd 文件将调用额外的 .vbs 脚本。所以我想我可能不得不提到 CScript 如果是这样我如何在下面的命令中同时提到 cmd/c 和 cscript

Invoke-Command -computername blrscrv01 -ScriptBlock { param($path, $command ) cmd /c $path $command } -args '"C:windowssystem32cscript.exe"','"/?"'

stack overflow How to execute a CMD file in remote computer
原文答案

答案:

作者头像

当我删除额外的引用级别时,您的示例对我有用。

Invoke-Command -computername blrscrv01 -ScriptBlock { param($path, $command ) cmd /c $path $command } -args 'C:windowssystem32cscript.exe','/?'

故障排除

进入远程会话并四处寻找。

Enter-PSSession -computername blrscrv01

验证目标脚本是否存在且可访问。

dir lcsap027deployc2.cmd
dir lcsap027deploy
type lcsap027deployc2.cmd

尝试以交互方式运行脚本。

lcsap027deployc2.cmd

或者

cmd /c lcsap027deployc2.cmd

### 选择

您可能会尝试的另一件事不是远程调用 cmd 脚本,而是远程发出命令。 New-PSSession 将返回一个句柄,您可以使用它与远程机器进行交互处理。您可以使用 Invoke-Command 重复发出命令并获得结果(不过,作为原始数据类型和通用对象,而不是实际对象本身)。

修改后的脚本

这是您在评论中添加的脚本的修改版本。我已经删除了嵌套的 Invoke-Command (我不知道为什么它是必要的,你已经在远程机器上运行命令)。由于评论中的换行符丢失了,我不知道是否有任何语句分隔符问题(我只是假设没有,尽管它的“格式化”形式作为单行,它会死太可怕了,因为 PoSH 不会知道一个语句在哪里结束,下一个语句在哪里开始)。

param(
  [string]$ComputerName,
  [string]$User,
  [string]$pass
)

Get-PSSEssion | Remove-PSSession    
$session = New-PSSession -ComputerName $ComputerName
Invoke-Command -Session $session -ScriptBlock {
  param(
    [string]$ComputerName,
    [string]$Username,
    [string]$Password
  )

  $net = new-object -ComObject WScript.Network
  $net.MapNetworkDrive("x:", "machinenamesharename", $false, $Username, $Password)
  cmd.exe /c "x:c2.cmd"

  $net.RemoveNetworkDrive("x:")
} -args $ComputerName, $User, $pass

这至少使远程脚本运行并产生了预期的输出。 (我发出了计算机名、用户名和文件位置。)

请记住,此方法不使用任何传输层/应用层加密,因此密码是通过网络以明文形式发送的。