我有一个命令要在远程 PC 上的交互式会话上执行,以将热键发送到控制台。远程命令是PowerShell
$wsshell = New-Object -comObject wscript.shell
$wsshell.SendKeys("+{Q}")
当我在远程工作站上本地运行 psexec 时,它确实会发送 Shift+Q 键并运行另一个应用程序,没有任何问题
但是,当我通过
-i 2
(2是我可以在控制台上看到的会话)与-s
和-h
(调用用户和远程登录用户是远程PC上的管理员)的交互式会话远程运行时
当我远程执行
psexec
时,我可以交互式地看到 powershell 正在执行(可以在远程 PC 上看到 .bat 文件控制台),但它不会发送 Shift+Q 来运行其他应用程序.
任何帮助表示赞赏 - 它是否与 Powershell 执行策略相关。执行政策是
RemoteSigned
SMBShare、文件共享和打印规则已针对域到位并已启用
注:
psexec
进行的实验,结果大多没有在链接文档中详细说明。
-i
是具有重定向输入和输出的交互式控制台应用程序/外壳的 必需(其中 caller 侧的控制台窗口起作用)就像远程执行程序的终端)。不幸的是,示例调用也基于这种误解进行了更新。我从以下实验中得出结论,从 psexec
v2.43 开始,您想要做的事情可以
不能完成,并在 Windows 10 和 Windows 11 计算机上进行了尝试:
下面将使用简单测试命令的 local 调用与 remote 并置;测试命令尝试将
-i
与 -s
结合使用,在目标计算机上运行 PowerShell 命令,延迟 3 秒后将击键 (exit
+Enter) 发送到自己的计算机窗口自动关闭:
\\<computer>
参数 -确实 工作:
# OK, but only without \\<machine>
psexec -i -s -nobanner powershell -executionpolicy bypass -noprofile -noexit -c '$wsshell = New-Object -comObject wscript.shell; $wsshell.SendKeys(''exit{ENTER}''); ''Sending keystrokes to exit this session in 3 secs...''; Start-Sleep 3'
"\\$env:COMPUTERNAME"
与
-i
单独 似乎有效(至少在“远程”到 同一台机器时),但添加
-s
打破了致电:
-s
似乎会导致
-i
选项被忽略,以便该命令在目标计算机上隐形运行,其标准输出输出被捕获并转发给调用者。
也就是说,这个问题意味着至少在过去的某个时刻结合了-i
和
-s
(以及
-i
和
-u
,我的实验表明这也不再有效) )确实工作,并且根据您的反馈,在 v2.43 中仍然为您工作,您看到的唯一问题是交互式远程执行的按键发送部分不起作用 -如果有人有任何见解,请告诉我们。
# NOT OK, due to combination of \\<machine> with -s
# (without -s, i.e. with ONLY -i, it works, at least on the same machine)
psexec "\\$env:COMPUTERNAME" -i -s -nobanner powershell -executionpolicy bypass -noprofile -noexit -c '$wsshell = New-Object -comObject wscript.shell; $wsshell.SendKeys(''exit{ENTER}''); ''Sending keystrokes to exit this session in 3 secs...''; Start-Sleep 3'