Выполнение команд 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
}
}