У меня есть простое приложение WinForms где изменение Windows Registry. Проблема состоит в том, что в Vista / Windows 7 I должен вынудить пользователя переключиться на администратора.
Я не хочу вынуждать пользователя Работать, поскольку форма Администратора запускается приложения. Я хочу, чтобы он сделал это, когда существует необходимость записать в реестр.
Лучший вариант развития событий должен был бы достигнуть exacly то же сообщение, которые появляются в партии Установок, когда пользователь должен 'переключиться' на Администратора, таким образом, нет никакой необходимости Работать как начало формы Администратора.
Как я могу достигнуть этого в .NET?
Разбиение на разделы - это правильный вариант, если приложение иногда не выполняет функции реестра, а иногда делает. Три ключа к разделению: (1) иметь манифест на втором exe, как говорит Хо, (2) поставить щит на кнопку / пункт меню, чтобы пользователь ожидал повышения, и (3) запустить его с помощью ShellExecute (до вызывая Start, установите для UseShellExecuteFlag значение true), чтобы использовать манифест.
Однако, прежде чем приступить к разделению вашего приложения, я хотел бы задать два вопроса. Во-первых, используется ли он когда-либо для неадминистративных целей или каждый пользователь всегда «нажимает эту кнопку» и ему нужно повысить уровень? Если да, то просто поместите в приложение манифест администратора и не разбивайте его на части. Во-вторых, вам обязательно нужно писать в эту часть реестра? Не могли бы вы перенести свой ключ на что-нибудь под HKCU? Если можете, тогда вам больше не нужно возвышение, и все будут счастливее. Мне всегда нравится в первую очередь рассматривать эти возможности, поскольку они означают меньше кода и меньше тестирования, чем разбиение.
Как говорит Ааронаут, я не думаю, что процесс может запросить повышение. Одним из способов решения этой проблемы является разделение процесса на два приложения, одно из которых является обычным, которое выполняет большую часть работы, а другое выполняет только запись в реестр, а у этого есть манифест, содержащий что-то вроде
<requestedExecutionLevel level="requireAdministrator"/>
Насколько мне известно, нет API для повышения уровня процесса. Это происходит автоматически, когда процесс пытается запустить другой процесс в повышенном режиме.
То же самое работает с установщиком Windows. Я не уверен, запускает ли он буквально другой процесс с повышенными правами или просто создает COM-объект с повышенными правами, но фактически это одно и то же.
Я лично не стал бы прибегать к этому хакерскому обходному пути, чтобы улучшить ваш процесс в середине выполнения; Если ваш процесс может требовать повышения прав, сделайте это явным образом с помощью манифеста и позвольте сообщению о согласии появляться при запуске. Но если вам абсолютно необходимо это сделать, то вот как - вам нужно запустить процесс с повышенными правами из своего приложения.