c# - 从 IIS 运行 PsExec : PsExecSVC hanging on remote host

标签 c# iis-7 batch-file psexec

我正在尝试从网页在远程主机上运行 .bat 文件。

执行批处理后,PSEXECSVC(在主机上)将挂起且不会关闭,导致服务器无限期等待。
当在控制台应用程序中运行完全相同的代码(见底部)时,服务关闭并且一切正常......

奇怪的部分是当批处理文件包含单行回显时:

@echo off
echo ------ Start -----
exit

PsExecSvc 将关闭,页面上将显示 “------ Start -----”。 (这就是我想要的..)

另一方面,

@echo off
echo ------ Start -----
echo echo2

exit

PSEXECSVC 将在执行结束时挂起...

手动杀掉 PSEXECSVC 时,仅显示 "-------- Start -----" 和 StdErr 打印:

PsExec v1.98 - Execute processes remotely

Copyright (C) 2001-2010 Mark Russinovich

Sysinternals - www.sysinternals.com

The handle is invalid.

Connecting to novi2...

Starting PsExec service on novi2...

Connecting with PsExec service on novi2...

Starting C:/dbInfo.bat on novi2...

Error communicating with PsExec service on novi2:

无论批处理文件中运行什么,只有 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 中的应用程序池使用与 psexec 相同的管理员帐户。

最佳答案

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

sc \\novi2 delete PSExecSvc

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

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

希望有帮助, 莉兹

关于c# - 从 IIS 运行 PsExec : PsExecSVC hanging on remote host,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4904725/

相关文章:

C# - Windows Server 2008 和 IIS7 上来自 NetApi32.dll 的 NetUseAdd

c# - 如何创建 .bat 文件来运行 C# 代码?

batch-file - 在脚本之间通过引用传递参数

c# - 我怎样才能用响应式扩展解决这个问题?

c# - 有效载荷包含两个或多个文件

c# - 如何为 Accord.NET DecisionTrees 正确提供输入数据

iis - 如何在 IIS 上设置反向代理,允许 host1.mydomain.com 和 host2.mydomain.com 之间的跨主机通信?

asp.net - IIS7中 'classic'和 'integrated'管道模式有什么区别?

windows - 命令中不解析的变量

c# - 如何刷新访问 token