Повышение привилегий процесса программно?

Я пытаюсь установить службу с помощью InstallUtil.exe, но вызывается через Process.Start, Вот код:

ProcessStartInfo startInfo = new ProcessStartInfo (m_strInstallUtil, strExePath);
System.Diagnostics.Process.Start (startInfo);

где m_strInstallUtil это полный путь и exe к "InstallUtil.exe" и strExePath это полный путь / имя моего сервиса.

Запуск синтаксиса командной строки из командной строки с повышенными правами работает; Запуск из моего приложения (с использованием вышеуказанного кода) не. Я предполагаю, что имею дело с какой-то проблемой повышения прав, так как мне запустить мой процесс с повышенными правами? Нужно ли смотреть на ShellExecute за это?

Это все в Windows Vista. Я запускаю процесс в отладчике VS2008 с повышенными правами администратора.

Я тоже пробовал настройку startInfo.Verb = "runas"; но это, похоже, не решило проблему.

7 ответов

Решение

Вы можете указать, что новый процесс должен быть запущен с повышенными правами, установив для свойства Verb объекта startInfo значение runas, как показано ниже:

startInfo.Verb = "runas";

Это приведет к тому, что Windows будет вести себя так, как будто процесс был запущен из Проводника с помощью команды меню "Запуск от имени администратора".

Это означает, что появится запрос UAC, и пользователь должен будет его подтвердить: если это нежелательно (например, потому что это может произойти в середине длительного процесса), вам нужно будет запустить весь хост-процесс с повышенные разрешения для создания и встраивания манифеста приложения (UAC), требующие "наивысшего доступного" уровня выполнения: это приведет к тому, что приглашение UAC появится, как только ваше приложение будет запущено, и заставит все дочерние процессы запускаться с повышенными разрешениями без дополнительных запросов,

Редактировать: Я вижу, вы только что отредактировали свой вопрос, чтобы заявить, что "runas" не работает для вас. Это действительно странно, как и должно (и делает для меня в нескольких производственных приложениях). Требование выполнения родительского процесса с повышенными правами путем встраивания манифеста, безусловно, должно работать.

Этот код объединяет все вышеперечисленное и перезапускает текущее приложение wpf с правами администратора:

if (IsAdministrator() == false)
{
    // Restart program and run as admin
    var exeName = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
    ProcessStartInfo startInfo = new ProcessStartInfo(exeName);
    startInfo.Verb = "runas";
    System.Diagnostics.Process.Start(startInfo);
    Application.Current.Shutdown();
    return;
}

private static bool IsAdministrator()
{
    WindowsIdentity identity = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(identity);
    return principal.IsInRole(WindowsBuiltInRole.Administrator);
}


// To run as admin, alter exe manifest file after building.
// Or create shortcut with "as admin" checked.
// Or ShellExecute(C# Process.Start) can elevate - use verb "runas".
// Or an elevate vbs script can launch programs as admin.
// (does not work: "runas /user:admin" from cmd-line prompts for admin pass)

Обновление: способ манифеста приложения является предпочтительным:

Щелкните правой кнопкой мыши проект в Visual Studio, добавьте, новый файл манифеста приложения, измените файл так, чтобы вы установили requireAdministrator, как показано выше.

Проблема с оригинальным способом: если вы поместите код перезапуска в app.xaml.cs OnStartup, он все равно может ненадолго запустить главное окно, даже если было вызвано завершение работы. Мое главное окно лопнуло, если бы app.xaml.cs init не был запущен, и в определенных условиях гонки он это сделал.

В соответствии со статьей Крис Корио: научите свои приложения хорошо играть с управлением учетными записями пользователей Windows Vista, только журнал MSDN, январь 2007 г. ShellExecute проверяет встроенный манифест и при необходимости запрашивает у пользователя повышение прав CreateProcess а другие API нет. Надеюсь, поможет.

Смотрите также: та же статья, что и.chm.

[PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")]

Это будет сделано без UAC - не нужно начинать новый процесс. Если запущенный пользователь является членом группы Admin, как в моем случае.

я знаю, что это очень старый пост, но я просто хотел поделиться своим решением:

      System.Diagnostics.ProcessStartInfo StartInfo = new System.Diagnostics.ProcessStartInfo
{
    UseShellExecute = true, //<- for elevation
    Verb = "runas",  //<- for elevation
    WorkingDirectory = Environment.CurrentDirectory,
    FileName = "EDHM_UI_Patcher.exe",
    Arguments = @"\D -FF"
};
System.Diagnostics.Process p = System.Diagnostics.Process.Start(StartInfo);

ПРИМЕЧАНИЕ. Если VisualStudio уже работает с повышенными правами, диалоговое окно UAC не появится, чтобы проверить его, запустите exe из папки bin.

Вы должны использовать Олицетворение, чтобы поднять государство.

WindowsIdentity identity = new WindowsIdentity(accessToken);
WindowsImpersonationContext context = identity.Impersonate();

Не забудьте отменить олицетворенный контекст, когда закончите.

Существует альтернативный способ запуска процесса, требующего повышения прав, без необходимости повышения прав родительского процесса с помощью окон.Task Scheduler. По сути, вы вручную создаете задачу и проверяетеRun with highest privilegesвGeneralвкладка. Эту задачу можно запустить программно с помощью библиотеки планировщика задач.

Примечание. Невозможно динамически создать такую ​​задачу, поскольку для этого потребуется повышение прав вашего процесса.

С помощью библиотеки TaskScheduler поиск и запуск задачи выглядит следующим образом:

      TaskService.Instance.RootFolder.AllTasks
        .FirstOrDefault(x => x.Name == "My elevated Task").Run();

Или вместо того, чтобы создавать задачу вручную, вы можете создать ее программно (требуется единоразовое повышение прав), а затем запустить ее без нее.

Другие вопросы по тегам