Предоставление приложения повышенного UAC

У меня есть приложение, которое требует повышения UAC.

У меня есть код, который позволяет мне дать это, но приложение открывается дважды. В чем проблема.

поэтому вот код в Form1:

public Form1() { InitializeComponent(); WindowsPrincipal pricipal = new WindowsPrincipal(WindowsIdentity.GetCurrent()); bool hasAdministrativeRight = pricipal.IsInRole(WindowsBuiltInRole.Administrator); if (!hasAdministrativeRight) { ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.UseShellExecute = true; startInfo.WorkingDirectory = Environment.CurrentDirectory; startInfo.FileName = Application.ExecutablePath; startInfo.Verb = "runas"; try { Process p = Process.Start(startInfo); } catch (System.ComponentModel.Win32Exception ex) { return; } } } 

и это код program.cs

  static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } 

при отладке я узнаю, что сначала он выполняет

Процесс p = Process.Start (startInfo);

который открывает диалоговое окно повышения UAC приложения, а затем открывает приложение

но затем он переходит к

Application.Run (новый Form1 ());

в main () и снова откроет приложение.

я не хочу, чтобы он снова открывал приложение …

Я новичок в этом, я что-то делаю неправильно, и мне нужно закрыть UAC после его открытия.

благодаря

Вам не нужно вмешиваться во все это, чтобы убедиться, что ваше приложение всегда работает с повышенными привилегиями. Вы можете просто добавить манифест приложения, в котором указывается, что Windows будет работать над вашим приложением, а приглашение UAC появится без необходимости писать одну строку кода.

Есть вопрос, связанный с ответом, который также описывает, как добавить манифест здесь: как я могу вставить манифест приложения в приложение с помощью VS2008?

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

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

Это гораздо лучший подход, когда ваше приложение, как известно, требует прав администратора с самого начала.

Переместите код WindowsPrincipal из формы в Program.cs, как показано в примере ниже. Это вызовет у пользователя полномочия UAC перед запуском любых форм и только запустит форму, если полномочия UAC были предоставлены.

  static void Main() { WindowsPrincipal pricipal = new WindowsPrincipal(WindowsIdentity.GetCurrent()); bool hasAdministrativeRight = pricipal.IsInRole(WindowsBuiltInRole.Administrator); if (!hasAdministrativeRight) { ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.UseShellExecute = true; startInfo.WorkingDirectory = Environment.CurrentDirectory; startInfo.FileName = Application.ExecutablePath; startInfo.Verb = "runas"; try { Process p = Process.Start(startInfo); Application.Exit(); } catch (System.ComponentModel.Win32Exception ex) { MessageBox.Show("This utility requires elevated priviledges to complete correctly.", "Error: UAC Authorisation Required", MessageBoxButtons.OK); // Debug.Print(ex.Message); return; } } else { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } 

Существует пример от Microsoft, который демонстрирует, как проверить уровень привилегий текущего процесса и как самоподнять процесс, давая явное согласие с пользовательским интерфейсом согласия.

Самонастройка UAC (CSUACSelfElevation)

  • Скрыть кнопки TabControl для управления сложными панелями
  • Как запустить приложение WinForm сведено к минимуму?
  • как изменить цвет заголовка Winform DataGridview?
  • Создание контроля прозрачным
  • контекстное меню правой кнопки мыши для datagridview
  • C # winforms combobox динамический автозаполнение
  • Как нарисовать пользовательскую кнопку в окне заголовка windows с помощью Windows Forms?
  • Показать дочернюю форму в центре родительской формы в C #
  • Цвет фона элемента ListBox (winforms)
  • TabControl с кнопкой Close и Add
  • Как правильно выйти из приложения C #?
  • Interesting Posts

    Лучший подход для GPGPU / CUDA / OpenCL в Java?

    Вычислить медианную в c #

    Должен ли я Dispose () DataSet и DataTable?

    Какие функции обертки стандартной библиотеки C ++ вы используете?

    Фильтр намерений Android: связать приложение с расширением файла

    Как делиться одними и теми же данными между несколькими действиями

    Как опубликовать представление / преобразование коллекции в Meteor?

    Программируемая версия подмножества – для оценки ее состояния при вызове из другой функции

    Есть ли способ использовать GeoFire с Firestore?

    Вирус дублировал учетную запись пользователя на XP?

    Почему использование назначить плохо?

    Прокрутка EditText внутри ScrollView

    Как отключить резерв SSL и использовать только TLS для исходящих подключений в .NET? (Смягчение пуделя)

    Как загрузить Windows 10 1511 ISO без использования средства создания носителя?

    Почему локальное хранилище сертификатов отсутствует в Windows 8.1?

    Давайте будем гением компьютера.