Я новичок в С#, и у меня есть 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(); //
}
}
Это то, что я сделал для преодоления этой проблемы, и дал мне именно то, что я хотел. Я изменил свой код, чтобы использовать 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();
Referrence: 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., +The UseShellExecute - возвращает или задает значение, указывающее, следует ли использовать оболочку операционной системы для запуска процесса. +The FileName - возвращает или устанавливает приложение или документ для запуска документов MSDN.
Когда вы используете оболочку операционной системы для запуска процессов, вы можете запустить любой документ (который является любым зарегистрированным типом файла, связанным с исполняемым файлом, который имеет действие по умолчанию для открытого действия) и выполнять операции над файлом, такие как печать, с помощью объекта Process, Когда UseShellExecute является ложным, вы можете запускать только исполняемые файлы, используя Document объекта Process из MSDN.
В моем случае cmd
является исполняемым. свойство глагола - это что-то, что отвечает на вопрос "Как мне запустить мое имя файла (для исполняемых файлов, например, cmd или любое приложение)?" за что я ответил - "runas", т.е. запускается как administrator
. Когда FileName
документ (например, "Somefile.txt), глагол отвечает на вопрос: „Что я должен делать с файлом, для которого ответ (глагол) может быть -“?„ И т.д., также „Edit“,“печать
используйте true, если оболочку следует использовать при запуске процесса; false, если процесс должен быть создан непосредственно из исполняемого файла. Значение по умолчанию - это истинные документы MSDN - UserShellInfo.
Еще одно замечание - знать, чего вы пытаетесь достичь. В моем случае я хочу иметь возможность запускать команды через исполняемый файл (приглашение cmd) с тем же процессом, то есть запускать cmd
как процесс, который я могу отслеживать.
UseShellExecute = False
НЕ работает с Verb = "runas"
. Посмотрите этот ТАК вопрос по этому вопросу
&&
?