2

我正在尝试从网页在远程主机上运行 .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 相同的管理员帐户。

4

1 回答 1

3

问题可能是您的远程主机 (novi2) 上的 PSExecSvc 没有自行清理,现在需要删除它才能成功运行。我现在在针对远程主机启动 PSExec 的每个脚本的末尾添加以下内容:

sc \\novi2 delete PSExecSvc

此外,如果您在远程主机而不是针对远程主机实例化 PSExec,那么您需要确保添加开关以接受其 EULA,如下所示:

psexec \\HOST1 /accepteula -u userid -p password COMMAND

希望有帮助,丽兹

于 2012-09-04T06:48:26.983 回答