我是C#的新手,我有3个命令(command2,command3和command4)我需要在提升的命令提示符下执行,我也希望在执行过程中查看执行过程。目前,问题是下面的代码只是打开提升的命令提示符而不执行命令。如果错误,我也会寻求更好的解释。
我的代码和解释/理解每一行基于类似案例的评论:ConsoleApp1
class Program
{
static void Main(string[] args)
{
string command2 = @"netsh wlan";
string command3 = @" set hostednetwork mode=true ssid=egghead key=beanhead keyusage=persistent";
string command4 = @" start hostednetwork";
string maincomm = command2.Replace(@"\", @"\\") + " " + command3.Replace(@"\", @"\\") ; //I merged commands 2 and 3
ProcessStartInfo newstartInfo = new ProcessStartInfo();
newstartInfo.FileName = "cmd"; //Intend to open cmd. without this the newProcess hits an error saying - Cannot run process without a filename.
newstartInfo.Verb = "runas"; //Opens cmd in elevated mode
newstartInfo.Arguments = maincomm; //I intend to pass in the merged commands.
newstartInfo.UseShellExecute = true; //
newstartInfo.CreateNoWindow = true; // I intend to see the cmd window
Process newProcess = new Process(); //
newProcess.StartInfo = newstartInfo; //Assigns my newstartInfo to the process object that will execute
newProcess.Start(); // Begin process and Execute newstartInfo
newProcess.StartInfo.Arguments = command4; //I intend to overwrite the initial command argument hereby passing the another command to execute.
newProcess.WaitForExit(); //
}
}
答案 0 :(得分:1)
这就是我为克服挑战所做的工作,它给了我我想要的东西。我修改了我的代码,使用System.IO直接写入提升的命令提示符。
ProcessStartInfo newstartInfo = new ProcessStartInfo();
newstartInfo.FileName = "cmd";
newstartInfo.Verb = "runas";
newstartInfo.RedirectStandardInput = true;
newstartInfo.UseShellExecute = false; //The Process object must have the UseShellExecute property set to false in order to redirect IO streams.
Process newProcess = new Process();
newProcess.StartInfo = newstartInfo;
newProcess.Start();
StreamWriter write = newProcess.StandardInput ; //Using the Streamwriter to write to the elevated command prompt.
write.WriteLine(maincomm); //First command executes in elevated command prompt
write.WriteLine(command4); //Second command executes and Everything works fine
newProcess.WaitForExit();
参考:http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardinput(v=vs.110).aspx
http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo(v=vs.110).aspx
我认为理解ProcessStartInfo的某些属性可能会让事情变得清晰。
动词 - 获取或设置打开FileName属性指定的应用程序或文档时要使用的动词。 + UseShellExecute - 获取或设置一个值,该值指示是否使用操作系统shell来启动进程。 + FileName - 获取或设置要启动的应用程序或文档MSDN Docs
当您使用操作系统shell启动进程时,您可以启动任何文档(与具有默认打开操作的可执行文件关联的任何已注册文件类型)并对文件执行操作(如打印),方法是使用Process对象。当UseShellExecute为false时,您只能使用Process对象Documentation from MSDN启动可执行文件。
就我而言,cmd
是可执行文件。动词属性是一个回答问题的东西"我应该如何运行我的FileName(对于可执行文件,例如cmd或任何应用程序)?"我回答了这个问题 - " runas"即以administrator
运行。当FileName
是一个文档(例如`someFile.txt)时,动词回答问题"我该怎么处理答案(动词)可能是什么文件 - "编辑&#34 ;,"打印"等等也?"
如果在启动进程时应该使用shell,则使用true;如果应该直接从可执行文件创建进程,则返回false。默认值为true MSDN Docs - UserShellInfo。
值得注意的另一件事是知道你想要实现的目标。在我的情况下,我希望能够通过可执行文件(cmd提示符)以相同的过程运行命令 - 即启动cmd
作为我可以跟踪的过程。