Я пытаюсь установить службу с помощью InstallUtil.exe, но вызывается через Process.Start
. Вот код:
ProcessStartInfo startInfo = new ProcessStartInfo (m_strInstallUtil, strExePath);
System.Diagnostics.Process.Start (startInfo);
где m_strInstallUtil
- полный путь и исполняемый файл «InstallUtil.exe», а strExePath
также полный путь / имя моей службы.
Запуск синтаксиса командной строки из командной строки с повышенными правами работает; Запуск из моего приложения (с использованием вышеуказанного кода) не. Я предполагаю, что имею дело с какой-то проблемой повышения прав, так как мне запустить мой процесс с повышенными правами? Нужно ли смотреть на ShellExecute
это?
Это все в Windows Vista. Я запускаю процесс в отладчике VS2008 с повышенными правами администратора.
Я также попытался установить, startInfo.Verb = "runas";
но это, похоже, не решило проблему.
c#
.net
windows
windows-services
process-elevation
Скотт Марлоу
источник
источник
startInfo.UseShellExecute = true;
в дополнение кstartInfo.Verb = "runas";
этому работал нормально для меня.Ответы:
Вы можете указать, что новый процесс должен быть запущен с повышенными разрешениями, установив для свойства Verb вашего объекта startInfo значение runas, как показано ниже:
Это приведет к тому, что Windows будет вести себя так, как если бы процесс был запущен из Проводника с помощью команды меню «Запуск от имени администратора».
Это означает, что появится запрос UAC, и пользователь должен будет его подтвердить: если это нежелательно (например, потому что это может произойти в середине длительного процесса), вам необходимо запустить весь хост-процесс с повышенные разрешения для создания и встраивания манифеста приложения (UAC), требующие «наивысшего доступного» уровня выполнения: это приведет к тому, что приглашение UAC появится, как только ваше приложение будет запущено, и заставит все дочерние процессы запускаться с повышенными разрешениями без дополнительных запросов ,
Редактировать: Я вижу, вы только что отредактировали свой вопрос, чтобы заявить, что "runas" не работает для вас. Это действительно странно, как и должно быть (и делает для меня в нескольких производственных приложениях). Требование выполнения родительского процесса с повышенными правами путем встраивания манифеста, безусловно, должно работать.
источник
startInfo.ShellExecute=true
чтобы это работало ... также я не смог заставить этот метод работать с исполняемыми файлами, находящимися в общем сетевом ресурсе (нужно скопировать их в локальный временный каталог перед запуском). ..Этот код объединяет все вышеперечисленное и перезапускает текущее приложение wpf с правами администратора:
Обновление: способ манифеста приложения является предпочтительным:
Щелкните правой кнопкой мыши проект в Visual Studio, добавьте, новый файл манифеста приложения, измените файл так, чтобы вы установили requireAdministrator, как показано выше.
Проблема с оригинальным способом: если вы поместите код перезапуска в app.xaml.cs OnStartup, он все равно может ненадолго запустить главное окно, даже если было вызвано завершение работы. Мое главное окно лопнуло, если бы app.xaml.cs init не был запущен и в определенных условиях гонки это сделало бы это.
источник
string[] args
в новый процесс.В соответствии со статьей Крис Корио: научите свои приложения хорошо играть с управлением учетными записями пользователей Windows Vista, журнал MSDN, январь 2007 г. , только
ShellExecute
проверяет встроенный манифест и запрашивает повышение прав у пользователей, если это необходимо,CreateProcess
а другие API этого не делают. Надеюсь, поможет.Смотрите также: та же статья, что и .chm .
источник
Это будет сделано без UAC - не нужно начинать новый процесс. Если работающий пользователь является членом группы администраторов, как в моем случае.
источник
Вы должны использовать Олицетворение, чтобы поднять государство.
Не забудьте отменить олицетворенный контекст, когда закончите.
источник