Как Windows 7 определяет, нужны ли вам права администратора? (Vc60)

Проблема: Я пишу юнит-тесты для программы установки на С ++. Для установки требуются права администратора, а для юнит-тестов — нет. При запуске тестов меня просят запустить тест / программу от имени администратора.

Это начало происходить, когда я включил rc-файл исходного проекта.

Редактировать: Я обновлял этот проект до VS2010, но все еще использую vc60, поэтому нет поддержки манифеста. Это может быть связано.

2

Решение

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

(Другие люди говорят об эвристике, используемой для предположения, нужен ли программе доступ администратора, если у нее нет манифеста. Например, если у вас есть старая программа, созданная до того, как файлы манифеста стали обычными, ОС может попытаться угадать будь то установщик, ища определенные фразы, такие как «setup» в имени файла. Я полагаю, что есть и другие эвристики. Это взлом для старых программ, которые были написаны до того, как манифесты позволили явно заявить о необходимости доступа администратора .)

Вы можете решить вашу проблему, предоставив свой собственный манифест. Самый простой способ — это использовать /MANIFESTUAC опция компоновщика.

Если вы используете старый набор инструментов, вам, вероятно, придется создать файл манифеста самостоятельно и включить его в свои ресурсы.

Манифест представляет собой кусок XML. Важный бит для вас будет выглядеть примерно так:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0"  name="yourprogram.exe" type="win32"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>

Чтобы вставить это в ваши ресурсы, ваш файл .RC должен иметь:

1 RT_MANIFEST <filename>

Если ваш SDK настолько стар, что RT_MANIFEST не определено, вы можете определить это самостоятельно:

#define RT_MANIFEST 24
1

Другие решения

Одним из критериев оценки необходимых прав для приложения является имя.
Так что если имя содержит Слово «Настройка», вам будет предложено для прав администратора.

Кроме того, поскольку это началось с файла rc, еще одним критерием являются имена, записанные в файле rc в разделе «Версия». В моем случае в «VS_VERSION_INFO».
Следующие записи не должны содержать Настройка слова:

FileDescription
InternalName
OriginalFilename
ProductName

Вы можете изменить любое вхождение «Setup» на «Settup». Это помешало бы диалогу.
Даже если вы не сможете изменить это в «реальном» rc-файле.

1