Как вынудить пользователя в пользовательскую учетную запись Администратора в WinForms

У меня есть простое приложение WinForms где изменение Windows Registry. Проблема состоит в том, что в Vista / Windows 7 I должен вынудить пользователя переключиться на администратора.

Я не хочу вынуждать пользователя Работать, поскольку форма Администратора запускается приложения. Я хочу, чтобы он сделал это, когда существует необходимость записать в реестр.

Лучший вариант развития событий должен был бы достигнуть exacly то же сообщение, которые появляются в партии Установок, когда пользователь должен 'переключиться' на Администратора, таким образом, нет никакой необходимости Работать как начало формы Администратора.

Как я могу достигнуть этого в .NET?

6
задан Paweł Smejda 21 April 2010 в 04:00
поделиться

3 ответа

Разбиение на разделы - это правильный вариант, если приложение иногда не выполняет функции реестра, а иногда делает. Три ключа к разделению: (1) иметь манифест на втором exe, как говорит Хо, (2) поставить щит на кнопку / пункт меню, чтобы пользователь ожидал повышения, и (3) запустить его с помощью ShellExecute (до вызывая Start, установите для UseShellExecuteFlag значение true), чтобы использовать манифест.

Однако, прежде чем приступить к разделению вашего приложения, я хотел бы задать два вопроса. Во-первых, используется ли он когда-либо для неадминистративных целей или каждый пользователь всегда «нажимает эту кнопку» и ему нужно повысить уровень? Если да, то просто поместите в приложение манифест администратора и не разбивайте его на части. Во-вторых, вам обязательно нужно писать в эту часть реестра? Не могли бы вы перенести свой ключ на что-нибудь под HKCU? Если можете, тогда вам больше не нужно возвышение, и все будут счастливее. Мне всегда нравится в первую очередь рассматривать эти возможности, поскольку они означают меньше кода и меньше тестирования, чем разбиение.

4
ответ дан 17 December 2019 в 00:06
поделиться

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

<requestedExecutionLevel level="requireAdministrator"/>
2
ответ дан 17 December 2019 в 00:06
поделиться

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

То же самое работает с установщиком Windows. Я не уверен, запускает ли он буквально другой процесс с повышенными правами или просто создает COM-объект с повышенными правами, но фактически это одно и то же.

Я лично не стал бы прибегать к этому хакерскому обходному пути, чтобы улучшить ваш процесс в середине выполнения; Если ваш процесс может требовать повышения прав, сделайте это явным образом с помощью манифеста и позвольте сообщению о согласии появляться при запуске. Но если вам абсолютно необходимо это сделать, то вот как - вам нужно запустить процесс с повышенными правами из своего приложения.

1
ответ дан 17 December 2019 в 00:06
поделиться