Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обойти Win7 UserAccountControl, Запись файла 
V
    Опции темы
loneybibi
  Дата 20.6.2011, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Здравствуйте, уважаемые. smile

Пишу Updater для своей программы, вроде все получилось, но заметил одну очень большую проблему. В Window 7 есть такая штука как User Account Control. Проблема в том что он моему Updater'у не дает записать новый файл вместо старого. Если его отключить то все нормально. Думаю кто то уже сталкивался с такой проблемой, подскажите что делать, как обойти эту систему контроля ?

Нашел в описании UAC что нужно указать в манифест-ресурсе уровень доступа программы: asInvoker, highestAvailable или requireAdministrator. Программа будет иметь соответствующие права уже при запуске. Но как это сделать в Qt ?

Заранее благодарен за, Ваши ответы! smile 

Это сообщение отредактировал(а) loneybibi - 20.6.2011, 13:57


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
borisbn
Дата 20.6.2011, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(loneybibi @  20.6.2011,  13:44 Найти цитируемый пост)
Но как это сделать в Qt ?

Никак. В наборе Си++ классов, объединённых в библиотеку под названием Qt, нет понятия манифеста.
Если ты компилишь MSVC, то в каталоге Release создаётся такой файл: Имя_программы.manifest
Отредактируй его и распространяй вместе с программой.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
loneybibi
Дата 20.6.2011, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Цитата(borisbn @ 20.6.2011,  13:09)
Цитата(loneybibi @  20.6.2011,  13:44 Найти цитируемый пост)
Но как это сделать в Qt ?

Никак. В наборе Си++ классов, объединённых в библиотеку под названием Qt, нет понятия манифеста.
Если ты компилишь MSVC, то в каталоге Release создаётся такой файл: Имя_программы.manifest
Отредактируй его и распространяй вместе с программой.

А другие методы кроме манифеста обойти или получить права UAC на запись? Или можно как то создать манифест для собранного приложения на mingw ?


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
borisbn
Дата 20.6.2011, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Вот такой манифест создаёт у меня MSVC для всех проектов (Qt-шных в том числе)
Цитата

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='asInvoker' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
</assembly>



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
loneybibi
Дата 20.6.2011, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Цитата(borisbn @ 20.6.2011,  13:24)
Вот такой манифест создаёт у меня MSVC для всех проектов (Qt-шных в том числе)
Цитата

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='asInvoker' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
</assembly>

Ну я так понимаю что он не просто должен рядом лежать с приложение а как то "прикручен" к нему. Если я соберу MinGw приложение и положу манифест рядом то толку ноль!? Я просто первый раз с этим сталкиваюсь.


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
ecspertiza
Дата 20.6.2011, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: 4
Всего: 5



я могу ошибаться ,но манифесты работают только с Visual Studio . Просто не пиши ничего в Program Files ,а пиши в пользовательскую папку, туда права точно будут.


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
loneybibi
Дата 20.6.2011, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Цитата(ecspertiza @ 20.6.2011,  14:49)
я могу ошибаться ,но манифесты работают только с Visual Studio . Просто не пиши ничего в Program Files ,а пиши в пользовательскую папку, туда права точно будут.

Да вот в том то и дело что программа устанавливается именно туда. И она качает обновления для себя, но не может их записать.


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
borisbn
Дата 20.6.2011, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(loneybibi @  20.6.2011,  15:35 Найти цитируемый пост)
Ну я так понимаю что он не просто должен рядом лежать с приложение а как то "прикручен" к нему

Цитата отсюда
Цитата

Manifests are typically a section embedded in the application's executable file but may also be an external file


хз. попробуй просто положить рядом

Это сообщение отредактировал(а) borisbn - 20.6.2011, 15:57


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
loneybibi
Дата 20.6.2011, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Цитата(borisbn @ 20.6.2011,  14:57)
Цитата(loneybibi @  20.6.2011,  15:35 Найти цитируемый пост)
Ну я так понимаю что он не просто должен рядом лежать с приложение а как то "прикручен" к нему

Цитата отсюда
Цитата

Manifests are typically a section embedded in the application's executable file but may also be an external file


хз. попробуй просто положить рядом

Попробовал.. результата не имеет. На MSDN нашел что то про манифесты и утилиту Mage(UI).exe которая в комплекте с VS и создает эти манифесты.. Попробую это "покурить" ... 

Если кому интересно: http://msdn.microsoft.com/ru-ru/library/acz3y3te.aspx


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
ecspertiza
Дата 20.6.2011, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: 4
Всего: 5



а ты качай обновления в Temp, и сделай их в виде инсталяшки с помощью Inno setup например, пущай юзверь сам их ставит smile А после того как скачались обновления естественно вырубай (софт если нужно) и запускаешь инсталяшку smile


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
loneybibi
Дата 20.6.2011, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Цитата(ecspertiza @ 20.6.2011,  15:27)
а ты качай обновления в Temp, и сделай их в виде инсталяшки с помощью Inno setup например, пущай юзверь сам их ставит smile А после того как скачались обновления естественно вырубай (софт если нужно) и запускаешь инсталяшку smile

Как вариант smile Но я думаю это слишком усложненный вариант. smile


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
ecspertiza
Дата 20.6.2011, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: 4
Всего: 5



я просто одно время колупался с манифестами под MinGW , ничего у меня не вышло, сделал на инсталяшке. Да и для пользователя это вроде как удобно.


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
loneybibi
Дата 20.6.2011, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Цитата(ecspertiza @ 20.6.2011,  15:34)
я просто одно время колупался с манифестами под MinGW , ничего у меня не вышло, сделал на инсталяшке. Да и для пользователя это вроде как удобно.

