在过去的几周里,我一直在互联网上搜索,想找出一个问题,那就是使用 psExec 在远程计算机上打开“计算器”。最后,我也在这里问了一个问题。我仍然没有答案,但寻求帮助变成了来来回回的回答和对 psExec 故障排除的不同方法的评论。我很感激我得到的帮助,所以我查看了我得到的故障排除想法列表,并想 - 如果我可以直接搜索“故障排除 psExec”并将此列表放在一个地方,而不是在大量不同的网站上寻找有用的小信息,那不是很好吗?
因此,考虑到这一点,并本着回答你自己的问题帖子中,我将列出我找到的所有故障排除方法,然后提出我的问题。由于我是这个网站的新手,所以我还不能添加很多链接,因此对于所包含的信用和来源链接很少,我深表歉意。
- 在
\\targetmachine
命令部分,尝试使用计算机名称或 IP 地址。有时其中一个不起作用,而另一个却起作用。 - 使用
-i
开关使程序在远程机器上进行交互。 - 使用
-d
开关,这样cmd
当您正在执行的程序仍在运行时就不会挂起。 - 尝试运行您要运行的程序之外的其他简单程序(例如
calc
,,cmd
或创建一个简单的.bat
文件进行测试),以检查您的语法是否错误。 - 使用类似的命令瞄准另一台计算机,看看该命令是否有效。
- 如果您
-d
已经尝试过切换,请运行程序并让其挂起一段时间,以查看系统是否运行缓慢。有时某些程序会花费一些时间。 - 运行其他 psTools(例如
psList
或)psService
来检查您是否有权访问远程计算机 - 检查目标计算机是否可供本地计算机访问的另一种方法是打开 Windows 资源管理器窗口并在地址栏中输入:
\\targetcomputername\c$
。这应该让您访问目标 C: 驱动器中的文件夹。 cmd
以管理员身份运行- 使用用户名和密码开关(
-u
和-p
)。尝试使用您的常规帐户,然后尝试使用您的管理员帐户(如果您有)。 - accepteula 可以写成
-accepteula
和/accepteula
- 显然一种方法适用于某些系统,一种方法适用于其他系统。 -accepteula
在命令中插入两次,因为第一个命令有时会被“吞掉”并且不会被执行(从这个帖子)。- 通过远程连接或实际操作转到目标机器,然后
psExec
在命令提示符下运行,以便您可以手动接受弹出的许可协议。(accepteula
应该这样做,但显然有时它不起作用) - 在目标计算机上手动运行 psExec,查看您的机器是否存在问题。
- 检查
admin$
目标计算机上的共享是否已打开 - 按照 karlchen 在 Sysinternals 论坛上的帖子中适合您的 Windows 版本的任何说明进行操作这里,然后运行建议的 3 行代码。
- 检查目标的防火墙或防病毒软件是否允许 psExec。
- 如果可以,请关闭防火墙并重试该命令。
- 尝试使用具有相同防病毒和防火墙设置的另一个目标执行该命令,以查看防火墙/防病毒软件是否存在问题。
- 尝试在目标计算机上将 UAC(用户帐户控制)设置为“从不通知”/关闭。
- 如果您需要与您自己的凭据不同的凭据,请尝试缓存您的凭据(来自这个帖子)
psExec 下载页面和 Sysinternals psExec 常见问题解答和论坛都是很好的资源。
我在这里写下的这些故障排除想法都没有解决我的问题,这意味着还有更多的想法。否则,有人可以如何排除 psExec 故障简单问题像我的一样(只需打开一个像计算器一样的简单程序)?
答案1
A)\{目标机器}。 2015 年,我们将所有 *.bat 批处理文件更改为使用 IPAddress 作为 {targetmachine},而不是使用 ComputerName,这样就解决了调用 PsExec 时出现“挂起”的问题。2018 年,随着所有新的病毒安全措施的实施,我们发现使用IPAddress 现在导致 PsExec 挂起长达 3 分钟。因此,我们已将批处理文件切换回使用 ComputerName。
B)-p {密码}。我们中有 6 个人经常使用使用 PsExec 的批处理文件,并且我们的批处理文件已定制为使用我们的用户名和密码。在上次强制的 3 个月密码更新之后,我们发现密码中不包含特殊字符的用户(例如 @ ! ^ $)不再遇到任何挂起时间,而密码中包含特殊字符的用户则经常遇到 20 秒的挂起时间。(这很难排除故障,因为只有在过去 3 分钟内未调用批处理文件时,包含特殊字符的用户才会遇到 20 秒的挂起时间。如果最近运行过这些文件,挂起时间就会消失。)
C)在任何 *.bat 批处理文件中使用 @。同样,我们发现,如果我们从调用或被 PsExec 调用的任何批处理文件中删除“@”字符,则挂起时间会消失(无论批处理文件运行了多长时间)。对于那些不熟悉 *.bat 文件编程的人来说,@ 字符会抑制“回显”到屏幕,即使在批处理文件中将回显设置为“开”。
D)总结:2015 CODE
@echo off
@psexec \\199.245.27.107 -u DomainName\UserName -p MyP@$$W*rd cmd.exe /k c:\local_PsExec_commands.bat "%cd%" %1 %2
2018 代码
echo off
psexec \\TargetComputer -u DomainName\UserName -p MyPassWord cmd.exe /k c:\local_PsExec_commands.bat "%cd%" %1 %2
我们还从目标计算机上的所有“local_PsExec_commands.bat”文件中删除了“@”字符。
答案2
TL;DR:完整的解决方案,缺点最少,按照步骤 1 和 2 即可完成。已在本地 Win11 22H2 和目标 WinSer22 21H2 上验证。
笔记:此解决方案假设您正在使用最新的 Win 版本、最新的 PSExec 以及本地和目标 PC 上带有密码的已知管理员帐户。您可以指定在目标 PC 上使用的帐户与在本地 PC 上使用的帐户不同。此外,请忽略 PSExec 中的任何奇怪错误,它无法与许多其他控制台应用程序很好地配合使用,尤其是在捕获其输出时……是的,calc 运行良好并耐心等待您,打开后它并没有自行关闭,愚蠢的 PSExec。
- 预设置- 以下是允许 PSExec 远程访问所需的全部内容。在目标 PC 上按以下顺序运行这些程序:
PowerShell-管理员:
Get-NetConnectionProfile | Set-NetConnectionProfile -NetworkCategory Private
CMD-管理员:
winrm qc -force
netsh AdvFirewall firewall add rule name=PSExec dir=In action=allow protocol=TCP localport=RPC profile=domain,private program=""%WinDir%\system32\services.exe"" service=any
netsh AdvFirewall firewall set rule group="Remote Service Management" new enable=yes
您可能需要重新启动才能使所有更改生效。
- 工作- 按以下顺序在本地电脑上运行这些程序:
CMD-管理员:
start /wait "pse" cmd /c "C:\PSTools\psexec64 -accepteula -i -h \\win-4j1l0slsnda -u WIN-4J1L0SLSNDA\administrator -p @dm1N -c -f quser > act_cons.tmp"
type act_cons.tmp | findstr console > qu.tmp
PowerShell-管理员:
$quid = gc qu.tmp | % {$_.substring(1)} | % {$_ -Split " "} | Out-String -Stream | ? {$_.Trim().Length -gt 0}
$quidn = $quid[2]
(-join (echo "C:\PSTools\psexec64 -accepteula -i " $quidn " \\win-4j1l0slsnda -u WIN-4J1L0SLSNDA\administrator -p @dm1N -c -f calc")) | sc -Force pse.tmp
gc pse.tmp | cmd
步骤说明1:我认为私有网络很重要,因为我们正在修改防火墙规则并且服务器需要启用它。可能不需要所有 CMD,但欢迎您尝试其中的第三个或两个;我没有时间测试所有情况。
步骤说明2:powershell 在某些控制台应用程序和捕获输出方面存在问题,遗憾的是 psexec 就是其中之一,所以我们需要在 cmd 中使用 start.com(它有自己的怪癖)来巧妙地解决它。第二个 CMD 可以在 powershell 中完成,但我喜欢 findstr,因为它很简单。我们需要使用 quser 来找出控制台的会话 id,永远不要假设它是 1……我们也可以使用 pstools 来找到它,但我们想避免消失/双重接受问题。一旦我们有了 id,让我们将 var 值添加到我们的 psexec cmdline,然后将其传递给 cmd 运行,因为 psexec 可能无法在其 cmd 参数中转义 powershell vars。
笔记为了执行程序参数的顺序:每个参数的位置和顺序都很重要,否则 PSExec 通常会失败并且没有任何有用的信息。如果您需要添加其他参数,请试验它们的顺序,因为您不能相信内置帮助输出中的顺序。
更多信息第一psexec 命令行怪癖:
- accepteula 总是排在第一位
- -i -h 位于其之后且在服务器名称之前,因此我们可以使用 -i 和 -h 使用所有交互式登录和管理权限,否则我们会收到 psexec 错误:
登录失败:未授予用户在此计算机上请求的登录类型。
- -u :始终位于服务器名称之后,我们将域名大写,并将帐户/用户名以正确的大小写形式显示
- -p :如果您的密码中有空格,请将其更改并删除...当只需要密码时,PSExec 可能无法使用单引号或双引号
- -c -f 始终位于我们的 cmd 之前的末尾,因此我们强制将最新的 PSExec 复制到目标 PC,无论是已经存在,还是旧版本,还是第一次复制并运行
更多信息第二psexec cmdline,除上述内容外:
- -i SessionID :PSExec 内置帮助谎言,它不会自动默认到控制台会话以交互方式显示应用程序...它只运行隐藏在控制台会话中的应用程序,所以我们必须传递 quser 找到的控制台 SessionID,以强制我们的应用程序显示在控制台桌面上
- 另外 - 我们在这里不使用 -h,因为 calc 在启动或使用过程中不会请求管理员权限,但如果您的应用程序需要,那么也要传递 -h...但是它实际上可能不会显示管理员在桌面上请求应用程序,我没有测试过,因为 calc 不需要