1

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

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

4

1 回答 1

0

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

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

故障排除

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

Enter-PSSession -computername blrscrv01

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

dir \\lcsap027\deploy\c2.cmd
dir \\lcsap027\deploy
type \\lcsap027\deploy\c2.cmd

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

\\lcsap027\deploy\c2.cmd

或者

cmd /c \\lcsap027\deploy\c2.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:", "\\machinename\sharename", $false, $Username, $Password)
  cmd.exe /c "x:\c2.cmd"

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

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

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

于 2013-10-30T13:36:12.050 回答