Что то с Mingw у меня тоже не выходит! smile Поставил Visual Studio сейчас буду пробовать собрать там с манифестами. Кстати кто то так во время про эти манифесты статью на хабре выкинул. 
http://habrahabr.ru/company/xakep/blog/122272/


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
Любитель
Дата 20.6.2011, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 16
Всего: 92



Манифест может быть внешним файлом. Положи рядом с приложением и назове myapp.exe.manifest.


--------------------
PM MAIL ICQ Skype   Вверх
loneybibi
Дата 20.6.2011, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Цитата(Любитель @ 20.6.2011,  16:18)
Манифест может быть внешним файлом. Положи рядом с приложением и назове myapp.exe.manifest.

Я понимаю что он внешний файл. Но просто я сначала так рядом положил файл манифеста с приложением собранным на mingw результата не дало, потом собрал приложение на VS2008 с Qt и там компилятор сам создал манифест файл. Положил все манифесты и даже для библиотек, все равно нет результата. Он даже не пытается спросить пользователя разрешить или нет. Потом открыл утилиту mage которая генерирует манифесты. Создал манифесты для всех файлов своего приложения(скомпилированного на VS) с правами доступа Full Trust. Все равно ноль эмоций .. Он даже не хочет выдать диалог с разрешением на права.. 
Я сегодня целый день долблю эту стенку, уже сил нет завтра продолжу... 
Прибил бы того кто придумал эту ........................... :(



--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
borisbn
Дата 20.6.2011, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



> Прибил бы того кто придумал
эту ........................... :(
Ты не одинок ;)


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Любитель
Дата 20.6.2011, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 16
Всего: 92



Покажи плиз, как называется файл манифеста и что у тебя в нём написано?


--------------------
PM MAIL ICQ Skype   Вверх
loneybibi
  Дата 21.6.2011, 13:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Цитата(borisbn @ 20.6.2011,  19:24)
> Прибил бы того кто придумал
эту ........................... :(
Ты не одинок ;)

Это радует! smile

Добавлено @ 13:58
Цитата(Любитель @ 20.6.2011,  20:10)
Покажи плиз, как называется файл манифеста и что у тебя в нём написано?

Читай мой пост ниже я там все написал!

Добавлено @ 14:02
Доел все таки вчера мануалы и вопрос решил. smile

Осторожно много буков! smile

Сразу оговорюсь что просто так взять и положить 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! smile

Внутреннее описание manifest файла исполнено на XML. Думаю разобраться с его содержимым проблем не будет.

Приведу шаблон manifest файла, который позволит приложению работать и на Windows 7 и на Windows XP.
Код

<?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"
     processorArchitecture="X86"
     name="IsUserAdmin"
     type="win32"/> 
  <description>Description of your application</description> 
  <!-- Identify the application security requirements. -->
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="requireAdministrator"
          uiAccess="false"/>
        </requestedPrivileges>
       </security>
  </trustInfo>
</assembly>


Подробно рассматривать этот шаблон не буду, нас больше всего интересует параметр в разделе "requestedExecutionLevel" level. Этот параметр может иметь одно из трех значений: asInvoker, highestAvailable и requireAdministrator. Приложения которым не нужны административные привилегии имею значении этого свойства равным "isInvoker". Когда нужно получить максимальные права доступа нужно установить значение равным "highestAvailable". Ну и если установить значение равным "requireAdministrator" приложение перед запуском будет спрашивать пользователя о разрешении доступа как администратора. Параметр "uiAccess" по умолчанию имеет значении "false", значение "true" для этого параметра будет давать приложению повышенные права и доступ к процессам системы, но в этом случае на сколько я понял из MSDN необходима цифровая подпись.

Теперь опишу сам процесс этого действа! smile

Первый вариант если вы собираете проект в Visual Studio с вложенным manifest файлом в исполняемый как ресурс. Для начала собираем наш проект. После окончания сборки в каталоге с нашим исполняемым файлом компилятор создаст manifest файл с именем "%app_name%.exe.intermediate.manifest", вставка "intermediate" в имени файла говорит нам о том что это промежуточный manifest. Открываем его любым удобным текстовым редактором и редактируем по шаблону выше и сохраняем. Далее делаем сборку нашего проекта еще раз. Если отладочная консоль компилятора не выдала ошибок значит у нас все получилось и наш manifest успешно вложен с исполняемый файл и уже никуда не потеряется. В этом случае manifest не надо тягать вместе с приложением. smile 

Второй вариант опять же если мы собираем проект на 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. Очень радует что нам все таки оставили такую возможность! smile В комплекте с Visual Studio есть утилита, называется "mt.exe", для вложения manifest файла в исполняемый как ресурса. Для этого заранее подготавливаем manifest в текстовом редакторе и сохраняем его рядом с нашим исполняемым файлом например под именем "temp.manifest". Далее идем в командную строку Visual Studio, заходим в каталог с нашим исполняемым файлом, где так же должен лежать manifest, и выполняем команду:

Код

mt.exe -manifest %имя_файла_манифеста%.manifest -outputresource:%имя_нашего_приложения%.exe;#1


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

Код

mt.exe –manifest temp.manifest –outputresource:TestApp.exe;#1


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

Если есть исправления или дополнения к выше написанному пишите! smile

Материалы для более глубокого познания (:
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

Это сообщение отредактировал(а) loneybibi - 21.6.2011, 14:17


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1176 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.