2016-01-30 6 views
0

Я работаю над приложением (Windows XP и 7 - не спрашивайте!;)) Для области уведомлений панели задач. Он запускается с учетных записей пользователей и администраторов и обычно не требует повышенного разрешения, я также не хочу беспокоить каждого пользователя диалоговым окном UAC при запуске приложения.Windows7: Подъемные разрешения для одного вызова

Теперь я хотел бы интегрировать один вызов (запись в реестр, HKLM), требующий повышенных разрешений, и мне интересно узнать о лучшей стратегии для реализации этого (в данном случае в Delphi) для Windows 7+?

Я видел программы, называющие себя с повышенным разрешением и параметром (Delphi: Prompt for UAC elevation when needed) - но есть ли лучший способ сделать это?

+0

Зачем вам нужно писать в HKLM, который всегда требует администратора? Можете ли вы не писать в HKCU вместо этого? –

+0

HKLM требуется, потому что это общесистемная настройка. – LeRookie

+0

Если это системная настройка, она должна быть записана установщиком (который потребует прав администратора для запуска) во время установки. –

ответ

2

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

Когда вам нужно выполнить повышенные задачи, запустите новый процесс, вызвав ShellExecuteEx с помощью глагола runas. Укажите задачи, которые необходимо выполнить в командной строке процесса.

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

+2

Это один из способов сделать это, и, откровенно говоря, это самый простой способ, но это не единственный способ. Другим способом является выполнение желаемых задач администрирования внутри COM-объекта, которые затем может быть создано приложением с помощью [COM Elevation Moniker] основного приложения (https://msdn.microsoft.com/en-us/library/windows/desktop/) ms679687.aspx). Таким образом, вам не нужно создавать отдельный процесс. –

+1

@Remy Вы действительно порождаете другой процесс. COM-сервер работает в отдельном процессе. –

+0

ОК, позвольте мне повторить фазу: «Таким образом, вам не нужно явно и вручную не создавать отдельный процесс. Основное приложение может использовать и связываться с COM-объектом, как и любой другой COM-объект». –