Почему / MANIFESTUAC: НЕТ работы? - PullRequest
4 голосов
/ 25 мая 2010

Windows 7, C ++, VS2008 У меня есть COM DLL, которая должна быть зарегистрирована с помощью «администратора runas» (это устаревшее приложение, которое пишет в реестр) DLL используется приложением отчетов, которое создает его с помощью CoCreateInstance. Это не удалось, если я не запустил приложение отчетов от имени администратора; пока я не изменил настройку компоновщика с / MANIFESTUAC на / MANIFESTUAC: NO

Может кто-нибудь сказать мне, почему это работает? Означает ли это, что я могу писать приложения, которые обходят UAC, используя этот параметр?

1 Ответ

4 голосов
/ 25 мая 2010

Если у вашего приложения установщика / регистратора есть манифест, и он говорит «не запускать с повышенными правами», то при попытке записи в HKLM это не удастся. Если у вас есть манифест с надписью «запустить с повышенными правами», то при попытке записи в HKLM он завершится успешно. Если у вас нет манифеста (который вы запрашиваете с помощью / MANIFESTUAC: NO), при попытке записи в HKLM он записывает вместо этого в виртуализированное местоположение.

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

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

...