我正在编写一个使用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();
}
如果我做错了什么,请告诉我。如果我可以使用更好的技术,我可以提出建议。
感谢。
答案 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
,然后从那里获取。