2015-04-14 2 views
2

Проблема: Я пишу unittests для программы установки в C++. Настройка требует прав администратора, но unittests этого не делают. При запуске тестов мне предлагается запустить тест/программу в качестве администратора.Как определяется Windows 7, если вам нужны права администратора? (vc60)

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

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

+1

Непонятная причина не сообщать нам, что содержит файл .rc. Но да, имея в нем манифест, который использует 'requireAdminstrator', является обычным способом запросить повышение UAC. –

+0

относительно ответа, это плохая часть: VALUE "FileDescription", "Модуль установки" VALUE "InternalName", "SETUP" VALUE "OriginalFilename", "setup.exe" VALUE "ProductName", «Модуль установки " нет такой вещи, как манифест, определенный здесь :) – TheTrowser

ответ

1

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

(Другие люди говорят об эвристике, используемой для определения того, нужна ли программе доступ администратора, если она не имеет манифеста. Например, если у вас есть старая программа, которая была сделана до того, как файлы манифеста были распространены, ОС может попытаться угадать, является ли это установщиком, ища определенные фразы типа «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

Одним из критериев оценки необходимых прав для приложения является имя. Итак, если имя содержит Word «Setup», вам будут предложены права администратора.

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

FileDescription 
InternalName 
OriginalFilename 
ProductName 

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

+4

Или вы можете добавить файл манифеста, который явно указывает Windows, независимо от того, выполняете ли вы или не требуете прав администратора. –

+1

Благодарим вас за эту информацию, если это правильно. Можете ли вы указать официальные документы, если таковые существуют? Предполагая, что информация верна, это почти не является безумным, а пользователь-враждебным, чтобы быть Microsoft, наверняка должно быть больше? –

+0

Я не нашел официальных историй, но выяснил, пытаясь. Хотя это может быть только проблема, если у вас нет поддержки явно, как и в этом случае. Здесь есть только комментарий: https://msdn.microsoft.com/en-us/library/bb384608.aspx – TheTrowser

Смежные вопросы