Разгадки Code Signing (окончательные)

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

Первая гипотеза была в том что UAC oчень умный и о чем-то таком догадывается. Похоже, это не мой случай - в моем тестовом окружении подписанная программа без слова Setup (Install, Update) в имени файла (и в детальной информации о файле - тоже) - все одно ругается лишним предупреждением.

А вот вторая - оказавшаяся правильной - идея была про манифест файла. И действительно, у моего инсталлятора в манифесте написано:

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
        <requestedPrivileges>
            <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
        </requestedPrivileges>
    </security>
</trustInfo>
А у "хорошего" ACDSee (равно как у Orfo, других не смотрел) прямо в манифесте требуются права администратора:
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
                <requestedPrivileges>
                        <requestedExecutionLevel
                                level="requireAdministrator"
                                uiAccess="false"/>
                </requestedPrivileges>
        </security>
</trustInfo>
Меняю в своем инсталляторе (о чем ниже) level на requireAdministrator и счастье достигается: инсталлятор в тестовом окружении стартует без лишнего предупреждения.

Как сайд-эффект, на иконке приложения появляется значок UAC, но это меньшее зло в сравнении с дополнительным предупреждением.

InnoSetup

С InnoSetup в этом месте засада, независимо от затребованных в описании инсталлятора прав (директива PrivilegesRequired) в манифест пишется asInvoked и никакого человеческого способа поменять это нету.

Нечеловеческий способ заключается в том, что надо бинарно попатчить файлы Setup.e32 и SetupLdr.e32 (в XML-ках, которые внутри этих файлов, любезно оставлено место для такого патча). Работает. Так и будем жить дальше.

Все вместе мне кажется каким-то безобразным артефактом: инсталлятор, который исходно не просит себе админских прав - запускается с дополнительным предупреждением. А если просит (прямо в манифесте) - без оного. Удивительное дело.

Comments

Заменить манифест (как и любой другой ресурс) можно с помощью старой доброй программы ResHack/. Разумеется, сработает это только если e32 это обычные PE EXE. Думаю, это более правильный (и человечный) способ, чем править бинарник в хекс-редакторе.

Hex-редактор сработал, а больше мне ничего и не надо.

Ну то есть надо, конечно, это место в InnoSetup доделать, но лень.

Ура!

А в InnoSetup явно баг :-(

Манифест ещё можно mt.exe внедрять:
mt.exe manifest MyApp.exe.manifest -outputresource:MyApp.exe;1

Ну я исходники не читал, может быть там (безуспешно) пытаются это сделать и таки баг.

Там же прикольно, там зарезервировано место пробелами, чтобы поправить asInvoker в requireAdministrator (места как раз достаточно).
А вот кто это должен делать, сам innosetup или предполагается что потом я, ручками - не знаю. Может это фича такая.

А внедрить можно много чего - но вот я потратил полдня, чтобы оно работало только InnoSetup-ом (все версии и все такое - бралось строго из одного места) и обратно выписывать какие-то батники очень противно.

Оно же в исходниках! На дельфи :(

Ну да, в исходниках. На дельфи. Чем я ее буду компилировать то?

Дык потому и смайлик такой, что на дельфи! Именно по этому -- что ``Чем я ее буду компилировать то?''

Там вообще в этом месте какая-то беда.
InstallShield (бесплатная версия для Visual Studio) - у меня не завелся, говорит что надо его активировать и даже номерок прислали, но куда этот номерок совать я не понял, а саппорт мне не ответил.
NSIS - последняя версия вышла в 2009-м, я таких программ боюсь.
WIX - живой, но делает MSI
InnoSetup - вроде живой, но вот эта вот хрень с манифестом. И понятно, что можно манифест поменять поверх, потом переподписать, но все это какое-то чудовищное.

С файлом ресурсов тут тоже трахался изрядное время. Беру вот прямо MS-овский пример из MSDN - не работает. Редактирую версию Visual Studio - не работает.
Выдрал некий работающий неизвестно откуда, довел напильником - полегчало.

А чем пугает MSI?

А ставится ли он в Wine, например?

Не знаю, реализован ли там Windows Installer. Но если нет -- то не будет ставится огромное число продуктов, в которых из product-setup.exe просто распаковывается и запускается MSI'шка.
А вообще, я за максимум стандартных средств. Если уже MS сделала полную поддержку инсталляции внутри системы в кои-то веки (сколько лет её не было), то ей и надо пользоваться. Ну, как в Линуксе надо по максимум пользоваться пакетной системой дистрибутива а не ./configure && make && make install :)

Ну вот в эмуляторе Linux в FreeBSD rpm скорее всего пролетит мимо тазика.

С MSI/.exe - ну вот по каким-то причинам таки делают product-setup.exe (с MSI) внутри, а не просто MSI. А по каким?

Зависит от того, что в линуксолятор втянули :)))

