通过Process.Start()调用时,为什么“cmd.exe / C命令”不会结束?

时间:2011-01-28 16:50:35

标签: c# process cmd

我正在尝试从ASP.Net Web应用程序通过命令提示符运行命令。我可以看到进程在Web服务器上的任务管理器中启动,但是进程只是位于那里而且从不退出也不运行我指定的命令。

            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();,直到我通过任务管理器终止进程。

3 个答案:

答案 0 :(得分:2)

一旦传递给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();
            }
        }
    }

答案 1 :(得分:2)

我认为我们需要了解您实际尝试处理的命令,以确定发生了什么。我们还需要知道服务器运行的操作系统。

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

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

如果您登录计算机并直接执行它,则不会出现此类问题...除非您使用工作进程用户帐户登录。

因此,您需要做的第一件事是弄清楚您正在尝试运行的是什么,并查看工作进程正在执行的用户是否甚至可以执行这些操作。安全性可以保护您,因此请注意向用户授予其他权限。

它可能在一台机器上运行的原因再次取决于操作系统正在运行的操作系统以及执行命令的用户配置。

如果这确实是一个安全问题,我怀疑,那么您应该在serverfault.com上发布一个问题,询问您在工作进程用户下执行各种命令所需的权限集。

您可以查看计算机事件日志,以查看是否有关于该命令的任何警告或错误。有时这样的事情可以显示在那里,为你提供更多关于发生了什么的信息。

答案 2 :(得分:0)

我正在调用cmd.exe来启动Windows中的节点模块。显然必须首先安装npm,以及我需要的节点模块,然后我可以用C#中的args调用模块。问题是,cmd.exe不会关闭,我必须使用Task Mgr(就像这个问题!)。

        //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参数,这可以让darned的东西保持运行。解决了。希望这可以帮助。 (这就像古代,但我们总是忘记)