Process.Start启动一个shell然后快速退出

时间:2014-04-17 17:25:23

标签: c# winforms input process streamwriter

我正在编写一个使用WinForms的C#应用​​程序。

我想以管理员身份启动自己的shell,然后使用Stream Writer运行一些命令。

我没有做任何恶意的事情。解决与另一个内部应用程序(工作)的连接问题。另一个团队不愿意修复他们的程序,因此他们为我们提供了命令行修复。但是我必须在许多PC上运行它,所以我正在学习C#并尝试构建我将使用的东西。

只要myProcess.Start执行,就会出现一个黑框,然后在转到下一行之前快速消失。

  public void ProcessStartAsAdmin(string command)
{
    string cname = Environment.UserDomainName + "\\" + Environment.UserName;

    Process myProcess = new Process();
    myProcess.StartInfo.FileName = @"C:\Windows\System32\CMD.exe";
    myProcess.StartInfo.Verb = @"runas";
    //myProcess.StartInfo.Arguments = command;
    myProcess.StartInfo.UseShellExecute = false;
    myProcess.StartInfo.RedirectStandardInput = true;
    myProcess.StartInfo.RedirectStandardError = true;
    myProcess.StartInfo.RedirectStandardOutput = true;
    myProcess.Start();

    StreamWriter myStreamWriter = myProcess.StandardInput;

    String inputText;
    string resetConnection = "C:\\APP\\application.exe /reset /server:example.com /uid:" + cname + " /pwd:" + textBoxPassword.Text.Trim();

    myStreamWriter.WriteLine(resetConnection);

    myStreamWriter.Close();
    myProcess.WaitForExit();
    myProcess.Close();

}

如果我做错了什么,请告诉我。如果我可以使用更好的技术,我可以提出建议。

感谢。

3 个答案:

答案 0 :(得分:2)

  

string resetConnection =" C:\\ APP \ application.exe

\a是非法的。你应该写\\(好像你知道了,但错过了)。

编辑:

您看到的屏幕为空,因为您选择重定向输出。

可能发生的是该线路有一些错误(或者它的运行时间非常短),你看不到。

取消临时输出重定向,然后关闭流程,看看发生了什么。

答案 1 :(得分:2)

我不知道这是否是唯一的问题,但这两个论点之间没有空格:

/uid:" + cname + "/pwd:"

它应该是:

/uid:" + cname + " /pwd:"

答案 2 :(得分:1)

让我们来看看如何初始化开始信息:

myProcess.StartInfo.Verb = @"runas";
myProcess.StartInfo.UseShellExecute = false;
myProcess.StartInfo.RedirectStandardInput = true;
myProcess.StartInfo.RedirectStandardError = true;
myProcess.StartInfo.RedirectStandardOutput = true;

您正在重定向标准输入,输出和错误流。相关文档说:

  

如果要将RedirectStandardOutput设置为true,则必须将UseShellExecute设置为false。否则,从StandardOutput流中读取会引发异常。

同样对于其他两个标准流。因此,重定向意味着您必须将UseShellExecute设置为false

另一方面,您希望提升新流程。这意味着您要使用runas动词。

文档没有说明,但Verb属性仅在UseShellExecute设置为true时才会产生影响。因此,请求提升意味着您必须将UseShellExecute设置为true。没有其他方法可以请求提升新流程。您必须使用ShellExecuteEx动词传递runas(或其亲属),这会强制您将UseShellExecute设置为true

所以这里有两个相互矛盾的要求。你认为你在海拔高度上没有任何选择。您必须提升此任务。这意味着你将不得不放弃重定向。我想唯一的另一个选择是你运行提升的调用进程。这意味着任何子流程也会被提升,并且不需要runas,因此您可以将UseShellExecute设置为false

但是,我认为没有重定向的理由。我认为您只是这样做,以便您可以向cmd进程发送命令。相反,您可以将命令作为参数传递,或将它们放在外部.bat或.cmd文件中。所以,如果我是你,我会停止重定向,并将UseShellExecute设置为true,然后从那里获取。