Я не верю, что можно улучшить текущий процесс. Насколько я понимаю, в Windows Vista встроены права администратора, которые предоставляются процессу при запуске. Если вы посмотрите на различные программы, использующие UAC, вы увидите, что они фактически запускают отдельный процесс каждый раз, когда необходимо выполнить административное действие (диспетчер задач - это одно, Paint.NET - другое, последнее фактически является приложением .NET. ).
Типичным решением этой проблемы является указание аргументов командной строки при запуске процесса с повышенными правами (предложение Абатищева - один из способов сделать это), чтобы запущенный процесс знал только, чтобы отобразить определенное диалоговое окно, а затем выйти после того, как это действие было выполнено. завершено. Таким образом, пользователю вряд ли должно быть заметно, что новый процесс был запущен, а затем завершен, и скорее будет выглядеть так, как если бы было открыто новое диалоговое окно в том же приложении (особенно если вы взломали, чтобы сделать главное окно повышенный процесс, дочерний по отношению к родительскому процессу). Если вам не нужен пользовательский интерфейс для повышенного доступа, даже лучше.
Для полного обсуждения UAC в Vista я рекомендую вам просмотреть эту статью по этому вопросу (примеры кода приведены на C ++, но я подозреваю, что вам нужно будет использовать WinAPI и P / Invoke, чтобы делать большинство вещей на C #. так или иначе). Надеюсь, теперь вы, по крайней мере, видите правильный подход, хотя разработка программы, совместимой с UAC, далеко не тривиальная задача ...
Как уже было сказано там :
Process.StartInfo.UseShellExecute = true; Process.StartInfo.Verb = "runas";
запустит процесс от имени администратора, чтобы делать с реестром все, что вам нужно, но вернется в приложение с обычными привилегиями.
источник
Следующая статья базы знаний MSDN 981778 описывает, как «самостоятельно поднять» приложение:
http://support.microsoft.com/kb/981778
Он содержит загружаемые образцы на Visual C ++, Visual C #, Visual Basic.NET.
Этот подход позволяет избежать необходимости запускать отдельный процесс, но на самом деле перезапускается исходное приложение, работающее от имени пользователя с повышенными привилегиями. Тем не менее, это может быть очень полезно в некоторых контекстах, где нецелесообразно дублировать код в отдельном исполняемом файле.
Чтобы убрать возвышение, нужно выйти из приложения.
источник
Вам понадобится прозвище UAC и код для запуска с повышенными правами как COM-объект.
См. Этот вопрос.
Документация на MSDN.
источник
Возможно, кому-то пригодится такой простой пример:
using System; using System.Linq; using System.Reflection; using System.Diagnostics; using System.Security.Principal; using System.Windows.Forms; namespace WindowsFormsApp1 { internal static class Program { private class Form1 : Form { internal Form1() { var button = new Button{ Dock = DockStyle.Fill }; button.Click += (sender, args) => RunAsAdmin(); Controls.Add(button); ElevatedAction(); } } [STAThread] internal static void Main(string[] arguments) { if (arguments?.Contains("/run_elevated_action") == true) { ElevatedAction(); return; } Application.Run(new Form1()); } private static void RunAsAdmin() { var path = Assembly.GetExecutingAssembly().Location; using (var process = Process.Start(new ProcessStartInfo(path, "/run_elevated_action") { Verb = "runas" })) { process?.WaitForExit(); } } private static void ElevatedAction() { MessageBox.Show($@"IsElevated: {IsElevated()}"); } private static bool IsElevated() { using (var identity = WindowsIdentity.GetCurrent()) { var principal = new WindowsPrincipal(identity); return principal.IsInRole(WindowsBuiltInRole.Administrator); } } } }
источник
Я знаю, что это старый пост, но это ответ всем, кто сталкивается с предложением MarcP. Сообщение msdn, на которое он ссылается, действительно перезапускает приложения во всех примерах кода. В примерах кода используется
runas
глагол, уже предложенный в других предложениях.Я загрузил код, чтобы убедиться, но это из исходной статьи msdn:
источник