четверг, февраля 12, 2009

Использование Vista UAC в Delphi: Часть 2

Оригинал.

Это вторая часть серии статей о UAC и Delphi, состоящей из трех частей.
Перейти к части 1.

Полное описание логики работы UAC выходит за рамки данной статьи. Здесь я собираюсь только обозначить несколько относящихся к делу моментов.

По сути, UAC это все об уровнях привилегий. По умолчанию, обычное Windows приложение не требует администраторских привилегий. Вот почему под Vista, даже административные аккаунты, не используют полный доступ по умолчанию. Цель нормального UAC-приложения – запуск с доступом определяемым текущим аккаунтом, и лишь при реальной необходимости запрашивать повышенные права доступа. Сам процесс запроса повышения прав называется повышение привилегий (privilege elevation), и он требует, что бы пользователь подтвердил действие, перед тем, как это действие будет выполнено. Запрос на повышение может быть представлен либо в форме простого диалога Продолжить/Отменить (режим одобрения Админом), либо полноценного диалога логина (пользователи должны явным образом ввести свои полномочия), в зависимости от типа текущего аккаунта и настроек безопасности. Существует еще пара вариаций запроса в зависимости от того используется ли исполняемым файлом цифровая подпись или нет.

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

Существуют различные способы дать возможность вашему приложению инициировать elevation диалог. Большинство из них, хотя и просты для реализации, однако не дают извлечь максимальную пользу. Я даже не знаю насколько можно их применять, так как они опираются на функции обратной совместимости Vista. В этой части я кратко опишу три из них.

Использование эвристики Vista.

Windows Vista имеет множество встроенных приемов для облегчения возможности поддержки UAC. Один из них фактически основывается на том, что инсталлеры и апдейтеры, как правило, вынуждены писать в защищенную директорию Programm Files и/или ветвь реестра HKLM. Vista распознает такие приложения с помощью эвристического метода определения и автоматически выводит elevation диалог, в тот момент, когда пользователь пытается выполнить их.

Есть целый ряд вещей, которые при этом проверяются, но я хотел бы отметить, единственную вещь, которую довольно легко реализовать и проверить – elevation диалог вызывается, если имя исполняемого файла или информация о его версии содержат такие строки, как, например, “settings”, “install” или “update”.

В результате, такой подход является весьма полезным для автоматического обновления приложений, которые, как правило, самостоятельно скачивают новую версию, а затем запускают внешние утилиты для замены старых файлов приложений. Если эта утилита названа примерно так: 'MyAppUpdater.exe' (и снабжена цифровой подписью), то приложения могут инициировать вызов красивого elevation диалога и запускать ее (утилиту) с полными правами доступа.

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

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

Выполнение от имени администратора.

Другим способом достижения того же результата является выбор опции "Выполнять эту программу от имени администратора" (Run this program as an administrator) на вкладке «Совместимость» в свойствах приложения. Обратная сторона медали будет та же, что и предыдущего подхода, приложение всегда будет выполняться с завышенными правами.

Манифест приложения.

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





Ключевой информацией здесь проявляется значение атрибута requestedExecutionLevel. Если атрибут примет значение "requireAdministrator", то это послужит сигналом для Vista отобразить elevation диалог в момент запуска приложения.

Предварительно, манифест может быть связан с исполняемым файлом, вам необходимо скомпилировать его в RES формате, используя следующий RC файл (я предполагаю, что вы достаточно знаете о файлах ресурсов и знаете что такое RC и RES файлы):

1 24 "UAC.manifest"


Где 1 – индекс ресурса, 24 – тип ресурса (RT_MANIFEST), и "UAC.manifest" – актуальное имя файла манифеста, который будет скомпилирован. Замечу, что вы можете использовать другой индекс ресурса, убедившись при этом, что отсутствуют совпадения с индексами других ресурсов, например XP манифестом.

Наконец, вы должны связать полученный RES файл с исполняемым файлом, используя директиву компилятора Delphi $R.

Такой подход имеет точно те же недостатки, сто и предыдущие. Он увеличивает права заранее, а не в случае необходимости.

OK, это был краткий обзор основ UAC совместимости. Теперь мы готовы вигаться в правильном направлении…

1 комментарий:

~AQUARIUS~ комментирует...

В предпоследнем абзаце опечатка:
...те же недостатки, сто и предыдущие