我正在尝试从网页上运行远程主机上的.bat文件。
PSEXECSVC(在主机上)将在批处理执行后挂起而不关闭,导致服务器无限期等待。
在控制台应用程序中运行完全相同的代码(参见底部)时,服务关闭,一切正常......
奇怪的部分是当批处理文件由一个衬管回声组成时:
@echo off
echo ------ Start -----
exit
PsExecSvc将关闭,页面上会显示"------ Start -----"
。 (这就是我想要的......)
另一方面,
@echo off
echo ------ Start -----
echo echo2
exit
PSEXECSVC将在执行结束时挂起......
手动终止PSEXECSVC时,只显示"------ Start -----"
和StdErr
打印:
PsExec v1.98 - 执行进程 远程
版权所有(C)2001-2010 Mark Russinovich介绍
Sysinternals - www.sysinternals.com
句柄无效。
连接到novi2 ......
在novi2上启动PsExec服务......
使用PsExec服务连接 novi2 ...
在novi2上启动C:/dbInfo.bat ...
与PsExec通信时出错 novi2服务:
无论在批处理文件中运行什么,只重定向StdOut的第一行并且psexecsvc挂起(但在执行整个批处理之后:O)。
如果正在运行:
info.bat:
@echo off
cscript /nologo test.vbs
exit
test.vbs:
Set objOut = Wscript.StdOut
objOut.WriteLine "----------------------------------"
objOut.Writeline "Win32_OperatingSystem instance"
objOut.Writeline "----------------------------------"
objOut.close
Wscript.quit 666
ConsoleApplication将打印所有内容并返回666
IIS只会在StdOut中获得“----------------------------------”,而psexecsvc将会挂起。 ..
以下是用于在C#中运行psexec的代码...
Process proc = new Process();
ProcessStartInfo procInfo = new ProcessStartInfo(@"C:/PsExec.exe", @"\\novi2 -u Domain\usernameadmin -p Password C:/info.bat");
procInfo.UseShellExecute = false;
procInfo.RedirectStandardOutput = true;
procInfo.RedirectStandardError = true;
proc.StartInfo = procInfo;
proc.Start();
String output = proc.StandardOutput.ReadToEnd();
String err = proc.StandardError.ReadToEnd();
Trace.WriteLine("Out >> " + output);
Trace.WriteLine("Err >> " + err);
proc.Close();
我在服务器上使用IIS 7,ASP MVC3和.NET4.0(来自VS2010的示例项目)和WinXP SP3用于主机。 为避免出现问题,IIS中的ApplicationPool使用与psexec相同的管理员帐户。
答案 0 :(得分:3)
问题可能是远程主机(novi2)上的PSExecSvc自身没有清理,现在需要先删除才能成功运行。我现在在针对远程主机启动PSExec的每个脚本的末尾添加以下内容:
sc \\novi2 delete PSExecSvc
此外,如果您在上实例化PSExec 而不是远程主机,那么您需要确保添加交换机以接受其EULA,如下所示:
psexec \\HOST1 /accepteula -u userid -p password COMMAND
希望有所帮助, LIZZ