Process.Start cmd.exe将不会运行在IIS中运行时作为文件传递的cmd文件

时间:2015-02-18 18:16:49

标签: c# batch-file cmd process.start

我整个上午一直在寻找和试验这个,我很难过。我有一个在IIS中运行的aspx页面并调用以下c#函数。我正在尝试让它运行cmd文件并返回cmd文件的输出。我在下面的代码中尝试了五种不同的选项:

protected String RunMyCmdFileAndGetResponse() {
    Process proc = new Process ();
    proc.StartInfo.FileName = @"c:\Windows\System32\cmd.exe";
//  proc.StartInfo.Arguments = @"/c echo hello";                    <== 1
//  proc.StartInfo.Arguments = @"/c c:\mypath\myfile_badname.cmd";  <== 2
//  proc.StartInfo.Arguments = @"/c type c:\mypath\myfile.cmd";     <== 3
    proc.StartInfo.Arguments = @"/c c:\mypath\myfile.cmd";      //  <== 4
//  proc.StartInfo.Arguments = @"/c call c:\mypath\myfile.cmd";     <== 5
    proc.StartInfo.UseShellExecute = false;
    proc.StartInfo.RedirectStandardOutput = true;
    proc.StartInfo.RedirectStandardError = true;
    proc.StartInfo.CreateNoWindow = true;

    proc.Start();
    string response = proc.StandardOutput.ReadToEnd();
    response += proc.StandardError.ReadToEnd();
    proc.WaitForExit();
    return response;
}

Cmd文件c:\ mypath \ myfile.cmd内容为:

@echo test line 1 > c:\mypath\myfilelog.txt
@echo test line 2

当手动运行时,此cmd文件按预期工作,生成myfilelog.txt并返回测试行2.使用c#代码执行时:

  • 选项1有效 - 按预期返回'hello'响应。
  • 选项2按预期失败,表示myfile_badname.cmd未被识别为有效命令
  • 选项3按预期工作 - 它返回myfile.cmd的内容作为响应 - 这确认我能够找到并读取文件。
  • 选项4不起作用 - 尽可能接近,我应该这样做。它没有挂断,但也没有返回任何响应,也没有执行cmd文件(没有生成myfilelog.txt)。
  • 选项5 - 与选项4相同的结果。

注意 - 我也尝试修改myfile.cmd以删除第1行(创建日志文件),只留下第2行来回显响应。以防万一是创建日志文件的权限问题。结果相同。

任何帮助将不胜感激!

已更新以添加解决方案:

@MaxOvrdrv的答案让我想到了另一种方式。在使用UseShellExecute = false的IIS上下文中运行Process.Start时确实存在某种限制 - 如果主参数是可执行文件(cmd文件,脚本文件等),则它不会运行它。我尝试将SomeExample.cmd传递给cmd.exe,将SomeExample.js传递给cscript.exe。

然而......我能够用间接级别欺骗它,这样可执行文件名不再是第一个参数,并且它的工作方式就好了。

运行cmd文件:

string theResponse = RunMyCmdAndGetResponse(@"c:\somepath\mycmd.cmd");

protected String RunMyCmdAndGetResponse(string cmdPath) {
    Process proc = new Process ();
    proc.StartInfo.FileName = @"c:\Windows\System32\cmd.exe";
    proc.StartInfo.Arguments = "/c cmd /c " + cmdPath;
    proc.StartInfo.UseShellExecute = false;
    proc.StartInfo.RedirectStandardOutput = true;
    proc.StartInfo.RedirectStandardError = true;
    proc.StartInfo.CreateNoWindow = true;

    proc.Start();
    proc.WaitForExit();
    string response = proc.StandardOutput.ReadToEnd();
    response += proc.StandardError.ReadToEnd();
    return response;
}

运行脚本文件:

string theResponse = RunMyScriptAndGetResponse(@"c:\somepath\myscript.js");

protected String RunMyScriptAndGetResponse(string scriptPath) {
    Process proc = new Process ();
    proc.StartInfo.FileName = @"c:\Windows\System32\cmd.exe";
    proc.StartInfo.Arguments = "/c cscript //nologo " + scriptPath;
    proc.StartInfo.UseShellExecute = false;
    proc.StartInfo.RedirectStandardOutput = true;
    proc.StartInfo.RedirectStandardError = true;
    proc.StartInfo.CreateNoWindow = true;

    proc.Start();
    proc.WaitForExit();
    string response = proc.StandardOutput.ReadToEnd();
    response += proc.StandardError.ReadToEnd();
    return response;
}

2 个答案:

答案 0 :(得分:1)

从ASPX页面运行批处理文件或任何进程是徒劳的,因为IIS不能在真正的Windows用户上下文中运行。因此,无论您为AppPool运行的用户提供了多少设置和权限,或者您所做的任何类型的配置更改,它都将无法工作。很长一段时间我遇到了同样的问题,基本上这是不可能的。

请参阅我之前的问题(和评论),以及可能的“概念”解决方案,以解决当前问题:

Process.Start won't work

答案 1 :(得分:0)

如何不使用&#34; cmd&#34;?

Process proc = new Process ();
proc.StartInfo.FileName = @"c:\mypath\myfile.cmd";