PsExec 和无效的句柄

6
我正在尝试使用Windows批处理脚本,使用PsExec在远程计算机上执行命令。有时会出现“无效句柄”错误,然后脚本失败。
脚本既没有更改过,也没有更改过任何一台机器。
有人知道为什么会发生这种情况吗?因为有时候脚本可以毫无问题地运行。
或者有人知道如何以更可靠的技术在机器上以本地用户身份运行脚本。
PS:有时第一个PsExec可以工作,而其他则失败。
编辑:
脚本只有一行(除了设置适当的变量)。
 PsExec %HOSTNAME% -I -u %USERNAME% -p %PASSWORD% CMD /C RMDIR /S /Q e:\SomeDir

有时候这个方法可以正常工作,但是有时候会出现“无效句柄”的错误。


你的脚本在这里是关键,假设它不是连接问题。但没有看到脚本是无法回答的。也许他们之所以投反对票是因为问题缺少脚本? - foxidrive
@foxidrive 我打错字了,“rmdir” - 我正在将它从一台机器复制到另一台机器上(其中一台不在互联网上)。 - Ed Heal
不足够的详细信息。“一段时间内运行正常,但最终失败……”这是什么意思?是在循环中运行?还是手动运行?还是从计划任务中运行?它是如何运行的?它使用哪些权限运行,这些权限与它访问的主机有什么关系?有多少个主机?它停止的那个主机有什么不同之处?还是它停在同一台机器上的一个目录中,或者......或者......或者......缺少了太多细节。 - RLH
@RobHuston - 它通常通过 Jenkins 从一台机器运行到另一台机器(只有两台机器)。同时,有时在命令行中运行时会失败。例如,昨晚在凌晨1点时它是正常的,但在2点时失败了,在3点和4点时又恢复正常。网络上没有任何活动。 - Ed Heal
如果我的上一篇帖子无法单独阐明问题,那么第二步就是将脚本视为一系列小的成功 - 它们可以被视为检查点,并在达到每个检查点时向日志中添加条目,但请先尝试更简单的方法。我真的希望这有所帮助。 - WonderWorker
显示剩余3条评论
3个回答

4
你需要调试这种情况。
你有一个脚本,然后某个东西(Jenkins是什么?)在远程PC上启动它,有时它可以正常工作,有时却失败了。
这是确定性的吗? 当它失败时,它总是失败吗? 它是如何失败的?
你需要更好地了解脚本何时/如何失败。
以下是我收集有关这些故障的更好理解的方法。
你能多次运行脚本吗? 从评论中看来,你每小时运行一次脚本,你能连续运行3/4/5次吗?每小时运行几次? 这将帮助你确定它是如何失败的:如果你运行它5次,它是否每次都有效?如果它失败了,它是否连续失败了5次?
你能尝试使用不同的脚本吗? 你可以创建一些更相似但更简单的脚本。 所以你可以尝试用RMDIR运行你的脚本,然后用一个简单的DIR命令运行另一个脚本(只是为了查看脚本启动/连接机制是否正常),然后用一个简单的ECHO命令运行另一个脚本(这样它就不需要访问任何文件夹)
在本地PC上运行调试脚本 然后,你可以同时运行其他在本地PC上运行的脚本(而不是需要执行RMDIR的远程PC),这些脚本尝试访问远程PC,使用PING或从/到网络共享复制文件...
嗅探网络 你甚至可以设置一个Wireshark实例,记录两台PC之间发送的所有数据包,这有助于分析/排除网络问题。
你显然需要跟踪/记录所有内容。
通过这种信息,也许你/我们可以更好地了解问题所在。
=====================================
更新1-记录一些日志
=====================================
也许你可以尝试使用以下修改后的脚本来获取一些日志文件。 这些脚本将创建2个日志文件,一个在远程PC上(包含远程执行命令的消息),另一个在本地PC上(包含来自PsExec的任何消息)
(你需要调整保存日志文件的路径)
psexec %HOSTNAME% -I -u %USERNAME% -p %PASSWORD% CMD /C "RMDIR /S /Q e:\SomeDir >>c:\RemoteComputer.log 2>&1" >>c:\LocalComputer.log 2>&1

您确定需要在CMD中使用/I参数吗?在我的电脑上,如果我使用/I参数,它不起作用...

