Подтвердить что ты не робот

Запустить процесс как администратор из приложения, отличного от администратора

Из приложения, которое не запускается как администратор, у меня есть следующий код:

ProcessStartInfo proc = new ProcessStartInfo();
proc.WindowStyle = ProcessWindowStyle.Normal;
proc.FileName = myExePath;
proc.CreateNoWindow = false;
proc.UseShellExecute = false;
proc.Verb = "runas";

Когда я вызываю Process.Start(proc), я не получаю всплывающее окно с запросом разрешения на запуск как администратор, а exe не запускается как администратор.

Я попробовал добавить app.manifest к исполняемому файлу, найденному в myExePath, и обновил requestExecutionLevel до

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

С обновленным app.manifest, в вызове Process.Start(proc), я получаю исключение: "Запрошенная операция требует повышения".

Почему не выполняется действие .Verb, не устанавливающее права администратора?

Я тестирую стандарт Windows Server 2008 R2.

4b9b3361

Ответ 1

Вы должны использовать ShellExecute. ShellExecute - это единственный API, который знает, как запустить Consent.exe для повышения.

Пример (.NET) Исходный код

В С# способ, которым вы вызываете ShellExecute, - это использовать Process.Start вместе с UseShellExecute = true:

private void button1_Click(object sender, EventArgs e)
{
   ProcessStartInfo info = new ProcessStartInfo(@"C:\Windows\Notepad.exe");
   info.UseShellExecute = true;
   info.Verb = "runas";
   Process.Start(info);
}

Если вы хотите быть хорошим разработчиком, вы можете поймать, когда пользователь нажал Нет:

private void button1_Click(object sender, EventArgs e)
{
   const int ERROR_CANCELLED = 1223; //The operation was canceled by the user.

   ProcessStartInfo info = new ProcessStartInfo(@"C:\Windows\Notepad.exe");
   info.UseShellExecute = true;
   info.Verb = "runas";
   try
   {
      Process.Start(info);
   }
   catch (Win32Exception ex)
   {
      if (ex.NativeErrorCode == ERROR_CANCELLED)
         MessageBox.Show("Why you no select Yes?");
      else
         throw;
   }
}

Просмотр бонусов

  • UAC - Что. Как. Почему.. Архитектура UAC, объясняя, что CreateProcess не может выполнять возвышение, только создает процесс. ShellExecute - это тот, кто знает, как запустить Consent.exe, а Consent.exe - тот, кто проверяет параметры групповой политики.

Примечание. Любой код, выпущенный в общественное достояние. Не требуется атрибуция.