2011-01-28 267 views
7

我试图通过命令提示符从ASP.Net Web应用程序运行命令。我可以在Web服务器上的任务管理器中看到该进程启动,但是该进程只是坐在那里,并且不会退出,也不会运行我指定的命令。当通过Process.Start()调用时,为什么“cmd.exe/C命令”不会结束?

  Process process = new Process(); 
      ProcessStartInfo startInfo = new ProcessStartInfo(); 

      startInfo.FileName = "cmd.exe"; 
      startInfo.Arguments = "/C " +command; 
      startInfo.UserName = "myuser"; 
      startInfo.UseShellExecute = false; 
      startInfo.RedirectStandardOutput = true; 
      startInfo.Domain = "mydomain"; 
      startInfo.CreateNoWindow = true; 

      String pass = "mypass"; 
      System.Security.SecureString secPass = new System.Security.SecureString(); 

      foreach (char c in pass.ToCharArray()) 
      { 
       secPass.AppendChar(c); 
      } 
      secPass.MakeReadOnly(); 

      startInfo.Password = secPass; 

      process.StartInfo = startInfo; 
      process.Start(); 
      //output = process.StandardOutput.ReadToEnd(); 
      process.WaitForExit(); 
      process.Close(); 

我已经试过,没有阅读标准输出。

应用程序将挂在process.WaitForExit();,直到我杀通过任务管理器的进程。

+2

如果您尝试读取标准输出,您看过标准输出是什么?尝试阅读标准错误;你可能会得到某种错误信息,也许有人甚至会说“按任意键继续...”,或者出现这种情况。 – GWLlosa 2011-01-28 16:58:27

+0

@GWLlosa,标准输出和标准错误都是空的。我想到了“按任意键......”,所以我试着给标准输入写一个字符,但还是什么都没有。 – 2011-01-28 17:15:30

+2

为什么通过cmd运行它?为什么不直接运行它? – 2011-01-28 17:46:15

回答

2

我认为,我们需要了解你实际上是试图以过程来确定发生了什么事情什么命令。我们还需要知道服务器运行的是什么操作系统。

例如,我没有在您的意见看,你试过“echo测试> C:\ test.txt的”在Windows Server 2008中(和Windows 7)的根目录需要管理员权限才能创建文件。如果这是在IIS下执行的,我的猜测是你的IIS用户不是管理员,你正在获得安全例外。

此外,由于UAC,许多命令可能需要提高权限。我不记得确切的,但我猜测,如果这些命令被UAC捕获,那么这个过程正在等待UAC确认...我认为你不能通过命令行提供的。

如果您登录到机器并直接执行它...除非你与工作进程的用户帐户登录这类问题不会被看到。

所以,你需要做的第一件事情是弄清楚什么是你正在尝试运行,看看工作进程正在执行用户甚至可以执行这些操作。安全是为了保护你,所以要小心授予用户额外的权限。

为什么它可能一台机器上工作,与另一原因还是取决于操作系统的那些机器正在运行,并在命令下执行用户的配置。

如果这是一个真正的安全问题,因为我怀疑,那么你应该张贴在serverfault.com一个问题要问你需要你的工作进程的用户下执行各种命令什么权限集。

您可以查看机器事件日志以查看是否存在有关该命令的任何警告或错误。有时候,像这样的事情可以在那里显示给你一些关于发生事情的更多信息。

1

一旦传递给CMD,控件就会传递给shell。这是更好地添加关闭它是这样的:

private void closeSubProcess() 
    { 
     Process[] currentProcesses = Process.GetProcesses(); 
     foreach (Process p in currentProcesses) 
     { 
      string s = p.ProcessName; 
      s = s.ToLower(); 
      if (s.CompareTo("YOURPROGRAMNAMEHERE") == 0) 
      { 
       p.CloseMainWindow(); 
       p.Close(); 
      } 
     } 
    } 
0

我打电话给cmd.exe在Windows中启动节点模块。显然必须首先安装npm以及我需要的节点模块,然后我可以用C#中的args调用模块。问题是,cmd.exe不会关闭,我不得不使用任务管理器(就像这个问题!)。

 //This requires npm, and the module installed by npm... 
     ProcessStartInfo psi = new ProcessStartInfo(); 
     psi.FileName = "cmd.exe"; 
     psi.WindowStyle = ProcessWindowStyle.Hidden; 
     psi.UseShellExecute = true; //closes command window 
     psi.Arguments = "/c <nodemodulename>" + file1 + ".txt " + file2 + ".log"; 
     Process p = Process.Start(psi); 
     p.Close(); 

/c参数是关闭cmd.exe的关键。当我开始的时候,我已经输入了/K的论点,这个论证保持了一件令人头疼的事情。解决了。希望这可以帮助。(这是古代的,但我们总是忘记)

相关问题