Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Обойти Win7 UserAccountControl |
Автор: loneybibi 20.6.2011, 13:44 |
Здравствуйте, уважаемые. ![]() Пишу Updater для своей программы, вроде все получилось, но заметил одну очень большую проблему. В Window 7 есть такая штука как User Account Control. Проблема в том что он моему Updater'у не дает записать новый файл вместо старого. Если его отключить то все нормально. Думаю кто то уже сталкивался с такой проблемой, подскажите что делать, как обойти эту систему контроля ? Нашел в описании UAC что нужно указать в манифест-ресурсе уровень доступа программы: asInvoker, highestAvailable или requireAdministrator. Программа будет иметь соответствующие права уже при запуске. Но как это сделать в Qt ? Заранее благодарен за, Ваши ответы! ![]() |
Автор: borisbn 20.6.2011, 14:09 |
Никак. В наборе Си++ классов, объединённых в библиотеку под названием Qt, нет понятия манифеста. Если ты компилишь MSVC, то в каталоге Release создаётся такой файл: Имя_программы.manifest Отредактируй его и распространяй вместе с программой. |
Автор: loneybibi 20.6.2011, 14:13 | ||
А другие методы кроме манифеста обойти или получить права UAC на запись? Или можно как то создать манифест для собранного приложения на mingw ? |
Автор: borisbn 20.6.2011, 14:24 | ||
Вот такой манифест создаёт у меня MSVC для всех проектов (Qt-шных в том числе)
|
Автор: loneybibi 20.6.2011, 15:35 | ||||
Ну я так понимаю что он не просто должен рядом лежать с приложение а как то "прикручен" к нему. Если я соберу MinGw приложение и положу манифест рядом то толку ноль!? Я просто первый раз с этим сталкиваюсь. |
Автор: ecspertiza 20.6.2011, 15:49 |
я могу ошибаться ,но манифесты работают только с Visual Studio . Просто не пиши ничего в Program Files ,а пиши в пользовательскую папку, туда права точно будут. |
Автор: loneybibi 20.6.2011, 15:52 | ||
Да вот в том то и дело что программа устанавливается именно туда. И она качает обновления для себя, но не может их записать. |
Автор: loneybibi 20.6.2011, 16:10 | ||||||
Попробовал.. результата не имеет. На MSDN нашел что то про манифесты и утилиту Mage(UI).exe которая в комплекте с VS и создает эти манифесты.. Попробую это "покурить" ... Если кому интересно: http://msdn.microsoft.com/ru-ru/library/acz3y3te.aspx |
Автор: ecspertiza 20.6.2011, 16:27 |
а ты качай обновления в Temp, и сделай их в виде инсталяшки с помощью Inno setup например, пущай юзверь сам их ставит ![]() ![]() |
Автор: loneybibi 20.6.2011, 16:31 | ||
Как вариант ![]() ![]() |
Автор: ecspertiza 20.6.2011, 16:34 |
я просто одно время колупался с манифестами под MinGW , ничего у меня не вышло, сделал на инсталяшке. Да и для пользователя это вроде как удобно. |
Автор: loneybibi 20.6.2011, 17:11 | ||
Что то с Mingw у меня тоже не выходит! ![]() http://habrahabr.ru/company/xakep/blog/122272/ |
Автор: Любитель 20.6.2011, 17:18 |
Манифест может быть внешним файлом. Положи рядом с приложением и назове myapp.exe.manifest. |
Автор: loneybibi 20.6.2011, 19:22 | ||
Я понимаю что он внешний файл. Но просто я сначала так рядом положил файл манифеста с приложением собранным на mingw результата не дало, потом собрал приложение на VS2008 с Qt и там компилятор сам создал манифест файл. Положил все манифесты и даже для библиотек, все равно нет результата. Он даже не пытается спросить пользователя разрешить или нет. Потом открыл утилиту mage которая генерирует манифесты. Создал манифесты для всех файлов своего приложения(скомпилированного на VS) с правами доступа Full Trust. Все равно ноль эмоций .. Он даже не хочет выдать диалог с разрешением на права.. Я сегодня целый день долблю эту стенку, уже сил нет завтра продолжу... Прибил бы того кто придумал эту ........................... :( |
Автор: borisbn 20.6.2011, 20:24 |
> Прибил бы того кто придумал эту ........................... :( Ты не одинок ;) |
Автор: Любитель 20.6.2011, 21:10 |
Покажи плиз, как называется файл манифеста и что у тебя в нём написано? |
Автор: loneybibi 21.6.2011, 13:58 | ||||||||||
Это радует! ![]() Добавлено @ 13:58
Читай мой пост ниже я там все написал! Добавлено @ 14:02 Доел все таки вчера мануалы и вопрос решил. ![]() Осторожно много буков! ![]() Сразу оговорюсь что просто так взять и положить manifest файл рядом с приложением не будет иметь смысла, работать он так все равно не будет. Как оказалось в manifest нет ничего сложного. Просто нет нормальной документации и инструкций. И так есть несколько способов создания manifest файла для вашего приложения: 1. Если проект компилируется в Visual Studio то manifest файл будет создан компилятором автоматически и при сборке по умолчанию будет вложен("зашит") в приложение как ресурс или создан как внешний файл. 2. В комплекте с Visual Studio есть утилита mage.exe(MAnifest Generation and Edit tools), с помощью которой, как написано в MSDN можно создавать manifest файлы. Кстати сама Visual Studio и делает это через эту утилиту. В ней есть как графический интерфейс, так и возможность создания manifest файлов через командную строку. Я честно не сильно углублялся в этот вариант, кому интересно внизу поста есть ссылки на мануал с русским переводом. 3. Написать manifest файл ручками, как это сделал я, через обычный текстовый редактор. Еще есть несколько способов использования manifest файла: 1. Хранить manifest файл внешне, рядом с приложением в виде обычного XML файла, в таком случае он будет работать только если приложение собиралось на Visual Studio, потому как при сборке проекта компилятор делает в исполняемом файле пометку что manifest находится внешне а не зашит в ресурс. 2. Хранить manifest как ресурс внутри исполняемого приложения. В этом случае все равно каким компилятором было собрано приложение. В комплекте с Visual Studio поставляется утилита которая вшивает manifest в исполняемый файл. Лично меня радует тот факт что Microsoft оставил нам такую возможность, так как в моем случае приложение собрано на MinGw! ![]() Внутреннее описание manifest файла исполнено на XML. Думаю разобраться с его содержимым проблем не будет. Приведу шаблон manifest файла, который позволит приложению работать и на Windows 7 и на Windows XP.
Подробно рассматривать этот шаблон не буду, нас больше всего интересует параметр в разделе "requestedExecutionLevel" level. Этот параметр может иметь одно из трех значений: asInvoker, highestAvailable и requireAdministrator. Приложения которым не нужны административные привилегии имею значении этого свойства равным "isInvoker". Когда нужно получить максимальные права доступа нужно установить значение равным "highestAvailable". Ну и если установить значение равным "requireAdministrator" приложение перед запуском будет спрашивать пользователя о разрешении доступа как администратора. Параметр "uiAccess" по умолчанию имеет значении "false", значение "true" для этого параметра будет давать приложению повышенные права и доступ к процессам системы, но в этом случае на сколько я понял из MSDN необходима цифровая подпись. Теперь опишу сам процесс этого действа! ![]() Первый вариант если вы собираете проект в Visual Studio с вложенным manifest файлом в исполняемый как ресурс. Для начала собираем наш проект. После окончания сборки в каталоге с нашим исполняемым файлом компилятор создаст manifest файл с именем "%app_name%.exe.intermediate.manifest", вставка "intermediate" в имени файла говорит нам о том что это промежуточный manifest. Открываем его любым удобным текстовым редактором и редактируем по шаблону выше и сохраняем. Далее делаем сборку нашего проекта еще раз. Если отладочная консоль компилятора не выдала ошибок значит у нас все получилось и наш manifest успешно вложен с исполняемый файл и уже никуда не потеряется. В этом случае manifest не надо тягать вместе с приложением. ![]() Второй вариант опять же если мы собираем проект на Visual Studio только в этом случае manifest будет не зашитый в исполняемый файл а просто лежать рядом с приложением, что дает на возможность редактировать его в любое удобное время. Для этого в проводнике проектов Visual Studio, слева жмем на наш проект правой кнопкой и открываем его "Properties", далее открываем вкладку "Manifest Tools" затем "Input and Output" и свойство "Embed manifest" меняем на "No". Затем собираем наш проект и рядом с исполняемым файлом компилятор создаст внешний manifest и он уже будет иметь имя "%app_name%.exe.manifest". После чего мы его так же открываем текстовым редактором и делаем по шаблону выше. В таком случае manifest файл надо тягать вместе с приложением, в случае его отсутствия приложение будет запущено с правами "asInvoker". Третий вариант manifest для приложений которые были собраны не Visual Studio, а допустим в моем это случае Qt на MinGw. Очень радует что нам все таки оставили такую возможность! ![]()
Первый параметр задает имя файла manifest, второй куда вшивать. Номер после точки с запятой это порядковый номер ресурса. В MSDN было написано что можно вшивать несколько manifest файлов но для чего я не разобрался. В нашем случае он будет первый и единственный. Вообщем у меня в командной строке получилось вот так:
Если manifest файл написан правильно, нет ошибок синтаксиса и на выводе программы нет ошибок значит manifest успешно вшит в исполняемый файл. С помощью этой утилиты можно вшивать manifest в почти любые приложения написанные не только на "Cи". Если есть исправления или дополнения к выше написанному пишите! ![]() Материалы для более глубокого познания (: http://habrahabr.ru/company/xakep/blog/122272/ http://msdn.microsoft.com/en-us/library/bb756929.aspx http://msdn.microsoft.com/ru-ru/library/acz3y3te.aspx |