psexec %HOSTNAME% -u %USERNAME% -p %PASSWORD% CMD /C "RMDIR /S /Q e:\SomeDir >>c:\RemoteComputer.log 2>&1" >>c:\LocalComputer.log 2>&1

经过我的电脑测试,我发现PsExec安装了一个服务来远程运行命令。这个服务称为PsExecSvc.exe,安装在c:\windows\上的WinXP PC中(我正在用于测试)。此命令执行所需的临时服务的远程安装/卸载可能是生成错误的可能“故障点”之一。
如果是这种情况,则可以通过查看LocalComputer.log来跟踪此问题,该日志将包含PsExec的消息/错误。
如我之前的建议所述,我还会尝试调度更简单的脚本。
psexec %HOSTNAME% -u %USERNAME% -p %PASSWORD% CMD /C "dir c:\ >>c:\RemoteComputerDir.log 2>&1" >>c:\LocalComputerDir.log 2>&1

并且

psexec %HOSTNAME% -u %USERNAME% -p %PASSWORD% CMD /C "echo SuperEchoTest >>c:\RemoteComputerEcho.log 2>&1" >>c:\LocalComputerEcho.log 2>&1

更新2 - 尝试使用WMI

===================================

您可以尝试使用WMI来运行远程命令。

wmic /node:%HOSTNAME% /user:%USERNAME% /password:%PASSWORD% process call create "CMD /C RMDIR /S /Q e:\SomeDir"

当您使用WMI时,需要确保Windows防火墙不会阻止您的命令。(当我尝试在Win 7 PC上运行具有WMIC的远程命令时,Windows防火墙通知弹出)
(我在这里找到了使用WMIC的指示:这里


  1. Jenkins是一个自动构建系统。请参见http://jenkins-ci.org/。
  2. 我创建了我能想到的最简单的脚本。只需删除每小时1/2创建的目录。
  3. 脚本只运行一个命令。即在远程机器上运行psexec
  4. 有什么需要记录的-如果不起作用,psexec会输出“无效”!
  5. 如果您有关于在另一台机器上执行命令的其他技术建议,我将不胜感激。尝试过PowerShell,但跨域位有问题。
- Ed Heal
@EdHeal 我刚刚在回答中添加了一些增强日志脚本。 - Max
这个链接可能会对你有所帮助。 - Stathis Andronikos
@StathisAndronikos - 感谢提供链接 - 我会尝试一下。如果成功了,我会请您发布一个问题,以便您获得赏金。 - Ed Heal
@EdHeal 我刚刚添加了另一种使用WMI运行远程命令的方法。 - Max

1

是的,有一种更可靠的技术可以在远程计算机上执行命令,它被称为powershell。例如,您可以运行:

test-connection -computername server01, server02, server12

将本地计算机ping多个远程计算机。

另一个非常有用的命令是:

invoke-command -filepath c:\scripts\test.ps1 -computerName Server01

在Server01计算机上运行Test.ps1脚本。 教程提供了多个示例,介绍如何在远程计算机上运行PowerShell命令。

跨域身份验证是这里的问题。 - Ed Heal

0

可以找到一种不同的技术来模仿Linux世界,使用ssh。这在集群中非常常见,我个人曾在Windows Server 2008 R2上使用过它,因此我不希望在Windows 7上有任何区别。

这个任务通常使用ssh和无密码公钥身份验证来执行。使用它,唯一需要的信息是远程服务器的IP和客户端的公钥,存储在服务器上:只有具有相应私钥的客户端才能连接到它(密钥必须在客户端上使用ssh-keygen创建。将公钥复制到服务器上)

服务器必须从外部访问TCP端口22,以防有防火墙、NAT等。

在我的情况下,我使用了Windows SUA中包含的ssh服务器,但我建议你忘记它们(它们已经过时,而且实际上相当麻烦),尝试一下OpenSSH cygwin服务器,即使它不是微软官方支持的,至少有一个庞大的社区支持它,我偶尔也会可靠地使用它。

客户端ssh命令包含在SUA中,在cygwin中,或者您可以使用putty作为客户端的轻量级解决方案(不是说cygwin很重 - 只是有一种不需要的Linux仿真的负担)

举个搜索的例子,我找到了this post,很好地解释了所需的步骤。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接