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

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

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"; но это неКажется, я решил проблему.

Ответы на вопрос(5)

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

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

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

 cwa30 мар. 2011 г., 20:45
У тебя нетЯ сказал, как получить accessToken. LogonUser предоставит пользователюОграниченный контекст безопасности, когда включен контроль учетных записей.
[PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")]

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

 hB022 сент. 2015 г., 11:30
ВозможноЕсли работающий пользователь является членом Admin "*
 Leonardo21 сент. 2015 г., 20:57
Используя этот код, я получаю ошибку разрешения: «Запрос на разрешение объекта безопасности не выполнен ". :(
 Simon_Weaver17 апр. 2017 г., 12:22
интересно - это может быть любой метод, а не только метод действия (я даже попробовал его на методе, определенном на странице ASPX)

Этот код объединяет все вышеперечисленное и перезапускает текущее приложение 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 не был запущен и в определенных условиях гонки это сделало бы это.

 JCCyC11 сент. 2014 г., 00:20
Смотрите ниже для улучшения.
 DotNetPadawan25 янв. 2019 г., 21:02
Это сработало для меня. Я также прошел оригиналstring[] args к возрожденному процессу.
 chris18 нояб. 2015 г., 04:16
requireAdministrator не работает в моем случае. Поэтому я должен был сделать это по-своему. Это решило мою проблему! благодарю вас. Но мне пришлось установить для Single Instance Application значение false.

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

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

 Dirk Vollmar03 апр. 2009 г., 14:42
Спасибо, это был единственный способ заставить его работать.
Решение Вопроса

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

startInfo.Verb = "runas";

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

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

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

 Colton11 мар. 2013 г., 17:32
@ LukePuplett I 'буду благодарен им. Это'Это отличный способ смягчить установку руткитов без фактического разделения ролей пользователей.
 Dirk Vollmar03 апр. 2009 г., 14:43
беги как" А не было»у меня тоже не работает. Может быть, он работает только с выключенным UAC?
 Basic25 мар. 2015 г., 10:49
@Jet Извините, но этоэто неправильное мышление. Каждый раз, когда во время установки отображается диалоговое окно UAC,сбой системы. Где это'Ценно, когда вы видите блок UAC без запуска чего-либо, требующего повышения прав. Безразлично»не важно, как вы - любой из нас - думаете, что мы на наших ПК, вы можете• магически блокирует ноль дней / загрузок с диска (например, недавний на официальном сайте Нобелевской премии). Если вы зашли на этот сайт и получили приглашение UAC, вы 'Я знаю, что было что-то не так. С выключенным UAC выникогда не узнаю, что ты только что присоединился к ботнету. Стоимость предварительного предупреждения иногда приходится нажимать Да
 user56586922 сент. 2014 г., 21:29
@TCC: эта проблема обсуждается вstackoverflow.com/questions/3596259/...
 Despertar26 янв. 2013 г., 01:17
Похоже, что это не работает в Windows 8. Отлично работало на предыдущих версиях.
 Mark Allen02 апр. 2013 г., 00:06
Я только что попробовал это (.Verb = "беги как", не встраивание манифеста) впервые сегодня, и он работал, как ожидалось, на Windows 8 Enterprise. Может быть, это связано с тем, что версия .NET выповторно используете? Мое случилось с целью .NET 3.5.
 Fandi Susanto10 нояб. 2016 г., 06:08
Нет ... не сработало. Я'м с использованием Windows 10.
 Johnny_D17 апр. 2012 г., 16:04
Мне помогло, интересно, работает ли это для всех ОС Windows?
 Kiquenet22 авг. 2014 г., 13:22
Я пытаюсь использовать UseShellExecute = false; Глагол = "беги как"; RedirectStandardInput = true; Домен = du [0]; UserName = UserAdministrator; Password = SecureStringHelper.ToSecureString (pwd); LoadUserProfile = true; И используя требуемыйExectionLevel в манифесте. Если я использую UseShellExecute = true; Я получаю сообщение об ошибке. Объект Process должен иметь для свойства UseShellExecute значение false, чтобы запустить процесс как пользователь.
 Jet27 мар. 2013 г., 21:14
@ Sparksis, но естьЭто также другая точка зрения. Люди, которые знают, как защитить свою ОС, знают, как это сделать без UAC. И фиктивные пользователи, которые нене знаю чтозащита, они щелкаютДА' каждый раз, когда они видят окно UAC. Также ничто не может помешать злоумышленникам-вирусописателям использовать эксплойты, чтобы обойти это;) Поэтому я согласен с LukePuplett =)
 Luke Puplett26 мар. 2013 г., 12:46
@ Sparksis Нет, это не так. И другой ужасныйизобретение' был заблокирован .zip файлы извлекаются в бесполезные заблокированные файлы.
 TCC27 сент. 2013 г., 16:53
Похоже, вы должны установитьstartInfo.ShellExecute=true а для того, чтобы это работало ... также я неЯ не смог заставить этот метод работать с исполняемыми файлами, находящимися в общей сетевой папке (перед запуском нужно скопировать их в локальный временный каталог) ...

Ваш ответ на вопрос