我正在尝试从网页在远程主机上运行 .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 服务...
正在连接novi2 上的PsExec 服务...
在 novi2 上启动 C:/dbInfo.bat ...
在 novi2 上与 PsExec 服务通信时出错:
无论在批处理文件中运行什么,只有 StdOut 的第一行被重定向并且 psexecsvc 挂起(但在整个批处理执行之后 :O )。
如果运行:
信息.bat:
@echo off
cscript /nologo test.vbs
exit
测试.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 相同的管理员帐户。