C# 启动启动一个shell,然后快速退出

C# 启动启动一个shell,然后快速退出,c#,winforms,input,process,streamwriter,C#,Winforms,Input,Process,Streamwriter,我正在编写一个使用WinForms的C#应用程序 我想以管理员的身份启动自己的shell,然后使用streamwriter运行一些命令 我没有做任何恶意的事情。这是为了修复与另一个内部应用程序(用于工作)的连接问题。另一个团队不愿意修复他们的程序,所以他们向我们提供了一个命令行修复程序。然而,我必须在许多PC机上运行它,所以我正在学习C#,并试图构建一些我会使用的东西 一旦myProcess.Start执行,就会出现一个黑框,然后在转到下一行之前很快消失 public void Proces

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

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

我没有做任何恶意的事情。这是为了修复与另一个内部应用程序(用于工作)的连接问题。另一个团队不愿意修复他们的程序,所以他们向我们提供了一个命令行修复程序。然而,我必须在许多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();

}
如果我做错了什么,请告诉我。如果我能使用更好的技巧,我愿意接受建议

谢谢

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

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

编辑:

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

可能发生的情况是线路有一些错误(或者它的运行时间很短),而您没有看到

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

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

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

编辑:

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

可能发生的情况是线路有一些错误(或者它的运行时间很短),而您没有看到


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

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

/uid:" + cname + "/pwd:"
应该是:

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

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

/uid:" + cname + "/pwd:"
应该是:

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

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

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
动词

文档中没有这样说,但是
动词
属性只有在
UseShellExecute
设置为
true
时才有影响。因此,请求提升意味着您必须将
UseShellExecute
设置为
true
。没有其他方法可以为新流程请求提升。您必须使用
runas
动词通过
ShellExecuteEx
(或其相关项),这迫使您将
UseShellExecute
设置为
true

因此,这里有两个相互冲突的要求。我想你在海拔高度上别无选择。你必须接受这项任务。这意味着你必须放弃重定向。我想唯一的其他选择是运行调用进程。这意味着任何子进程都将被提升,不需要运行
runas
,因此您可以将
UseShellExecute
设置为
false


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

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

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
动词

文档中没有这样说,但是
动词
属性只有在
UseShellExecute
设置为
true
时才有影响。因此,请求提升意味着您必须将
UseShellExecute
设置为
true
。没有其他方法可以为新流程请求提升。您必须使用
runas
动词通过
ShellExecuteEx
(或其相关项),这迫使您将
UseShellExecute
设置为
true

因此,这里有两个相互冲突的要求。我想你在海拔高度上别无选择。你必须接受这项任务。这意味着你必须放弃重定向。我想唯一的其他选择是运行调用进程。这意味着任何子进程都将被提升,不需要运行
runas
,因此您可以将
UseShellExecute
设置为
false


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

这是答案吗?我非常怀疑这是造成他的问题的原因。这足以解决他的问题。我相信