PsExec和无效句柄

时间:2014-03-20 15:58:44

标签: batch-file scripting remote-access psexec

我正在尝试使用Windows批处理脚本,该脚本使用PsExec在远程计算机上执行命令。它周期性地具有"无效句柄"然后脚本失败了。

脚本没有改变,或者确实都是机器。

有没有人知道为什么会发生这种情况,因为有时候脚本会毫无障碍地运行。

或者,任何人都知道如何在机器上运行脚本作为具有更可靠技术的该机器的本地用户。

PS 有时第一个PsExec有效,其他人失败。

修改

脚本只是在线(除了设置适当的变量)

 PsExec %HOSTNAME% -I -u %USERNAME% -p %PASSWORD% CMD /C RMDIR /S /Q e:\SomeDir

这有时会起作用,但有时会失败并且#34;无效句柄"

3 个答案:

答案 0 :(得分:3)

您需要调试情况。

你有一个脚本,然后是什么(Jenkins是什么?)在远程PC上启动它,有时它可以工作,有时失败。

这是确定性的吗? 当它失败时它总是失败吗? 它怎么会失败?

您需要更好地了解脚本失败的方式/时间。

我将采取以下措施来更好地理解这些失败。

您可以多次运行脚本吗?
从评论看来,你每小时运行一次脚本,你能连续每小时运行3/4/5吗? 这将帮助您确定它是如何失败的:如果您运行5次,它是否每次都有效?它失败了,连续5次失败了吗?

您可以尝试使用不同的脚本吗?
您可以创建一些更相似但更简单的脚本 因此,您可以使用RMDIR尝试您的脚本,然后使用简单的DIR命令尝试另一个脚本(只是在脚本启动/连接机制工作时),然后使用简单的ECHO命令尝试另一个脚本(因此它需要访问任何文件/文件夹) )

在本地PC上运行调试脚本
然后,您可以同时运行在LOCAL PC上运行的其他脚本(不是您需要执行RMDIR的远程PC)尝试访问远程PC,使用PING,或者从/向网络共享复制文件......

嗅探网络
您甚至可以设置一个Wireshark实例来记录在2台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

或以下没有/ I
的人 您确定需要CMD的/ I参数吗?在我的Pc上,如果我使用/ 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在远程PC上安装了一项远程运行命令的服务。 (它被称为PsExecSvc.exe,安装在我用于此测试的WinXP PC上的c:\ windows \中)
为命令执行远程安装/卸载此临时服务肯定是产生错误的可能“故障点”之一。
如果是这种情况,那么您应该能够通过查看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防火墙没有阻止您的命令。 (当我尝试使用WMIC运行远程命令时,我的Win 7 PC上会弹出Windows防火墙通知) (我的指令是使用WMIC here

答案 1 :(得分:1)

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

test-connection -computername server01, server02, server12

从本地计算机ping到多台远程计算机。

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

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

在Server01计算机上运行Test.ps1脚本。

tutorial提供了有关如何在远程计算机上运行PowerShell命令的几个示例。

答案 2 :(得分:0)

可以找到一种模仿Linux世界的不同技术,并使用 ssh 。它在群集中很常见,我个人将它与Windows Server 2008 R2一起使用,所以我不希望在Windows 7上有任何区别。

此任务通常使用ssh和无密码公钥验证。有了它,唯一需要的信息是远程服务器的IP和客户端的公钥,存储在服务器上:只有具有相应私钥的客户端才能连接到它(必须使用{{1}创建密钥在客户端上。公钥被复制到服务器)

服务器必须具有可从外部访问的TCP端口22,以防有防火墙,NAT,...

在我的情况下,我使用了Windows SUA中包含的ssh服务器,但我建议您忘记它们(它们已被弃用,实际上非常繁琐)并尝试使用OpenSSH cygwin服务器,sshd - 即使不是正式的微软,至少还有一个大型社区支持它 - 偶尔我会可靠地使用它。

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

举例搜索我找到了this post,并详细解释了所需的步骤。