当我删除额外的引用级别时,您的示例对我有用。
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
这至少使远程脚本运行并产生了预期的输出。(我发出了计算机名、用户名和文件位置。)
请记住,此方法不使用任何传输层/应用层加密,因此密码是通过网络以明文形式发送的。