如何解决简单的 psExec 问题?

如何解决简单的 psExec 问题?

在过去的几周里,我一直在互联网上搜索,想找出一个问题,那就是使用 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。

  1. 预设置- 以下是允许 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

您可能需要重新启动才能使所有更改生效。

  1. 工作- 按以下顺序在本地电脑上运行这些程序:

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 不需要

相关内容