Повышение привилегий процесса программно?
Я пытаюсь установить службу с помощью 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();
Или вместо того, чтобы создавать задачу вручную, вы можете создать ее программно (требуется единоразовое повышение прав), а затем запустить ее без нее.