Как заставить пользователя использовать учетную запись администратора в WinForms - PullRequest
6 голосов
/ 21 апреля 2010

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

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

В лучшем случае можно было бы получить точно такое же сообщение, которое появляется в лоте Настроек, когда пользователю нужно «переключиться» на Администратора, чтобы не было необходимости запускать как администратор с начала формы.

Как мне добиться этого в .Net?

Ответы [ 3 ]

4 голосов
/ 21 апреля 2010

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

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

2 голосов
/ 21 апреля 2010

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

<requestedExecutionLevel level="requireAdministrator"/>
1 голос
/ 21 апреля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...