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