Потому что люди привыкли, что запускается EXE -- других причин, как мне кажется нет (потому что, натурально, это самораспаковывающийся архив с командой запуска распакованного и всё). А, ну да, ещё доп. сжатие, сам MSI сжат неидеально и 7z поверх даёт ещё выигрыш, например.

А всякие redistributables и прочие DX9 - не ставит ведь сам, как нам тут пишут ниже?

Мне они в настоящий момент без надобности, но это же не навсегда.

проще всего использовать стандартный студийный инсталятор (не installshield). он делает и msi и setup.exe к нему и все зависимости рядом кладет. потом можно 7z все собрать в один файл для полной версии и отдавать msi, если надо поставить только новую версию.

msi до версии вроде 4 или 5 мог хранить только один пакет (а все ориентируются на 3.1, который в XP), соответственно если надо больше, например зависимости, то нужен setup.exe. и вторая причина следствие первой - msi зависимости только проверяет, но не умеет ставить недостающее.

век живи, век учись. а корреляция с windows logo, видимо, потому, что там требуют, чтобы у инсталлятора был requireAdministrator в манифесте...

Ну, вообще, программа же может ставиться в Users и писать в Registry только в HKLU. И, соответственно, ничего такого не надо.

Ну и узнать, чего программа на самом деле хочет - нельзя же не запустив ея. А ругается - заранее. У меня в тестах ругалось просто на подписанное приложение (не инсталлятор), которому точно никаких прав не надо.

Спасибо, интересно и полезно.

Вот тут инносетапцы пишут, что это всё intentional, чтоб чего-то работало:
http://news.jrsoftware.org/news/innosetup/msg93060.html

Оно - очевидно - недоделано, хотя там осталось дел на 5 минут (+ еще нужно знание дельфи и компилятор, у меня оба предмета отсутствуют).

Т.е. в xml-ке уже оставлено место, где можно попатчить, осталось эту патчилку прикрутить в зависимости от настроек RequiredPrivileges (или PrivilegesRequired, никак не могу запомнить).

Но так как я пока ставлюсь в Program Files, т.е. права мне нужны (и defaults - годятся), я попатчил бинарно прямо по живому.

Да, про IE9 low-rights sandbox - жОстко. Как много я не знаю и как бы я хотел этого всего не знать.

> Как много я не знаю и как бы я хотел этого всего не знать.

Это очень мудрые слова. Фактически мой девиз как профессионального программиста.

Как много нам открытий чудных готовит виндоуз-сэвэн дух? :)

О да.
Я тут вчера впервые сделал деплой под Max OS X. Просто запускаешь macdeplyoyqt -dmg - и получаешь работающий dmg. Удивительное дело.

Да, пока криво и косо, много чего не понимаю, но оно натурально проще, чем под виндой.

Аплодирую упорству :)

Времени, на самом деле, ушло мало. Идею с манифестом мне подсказали, а попатчить его по живому и проверить - дело трех минут