Выполнение команд cmd с правами администратора
Как я могу запустить команду **cd..**
за кулисами Windows Form? (т.е. пользователь не видит его)
Благодарю.
Ответы
Ответ 1
См. System.Diagnostics.Process http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx
Существует также этот ответ SO на тот же самый точный вопрос: fooobar.com/questions/16630/...
Пример:
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/C copy /b Image1.jpg + Archive.rar Image2.jpg";
startInfo.Verb = "runas";
process.StartInfo = startInfo;
process.Start();
Ответ 2
Вы можете инициализировать новую System.Diagnostics.ProcessStartInfo
которая имеет информацию, необходимую для запуска вашего процесса, в дополнение к WindowStyle
которая указывает состояние окна, которое будет использоваться при запуске процесса, который может быть Hidden
, Maximized
, Minimized
или Normal
. В вашем случае мы будем устанавливать это как " Hidden
чтобы процесс, который будет запущен, не сможет получить ни вход, ни показ вывода от пользователя.
пример
System.Diagnostics.ProcessStartInfo myProcessInfo = new System.Diagnostics.ProcessStartInfo(); //Initializes a new ProcessStartInfo of name myProcessInfo
myProcessInfo.FileName = Environment.ExpandEnvironmentVariables("%SystemRoot%") + @"\System32\cmd.exe"; //Sets the FileName property of myProcessInfo to %SystemRoot%\System32\cmd.exe where %SystemRoot% is a system variable which is expanded using Environment.ExpandEnvironmentVariables
myProcessInfo.Arguments = "cd.."; //Sets the arguments to cd..
myProcessInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; //Sets the WindowStyle of myProcessInfo which indicates the window state to use when the process is started to Hidden
System.Diagnostics.Process.Start(myProcessInfo); //Starts the process based on myProcessInfo
Скриншот
Следующий скриншот представляет диспетчер задач, показывающий один процесс, который был запущен нашим приложением. Однако его Окно не видно.
![The process is running without showing its Window]()
Примечание. Запуск процесса не прекратится, даже если вы закроете приложение.
Кроме того, для запуска процесса в качестве администратора вы можете установить свойство Verb
для информации о запуске процесса для runas
пример
System.Diagnostics.ProcessStartInfo myProcessInfo = new System.Diagnostics.ProcessStartInfo(); //Initializes a new ProcessStartInfo of name myProcessInfo
myProcessInfo.FileName = Environment.ExpandEnvironmentVariables("%SystemRoot%") + @"\System32\cmd.exe"; //Sets the FileName property of myProcessInfo to %SystemRoot%\System32\cmd.exe where %SystemRoot% is a system variable which is expanded using Environment.ExpandEnvironmentVariables
myProcessInfo.Arguments = "cd.."; //Sets the arguments to cd..
myProcessInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; //Sets the WindowStyle of myProcessInfo which indicates the window state to use when the process is started to Hidden
myProcessInfo.Verb = "runas"; //The process should start with elevated permissions
System.Diagnostics.Process.Start(myProcessInfo); //Starts the process based on myProcessInfo
Примечание. Если у вас включен элемент управления учетными записями пользователей, вы можете попросить разрешить запуск процесса с повышенными разрешениями, если приложение, которое пыталось вызвать этот процесс, не выполнялось с повышенными разрешениями.
Если вы хотите пропустить приглашение, я думаю, что вы должны разрешить основному приложению начинать с повышенных разрешений. Для этого вам нужно открыть манифест приложения и убедиться, что добавлена следующая строка
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
Это просто скажет, что ваше приложение запускается только с повышенными разрешениями. Таким образом, когда вы вызываете процесс как администратор, не будет приглашения, так как вызывающий процесс выполняется под администратором.
Благодаря,
Надеюсь, вы найдете это полезным :)
Ответ 3
Фрагмент "невидим" для пользователя, а также перенаправляет вывод, чтобы вы могли его каким-то образом использовать (я полагаю, вам это нужно).
string output = null;
try
{
ProcessStartInfo ps = new ProcessStartInfo("cmd");
ps.Arguments = "/c cd..";
ps.UseShellExecute = false;
// Redirects the standard output so it reads internally in out program
ps.RedirectStandardOutput = true;
// Starts the process
using (Process p = Process.Start(ps))
{
// Reads the output to a string
output = p.StandardOutput.ReadToEnd();
// Waits for the process to exit must come *after* StandardOutput is "empty"
// so that we don't deadlock because the intermediate kernel pipe is full.
p.WaitForExit();
}
}
catch
{
// manage errors
}
finally
{
if(output != null)
{
// Process your output
}
}