Твикер для Windows Vista своими руками

Сергей Пахомов

Инструменты для написания твикера

Выявление изменений в реестре при настройках с применением твикера

Настройки операционной системы, которые сложно реализовать правкой реестра

Вызов диалоговых окон с использованием DLL-библиотек

Написание скрипта для настройки Windows Vista

Создание исполняемого скрипта редактирования реестра без экранных форм

Создание скрипта с экранной формой

Заключение

 

...Наши люди — продвинутые,

не боятся этой коробочки с кнопочками.

Избранный президент РФ Дмитрий Медведев

об увеличении числа пользователей Интернета в России

 

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

Настройку операционной системы можно производить тремя способами:

  • с использованием встроенных в ОС средств настройки;
  • путем ручной правки реестра;
  • с помощью специализированных утилит по настройке (твикеров).

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

Ручная правка реестра операционной системы — это, действительно, очень эффективный способ настройки. В данном случае любые изменения настроек операционной системы и установленных приложений в конечном счете сводятся к изменению тех или иных ключей реестра. Однако этот способ нельзя назвать простым. Для правки реестра нужно иметь под рукой справочник, поскольку запомнить, что и где нужно править, просто невозможно.

Специализированные утилиты по настройке объединяют в себе все преимущества как первого, так и второго способа. Действительно, большинство твикеров представляет собой единый центр контроля для доступа к различным встроенным в операционную систему средствам по настройке, то есть позволяют быстро открыть нужное диалоговое окно настройки, благодаря чему пользователю не придется вспоминать, где находится нужное ему диалоговое окно. Кроме того, любой твикер — это, по сути, специализированный редактор реестра. Однако, в отличие от традиционного редактора regedit, в данном случае мы имеем удобный интерфейс, исключающий утомительный поиск нужных параметров в реестре, доступ только к тем параметрам и ключам реестра, которые предусмотрены твикером, и, что особенно важно, твикеры не позволяют задать некорректное значение ключей (то есть ошибиться невозможно).

К примеру, мы хотим изменить текст всплывающей подсказки к ярлыку Recycle Bin (Корзина) (всплывающая подсказка появляется, если к соответствующему ярлыку на рабочем столе подвести курсор мыши). По умолчании, всплывающая подсказка имеет текст следующего содержания: Contains the files and folders that you have deleted (Используется для временного сохранения файлов и папок, которые были удалены).

Для изменения этой надписи в разделе реестра HKCR\CLSID\{645FF040-5081-101B-9F08-00AA002F954E} необходимо отредактировать ключ InfoTip типа REG_EXPAND_SZ, указав текст всплывающей подсказки (например, Помойка для мусора). Чтобы вернуть первоначальную надпись, в качестве значения параметра указывается строка: @%SystemRoot%\system32\SHELL32.dll,-22915.

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

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

К примеру, вам нужно сделать одинаковые настройки на нескольких компьютерах (для службы техподдержки такая задача — обычное дело). В этом случае желательно автоматизировать процесс настройки, чтобы он выполнялся, во-первых, быстро, а во-вторых, без вашего участия, что исключает возможность ошибки при настройке. В таком случае использование стандартных универсальных твикеров — это не самый лучший вариант. Для решения подобных задач лучше воспользоваться узкоспециализированным твикером, позволяющим выполнить всю настройку в автоматическом режиме. Но, увы, таких специализированных твикеров просто-напросто не существует, да и не может быть, поскольку в данном случае все зависит от того, какие именно настройки должны быть произведены. Единственный вариант — создать такой узкоспециализированный твикер самостоятельно.

«Как? Заняться разработкой программ? Да ведь для этого нужно быть программистом!» — возразите вы. Ничего подобного. Разработать свой собственный твикер — это, во-первых, очень просто, а во-вторых, увлекательно.

В настоящей статье мы расскажем о том, как создать собственный твикер для настройки операционной системы Windows Vista. Усвоив данный материал, вы сможете создавать твикеры для любых операционных систем семейства Windows, а не только для Windows Vista. Отметим, что данная статья ориентирована на читателей, которые не занимаются ежедневно программированием или вообще далеки от него. В то же время это не учебник по программированию и предполагается, что выражения типа «Do… While» не введут читателя в ступор. Кроме того, мы рассчитываем, что читатели знакомы с тем, что такое реестр и как он редактируется. Заметим также, что вы не найдете здесь законченных листингов программ, однако в статье будет масса примеров выполнения различных настроек. То есть мы попытаемся рассказать вам о мощном инструменте, используя который вы сможете создавать твикеры (и отнюдь не только твикеры) для собственных нужд.

Инструменты для написания твикера

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

Оптимальным выбором для решения нашей задачи будет скриптовый язык AutoIt. Он разрабатывался как средство для создания скриптов автоматизации (иногда называемых макросами) для программ Microsoft Windows, то есть скриптов для выполнения часто повторяющихся задач, таких как инсталляция идентичных наборов программ на большое количество компьютеров. В более поздних версиях AutoIt улучшился дизайн языка и возросла общая функциональность, что приблизило его к языкам общего назначения. Сегодня AutoIt — это самый мощный инструмент для написания различных скриптов. Кроме того, этот язык можно эффективно применять для создания разнообразных небольших приложений.

Достоинством данного языка является его простота, а также наличие встроенного компилятора и вспомогательных утилит. Этот скриптовый язык поддерживает работу с объектами COM (Сomponent Object Modelling), вызов функций из 32-битных динамических библиотек, создание графических интерфейсов, имитацию работы с мышью, имитацию нажатия любых клавиш на клавиатуре и многое другое. Кроме всего прочего, AutoIt распространяется бесплатно, и его можно загрузить с сайта производителя www.autoitscript.com. Размер всего дистрибутива составляет 6,56 Мбайт.

Кроме языка AutoIt (кстати, текущая версия — 3.2.10.0), нам потребуется небольшая утилита AU3Record 3.1, которая позволяет немного автоматизировать процесс написания скриптов. Ее тоже можно свободно скачать с ресурсов Интернета.

Кроме скриптового языка для написания твикера, нам потребуется либо справочник по реестру, либо (поскольку все подобные справочники не всеобъемлющи) программа, которая позволяет делать снимки реестров и сравнивать их. Наилучшим выбором в данном случае будет бесплатная утилита RegShot 2.0.1.54, которая, кстати сказать, имеет русский интерфейс. В дополнение к ней может потребоваться какой-нибудь универсальный твикер типа Vista Manager v.1.4.5 (www.yamicsoft.com). И ничего страшного, если он будет платным. Нам вполне достаточно триальной, ограниченной по времени использования версии.

Выявление изменений в реестре при настройках с применением твикера

Программа RegShot 2.0.1.54 и универсальный твикер потребуются нам для того, чтобы определять с их помощью, какие изменения производятся в реестре при реализации той или иной настройки с использованием твикера.

Итак, идея заключается в следующем. Запускаем программу RegShot 2.0.1.54 и делаем с ее помощью снимок реестра. Далее запускаем твикер и реализуем какую-либо настройку. Делаем второй снимок реестра и сравниваем два снимка, чтобы посмотреть, какие изменения в реестре при этом были произведены. Впрочем, давайте на конкретном примере посмотрим, как это реализовать.

Итак, запускаем утилиту RegShot 2.0.1.54 и нажимаем на кнопку Снимок 1 (рис. 1). После это появляется всплывающее меню, в котором можно указать, нужно ли делать снимок отдельного раздела реестра или всего реестра целиком (рис. 2). Поскольку мы не знаем, где именно находятся изменяемые параметры, выбираем пункт Реестр полностью, и через 10-15 с (в зависимости от установленного на компьютере приложения и его производительности) мы получим снимок реестра.

Теперь запускаем предварительно установленный твикер Vista Manager v.1.4.5 и реализуем с его помощью какую-либо настройку. В нашем примере в разделе Customization мы осуществим настройку Show Windows version on Desktop (Отображать версию Windows на рабочем столе) — рис. 3. Заметим, что осуществить подобную настройку, используя встроенные средства Windows, невозможно. Сохранив сделанные настройки (для этого нажимаем клавишу Save), мы произведем необходимые изменения в реестре.

 

Рис. 1. Утилита RegShot 2.0.1.54

Рис. 1. Утилита RegShot 2.0.1.54

Рис. 2. Выбор раздела реестра для снимка утилитой RegShot 2.0.1.54

Рис. 2. Выбор раздела реестра для снимка утилитой RegShot 2.0.1.54

Рис. 3. Выбор настройки с использованием твикера Vista Manager v.1.4.5

Рис. 3. Выбор настройки с использованием твикера Vista Manager v.1.4.5

Далее с помощью утилиты RegShot 2.0.1.54 делаем второй снимок всего реестра (кнопка Снимок 2). После этого откроется окно Выбор разделов, включаемых в отчет, в котором можно указать, какие разделы двух снимков реестра нужно проанализировать на предмет наличия отличий. Поскольку предполагается, что мы не знаем, где скрываются наши изменения реестра, просто нажимаем на кнопку OK, дабы сравнить все разделы реестра. После этого формируется сводный отчет о сравнении двух снимков реестра в HTML-формате. Итак, несмотря на то, что мы реализовали всего-навсего одну настройку, которую можно выполнить изменением одного ключа реестра, при сравнении двух снимков реестра мы получим достаточно много изменений. Дело в том, что реестр — это «живой» организм, в котором динамически происходят различные процессы. Открытие любого окна, запущенные при работе операционной системы приложения, службы и процессы постоянно вносят изменения в записи реестра. А потому два снимка реестра, сделанные в разное время, обязательно будут отличаться друг от друга. В данном случае важно отфильтровать все лишнее и найти именно то изменение реестра, которое связано с произведенной настройкой.

В нашем примере сделать это оказалось достаточно просто. Сравнение двух снимков реестра выявило, что после произведенной настройки в новом снимке реестра в разделе HKEY_CURRENR_USER\Control Panel\Desktop появился новый ключ PaintDestopVersion типа REG_DWORD со значением 1 (рис. 4).

 

Рис. 4. Сравнение двух снимков реестра позволяет выявить произведенные в реестре изменения

Рис. 4. Сравнение двух снимков реестра позволяет выявить произведенные в реестре изменения

Далее, чтобы убедиться в том, что только появление нового ключа в реестре позволяет реализовать нужную нам настройку, его можно удалить или задать ему значение 0 — для соскрытия отображения версии Windows на рабочем столе.

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

Иногда, если для настройки используется твикер, чтобы произведенные настройки вступили в силу, необходимо перезагрузить компьютер. В этом случае с помощью утилиты RegShot 2.0.1.54 нужно сохранить первый снимок, а после перезагрузки компьютера загрузить его и сделать второй снимок. Правда, в этом случае количество изменений в двух снимках реестра составит более сотни и найти нужное будет непросто. Еще одна неприятная ситуация возникает в том случае, если производимая настройка приводит к изменению (удалению, добавлению) не одного ключа реестра, а сразу нескольких. К примеру, вы хотите отключить все визуальные эффекты или, наоборот, настроить компьютер на максимальное качество отображения всех диалоговых окон. Это можно сделать с использованием как встроенного средства Windows (диалоговое окно Performance Options), так и универсального твикера (если такая возможность в нем предусмотрена). Осуществить это достаточно просто — нужно лишь отметить нужный пункт в диалоговом окне. Однако количество изменений, которые при этом производятся в реестре, исчисляется сотнями, и, естественно, в этом случае применять редактирование реестра в скриптовой программе разрабатываемого нами твикера просто невозможно. О том, как поступать в таких случаях, мы расскажем далее, а пока вернемся к реестру.

Итак, мы рассказали о том, как с помощью программы для анализа реестра и универсального твикера можно сопоставить изменения реестра с различными настройками. Естественно, описанный алгоритм имеет смысл использовать только в том случае, если неизвестно, как путем редактирования реестра выполнить ту или иную настройку. Отметим, что данный способ малоэффективен, но иногда оказывается единственно возможным. Если же под рукой есть справочник по реестру, то задача существенно облегчается. Подробный справочник по настройкам реестра операционной системы Windows Vista можно найти в этом номере журнала. Заметим лишь, что большинство приводимых в нем настроек реестра были найдены именно методом сравнения двух снимков реестра с помощью утилиты RegShot 2.0.1.54, а сами настройки выполнялись с применением твикера Vista Manager v.1.4.5.

Настройки операционной системы, которые сложно реализовать правкой реестра

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

Попробуйте, к примеру, выполнить настройку Adjust for best appearance в диалоговом окне Performance Options, сделать снимок реестра, а затем реализовать настройку Adjust for best performance и опять сделать снимок реестра. Сравнение двух снимков реестра не позволит вам выявить параметры, которые нужно отредактировать для реализации данной настройки методом ручного редактирования реестра.

Аналогичная ситуация возникает и в случае, когда необходимо настроить режим энергопотребления компьютера (Power Options).

Впрочем, не все так грустно. При разработке твикера для настройки операционной системы все те настройки, которые нельзя реализовать методом редактирования реестра, можно будет выполнить путем вызова динамических DLL-библиотек и встроенных в скриптовый язык AutoIt возможностей. Однако, прежде чем переходить к рассмотрению возможностей скриптового языка AutoIt по автоматической настройке различных диалоговых окон, научимся их вызывать.

Вызов диалоговых окон с использованием DLL-библиотек

Практически любое диалоговое окно Windows Vista может быть вызвано как DLL-библиотека. Для этого используется команда rundll32.exe с определенными параметрами. Далее мы приведем в качестве справочного пособия синтаксис команды rundll32.exe для запуска любого диалогового окна, доступ к которому можно реализовать из контрольной панели. Отметим, что данные команды справедливы только для операционной системы Windows Vista. Большинство DLL-библиотек, отвечающих за системные диалоговые окна, доступ к которым осуществляется через контрольную панель (файлы с расширением *.cpl), можно найти в разделе реестра HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ControlPanel.

Для запуска любого элемента контрольной панели применяется следующий синтаксис команды:

rundll32.exe shell32.dll,Control_RunDLL *.cpl,

где *.cpl — это файл, отвечающий какому-либо модулю контрольной панели.

Контрольная панель

rundll32.exe shell32.dll,Control_RunDLL — запуск контрольной панели (Control Panel).

Окно People Near Me

rundll32.exe shell32.dll,Control_RunDLL collab.cpl @0,0 — открытие диалогового окна People Near Me (вкладка Settings).

rundll32.exe shell32.dll,Control_RunDLL collab.cpl @0,1 — открытие диалогового окна People Near Me (вкладка Sign in).

Окно Offline Files

rundll32.exe shell32.dll,Control_RunDLL cscui.dll @0,0 — открытие диалогового окна Offline Files (вкладка General).

rundll32.exe shell32.dll,Control_RunDLL cscui.dll @0,1 — открытие диалогового окна Offline Files (вкладка Disk Usage).

rundll32.exe shell32.dll,Control_RunDLL cscui.dll @0,2 — открытие диалогового окна Offline Files (вкладка Encryption).

rundll32.exe shell32.dll,Control_RunDLL cscui.dll @0,2 — открытие диалогового окна Offline Files (вкладка Network).

Окно Internet Properties

rundll32.exe shell32.dll,Control_RunDLL inetcpl.cpl @0,0 — открытие диалогового окна Internet Properties (вкладка General).

rundll32.exe shell32.dll,Control_RunDLL inetcpl.cpl @0,1 — открытие диалогового окна Internet Properties (вкладка Security).

rundll32.exe shell32.dll,Control_RunDLL inetcpl.cpl @0,2 — открытие диалогового окна Internet Properties (вкладка Privacy).

rundll32.exe shell32.dll,Control_RunDLL inetcpl.cpl @0,3 — открытие диалогового окна Internet Properties (вкладка Contenet).

rundll32.exe shell32.dll,Control_RunDLL inetcpl.cpl @0,4 — открытие диалогового окна Internet Properties (вкладка Connections).

rundll32.exe shell32.dll,Control_RunDLL inetcpl.cpl @0,5 — открытие диалогового окна Internet Properties (вкладка Programs).

rundll32.exe shell32.dll,Control_RunDLL inetcpl.cpl @0,6 — открытие диалогового окна Internet Properties (вкладка Advanced).

Окно Regional and Language Options

rundll32.exe shell32.dll,Control_RunDLL intl.cpl @0,0 — открывает диалоговое окно Regional and Language Options (вкладка Formats).

rundll32.exe shell32.dll,Control_RunDLL intl.cpl @0,1 — открывает диалоговое окно Regional and Language Options (вкладка Location).

rundll32.exe shell32.dll,Control_RunDLL intl.cpl @0,2 — открывает диалоговое окно Regional and Language Options (вкладка Keyboards and Languages).

rundll32.exe shell32.dll,Control_RunDLL intl.cpl @0,3 — открывает диалоговое окно Regional and Language Options (вкладка Administrative).

Окно Game Controllers

rundll32.exe shell32.dll,Control_RunDLL joy.cpl — открытие диалогового окна Game Controllers.

Окно Mouse Properties

rundll32.exe shell32.dll,Control_RunDLL main.cpl @0,0 — открытие диалогового окна Mouse Properties (вкладка Buttons).

rundll32.exe shell32.dll,Control_RunDLL main.cpl @0,1 — открытие диалогового окна Mouse Properties (вкладка Pointers).

rundll32.exe shell32.dll,Control_RunDLL main.cpl @0,2 — открытие диалогового окна Mouse Properties (вкладка Pointers Options).

rundll32.exe shell32.dll,Control_RunDLL main.cpl @0,3 — открытие диалогового окна Mouse Properties (вкладка Hardware).

Окно Keyboard Properties

rundll32.exe shell32.dll,Control_RunDLL main.cpl @1,0 — открытие диалогового окна Keyboard Properties (вкладка Speed).

rundll32.exe shell32.dll,Control_RunDLL main.cpl @1,1 — открытие диалогового окна Keyboard Properties (вкладка Hardware).

Окно Sound

rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl @0,0 — открытие диалогового окна Sound (вкладка Playback)

rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl @0,1 — открытие диалогового окна Sound (вкладка Recording).

rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl @0,2 — открытие диалогового окна Sound (вкладка Sounds).

Окно Indexing Options

rundll32.exe shell32.dll,Control_RunDLL srchadmin.dll — открытие диалогового окна Indexing Options.

Окно Pen and Input Device

rundll32.exe shell32.dll,Control_RunDLL tabletpc.cpl @0,0 — открытие диалогового окна Pen and Input Device (вкладка Pen Options).

rundll32.exe shell32.dll,Control_RunDLL tabletpc.cpl @0,1 — открытие диалогового окна Pen and Input Device (вкладка Pointer Options).

rundll32.exe shell32.dll,Control_RunDLL tabletpc.cpl @0,2 — открытие диалогового окна Pen and Input Device (вкладка Flicks).

Окно Local Information

rundll32.exe shell32.dll,Control_RunDLL modem.cpl — открывает диалоговое окно Local Information для настройки модема.

Окно Date and Time

rundll32.exe shell32.dll,Control_RunDLL timedate.cpl @0,0 — открывает диалоговое окно Date and Time (вкладка Date and Time).

rundll32.exe shell32.dll,Control_RunDLL timedate.cpl @0,1 — открывает диалоговое окно Date and Time (вкладка Additional Clocks).

rundll32.exe shell32.dll,Control_RunDLL timedate.cpl @0,2 — открывает диалоговое окно Date and Time (вкладка Internet Time).

Окно Windows Security Center

rundll32.exe shell32.dll,Control_RunDLL wscui.cpl — открывает диалоговое окно Windows Security Center.

Окно Windows Firewall

rundll32.exe shell32.dll,Control_RunDLL firewall.cpl — открывает диалоговое окно Windows Firewall.

Окно System Properties

rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl @0,1 — открывает диалоговое окно System Properties (вкладка Computer Name).

rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl @0,2 — открывает диалоговое окно System Properties (вкладка Hardware).

rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl @0,3 — открывает диалоговое окно System Properties (вкладка Advanced).

rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl @0,4 — открывает диалоговое окно System Properties (вкладка System Protection).

rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl @0,5 — открывает диалоговое окно System Properties (вкладка Remote).

Окно Uninstall or change a program

rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl @0,0 — открывает диалоговое окно Uninstall or change a program.

Окно Desktop Icon Settings

rundll32.exe shell32.dll,Control_RunDLL desk.cpl @0,0 — открывает диалоговое окно Desktop Icon Settings.

Окно Screen Saver

rundll32.exe shell32.dll,Control_RunDLL desk.cpl @0,1 — открывает диалоговое окно Screen Saver.

Окно Appearance Settings

rundll32.exe shell32.dll,Control_RunDLL desk.cpl @0,2 — открывает диалоговое окно Appearance Settings.

Окно Display Settings

rundll32.exe shell32.dll,Control_RunDLL desk.cpl @0,3 — открывает диалоговое окно Display Settings.

Окно Set up a wireless router or access point

RunDll32.exe shell32.dll,Control_RunDLL NetSetup.cpl — открывает диалоговое окно Set up a wireless router or access point.

Окно User Accounts

rundll32.exe shell32.dll,Control_RunDLL nusrmgr.cpl — открывает диалоговое окно User Accounts.

Окно Safely Remove Hardware

rundll32.exe shell32.dll,Control_RunDLL hotplug.dll — открывает диалоговое окно Safely Remove Hardware.

Окно Power Options

rundll32.exe Shell32.dll,Control_RunDLL powercfg.cpl — открывает диалоговое окно Power Options.

Окно Open With

rundll32.exe shell32.dll,OpenAs_RunDLL — открывает диалоговое окно Open With.

Окно Add Printer

rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL AddPrinter — открывает диалоговое окно Add Printer.

Окно About Windows

rundll32.exe shell32,ShellAboutA Info-Box — открывает информационное окно About Windows.

Окно Device Manager

rundll32.exe devmgr.dll DeviceManager_Execute — открывает диалоговое окно Device Manager.

Окно Folder Options

rundll32.exe shell32.dll,Options_RunDLL 0 — открывает диалоговое окно Folder Options (вкладка General).

rundll32.exe shell32.dll,Options_RunDLL 2 — открывает диалоговое окно Folder Options (вкладка Search).

rundll32.exe shell32.dll,Options_RunDLL 7 — открывает диалоговое окно Folder Options (вкладка View).

Окно Taskbar and Start Menu Properties

rundll32.exe shell32.dll,Options_RunDLL 1 — открывает диалоговое окно Taskbar and Start Menu Properties (вкладка Taskbar).

rundll32.exe shell32.dll,Options_RunDLL 3 — открывает диалоговое окно Taskbar and Start Menu Properties (вкладка Start Menu).

rundll32.exe shell32.dll,Options_RunDLL 4 — открывает диалоговое окно Taskbar and Start Menu Properties (вкладка Notification Area).

rundll32.exe shell32.dll,Options_RunDLL 6 — открывает диалоговое окно Taskbar and Start Menu Properties (вкладка Toolbars).

Окно Customize Notification Icons

rundll32.exe shell32.dll,Options_RunDLL 5 — открывает диалоговое окно Customize Notification Icons.

Написание скрипта для настройки Windows Vista

Итак, теперь, когда у нас есть под рукой и справочник по реестру Windows Vista (см. статью «Справочник по реестру Windows Vista» в этом номере журнала), и по DLL-библиотекам, можно приступать к разработке скрипта для автоматизирования процесса настройки системы.

Итак, прежде всего нужно установить программу AutoIt. Мы будем использовать последнюю версию — AutoIt v.3.2.10.0. Для того чтобы начать работу с программой, запускаем утилиту SciTE Script Editor (редактор для написания скрипта). В принципе, можно поступить иначе: создать текстовый файл (пустой) и сохранить его с расширением *.au3. Если потом открыть этот файл (выбираем в контекстном меню файла команду Edit Script), то автоматически запустится SciTE Script Editor.

В главном окне редактора можно набирать нужные команды.

Создание исполняемого скрипта редактирования реестра без экранных форм

Сначала мы рассмотрим пример, как реализовать скрипт для настройки операционной системы без диалоговых окон, то есть как создать исполняемый exe-файл, при запуске которого автоматически будут произведены все нужные настройки без возможности выбора.

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

Для начала рассмотрим пример, когда все настройки можно реализовать только путем внесения изменений в реестр, в том числе такие настройки реестра, которые мы традиционно используем при тестировании компьютеров, процессоров, памяти и т.д.:

  • отключение функции User Account Control (UAC);
  • удаление Windows Vista Sidebar;
  • сокрытие области уведомлений на панели задач;
  • изменение настройки центра безопасности;
  • отключение экранной заставки (Screen Saver);
  • отключение Windows Defender;
  • добавление пункта Take Ownership в контекстное меню файлов;
  • добавление пункта CMD Promt Here as Administartor в контекстное меню папки;
  • запрет запуска службы автоматического обновления Windows;
  • запрет запуска службы синхронизации времени;
  • запрет запуска службы планировщика задач;
  • запрет запуска Remote Registry;
  • запрет запуска службы Windows Firewall;
  • запрет запуска мастера очистки рабочего стола (Desktop Cleanup Wizard);
  • отображение скрытых файлов и папок;
  • отображение расширений всех файлов;
  • отключение функции System Restore.

Все эти, а также многие другие настройки можно реализовать путем правки реестра.

Для работы с реестром в скриптовом языке AutoIt предусмотрены три команды: RegWrite, RegRead и RegDelete. Команда RegWrite предназначена для изменения значения параметра реестра, записи нового параметра в раздел реестра (с присвоением ему значения) или создания нового раздела реестра. Используется следующий синтаксис команды: RegWrite("keyname" [,"valuename", "type", value]), где "keyname" — раздел реестра, "valuename" — параметр раздела реестра, "type" — тип параметра, value — значение параметра.

Команда RegWrite возвращает значение 1 при успешной записи в реестр и 0 — в случае невозможности записать в реестр.

Раздел реестра должен начинаться с указания корневого раздела: HKLM (HKEY_LOCAL_MACHINE), HKU (HKEY_USERS), HKCU (HKEY_CURRENT_USER), HKCR (HKEY_CLASSES_ROOT) или HKCC (HKEY_CURRENT_CONFIG). Если в команде RegWritе указывается только раздел реестра, то создается новый раздел реестра.

AutoIt поддерживает создание параметров следующих типов: REG_BINARY, REG_SZ, REG_MULTI_SZ, REG_EXPAND_SZ и REG_DWORD. Для задания значения параметра по умолчанию (Default) в качестве параметра используется " ".

Команда RegDelete применяется для удаления раздела реестра или параметра раздела реестра. Используется следующий синтаксис команды: RegDelete("keyname" [,"valuename"]). Команда RegDelete возвращает значение 1 при успешной записи в реестр и 0 в случае невозможности записать в реестр.

Команда RegRead применяется для чтения значения параметра реестра. В данном случае используется следующий синтаксис команды: RegRead("keyname", "valuename"), где "keyname" задает раздел реестра, а "valuename" — параметр этого раздела, значение которого нужно считать. В случае успешного выполнения команды данная функция возвращает значение параметра реестра, а в случае неуспешного выполнения — пустую строку (" ").

Итак, вернемся к составлению нашего скрипта.

Для того чтобы отключить функцию User Account Control (UAC), необходимо в разделе реестра HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System присвоить параметру EnableLUA типа REG_DWORD значение 0 (см. статью «Справочник по реестру Windows Vista»). Соответственно используем для этого команду:

RegWrite( "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System", "EnableLUA", "REG_DWORD", 0)

Правда, тут есть один нюанс. Если изначально система была загружена при включенной функции UAC, то скрипт на отключение этой функции в реестре не сработает. Дело в том, что даже если вы вошли в систему с полномочиями администратора, у вас будет запрашиваться подтверждение на выполнении определенных действий. Для автоматизированного скрипта это не годиться. Дабы избежать этой неприятности, нужно добавить в самое начало программы директиву #RequireAdmin. В этом случае все правки в реестре и, в частности, отключение функции UAC, можно производить даже при активированной функции UAC, избегая при этом запросов на подтверждение производимых операций.

Аналогично, пользуясь справочником по настройке реестра, реализуем все остальные настройки. Для того чтобы все изменения вступили в силу, на завершающем этапе выполняется команда перезагрузки системы Shutdown(2). В результате получаем следующий листинг нашего скрипта (комментарии в программе начинаются с символа ";"):

;отключение функции User Account Control (UAC)

RegWrite("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System", "EnableLUA", "REG_DWORD", 0)

;скрытие области уведомлений на панели задач

RegWrite( "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", "NoAutoTrayNotify", "REG_DWORD", 1)

;удаление Windows Vista Sidebar

RegWrite("HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Windows\Sidebar", "TurnOffSidebar", "REG_DWORD", 1)

RegDelete("HKCU\Software\Microsoft\Windows\CurrentVersion\Run\SideBar")

;изменение настройки центра безопасности

RegWrite("HKLM\SOFTWARE\Microsoft\Security Center\Svc\S-1-5-21-1688207787-1353448249-2747669327-1000")

RegWrite("HKLM\SOFTWARE\Microsoft\Security Center\Svc\S-1-5-21-1688207787-1353448249-2747669327-1000", "EnableNotifications", "REG_DWORD", 0)

;отключение экранной заставки (Screen Saver)

RegDelete("HKCU\Control Panel\Desktop", "SCRNSAVE.EXE")

RegWrite("HKCU\Control Panel\Desktop", "ScreenSaveActive", "REG_SZ", 0)

;отключение Windows Defender

RegWrite("HKLM\System\CurrentControlSet\Services\WinDefend", "Start", "REG_DWORD", 4)

RegDelete("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "Windows Defender")

;запрет запуска службы автоматического обновления Windows

RegWrite( "HKLM\System\CurrentControlSet\Services\wuauserv", "Start", "REG_DWORD", 4)

;запрет запуска службы синхронизации времени

RegWrite("HKLM\System\CurrentControlSet\Services\W32Time", "Start", "REG_DWORD", 4)

; запрет запуска службы планировщика задач

RegWrite("HKLM\System\CurrentControlSet\Services\Schedule", "Start", "REG_DWORD", 4)

;запрет запуска Remote Registry

RegWrite("HKLM\System\CurrentControlSet\Services\RemoteRegistry", "Start", "REG_DWORD", 4)

;запрет запуска службы Windows Firewall

RegWrite("HKLM\System\CurrentControlSet\Services\MpsSvc", "Start", "REG_DWORD", 4)

;запрет запуска мастера очистки рабочего стола (Desktop Cleanup Wizard)

RegWrite( "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Desktop\CleanupWiz", "NoRun", "REG_SZ", 1)

RegWrite( "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", "NoDesktopCleanupWizard", "REG_DWORD", 1)

;отображение скрытых файлов и папок

RegWrite("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", "Hidden", "REG_DWORD", 1)

;отображение расширений всех файлов

RegWrite("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", "HideFileExt", "REG_DWORD", 0)

;отключение функции System Restore

RegDelete("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SPP\Clients","{09F7EDC5-294E-4180-AF6A-FB0E6A0E9513}")

RegWrite("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore", "RPSessionInterval", "REG_DWORD", 0)

;перезагружаем систему

Shutdown(2)

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

Как известно, написание кода программы не отнимает много времени. Куда сложнее выявить все баги в нем. Для того чтобы выявить ошибки в коде программы или какую из указанных команд программа не может выполнить, следует добавить в программу обработчик ошибок. Самый простейший вариант такого обработчика следующий. Функции RegWrite, RegDelete и RegRead возвращают значение 0 при неуспешном выполнении операции (возникновении ошибки) — этим обстоятельством можно воспользоваться для написания обработчика ошибок.

Присвоим результат выполнения функций RegWrite, RegDelete и RegRead переменной $Result (переменные и константы должны начинаться с символа $), а также определим строковую константу $string, которой присвоим значение выполняемого действия. Кроме того, определим функцию Error($Result, $string), которой в качестве аргумента передаются переменная $Result и строка $string. Смысл функции Error($Result, $string) заключается в том, что при возникновении ошибки появляется окно сообщений (Message Box). Тогда нашу функцию можно задать следующим образом:

Func Error($Result, $string)

   If $Result=0 Then

     MsgBox(16, "Ошибка!", $string & " не может быть

     выполнено")

   EndIf

EndFunc

В данном примере команда MsgBox(4096, "Ошибка!", "Операция" & $string & "не может быть выполнена") выводит окно сообщения с заголовком «Ошибка!», а само сообщение будет таким: «Операция " & $string & "не может быть выполнена». В данном случае символ & — это операция объединения строк. Заметим, что объявление функции может размещаться в любом месте программы.

Чтобы не приводить весь листинг программного кода, ограничимся лишь рассмотрением обновленного варианта кода для операции отключения функции User Account Control (UAC):

; отключение функции User Account Control (UAC)

$string="отключение функции User Account Control"

$Result=RegWrite("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System", "EnableLUA", "REG_DWORD", 0)

Error($Result, $string)

В этом случае, если, к примеру, возникает ошибка записи в реестр при попытке отключения функции User Account Control, то появляется окно с сообщением: «Отключение функции User Account Control не может быть выполнено» (рис. 5).

 

Рис. 5. Окно с сообщением о возникновении ошибки при записи в реестр

Рис. 5. Окно с сообщением о возникновении ошибки при записи в реестр

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

Создание исполняемого скрипта без экранных форм для автоматизированной настройки диалоговых окон Windows

Как мы уже отмечали, в некоторых случаях реализовать настройки методом редактирования реестра бывает сложно. Тогда приходится прибегать к настройке операционной системы с использованием системных диалоговых окон.

В качестве примера рассмотрим настройку операционной системы на применение всех визуальных эффектов (Adjust for best appearance) в системном окне Performance Options.

Для того чтобы добраться до окна Performance Options, нужно открыть окно System Properties на вкладке Advanced. Для этого можно использовать вызов DLL-библиотеки с помощью консольной команды RunDll32.exe shell32.dll,Control_RunDLL sysdm.cpl,@0,3.

В AutoIt для запуска внешней программы применяется функция Run(), где в качестве параметров указывается путь к внешней программе. В нашем случае необходимо использовать следующий синтаксис команды в скрипте:

Run( "RunDll32.exe shell32.dll,Control_RunDLL sysdm.cpl @0,3")

Выполнение данной команды приведет к открытию диалогового окна System Properties на вкладке Advanced (рис. 6).

 

Рис. 6. Результат выполнения команды

Рис. 6. Результат выполнения команды Run("RunDll32.exe shell32.dll,Control_RunDLL sysdm.cpl @0,3")

Для того чтобы добраться до нужного нам окна Performance Options, необходимо в окне System Properties на вкладке Advanced нажать на кнопку Settings… Вот тут-то нам на помощь и придет возможность скриптового языка AutoIt имитировать нажатие на любую клавишу и работать с контрольными элементами диалоговых окон.

Прежде чем написать код нажатия на клавишу Settings…, нам нужно дождаться появления на экране окна System Properties. Для этого используем команду:

WinWait("System Properties","")

Если открывшееся окно System Properties по каким-то причинам неактивно, нужно активировать его. Для этого применяются команды:

If Not WinActive( "System Properties","")

tThen WinActivate( "System Properties","")

WinWaitActive( "System Properties","")

Далее необходимо передать фокус кнопке Settings… Для передачи фокуса контрольным элементам окна в AutoIt используется команда ControlFocus("title", "text", controlID), где в качестве параметров указываются заголовок окна (title), текст окна (text), если существуют два разных окна с одним заголовком, и идентификатор контрольного элемента (controlID). Соответственно нужно выяснить, какой идентификатор присвоен кнопке Settings…. Для этого нужно воспользоваться утилитой AutoIt Window Info, которая входит в состав дистрибутива программы AutoIt и предназначена для работы с окнами.

В окне AutoIt v3 Window Info переходим на вкладку Control, далее наводим курсор мыши на элемент Finder Tool (похож на указатель прицела) и, удерживая нажатой левую клавишу мыши, перетаскиваем Finder Tool на нужную нам кнопку Settings… в окне System Properties. После этого в окне AutoIt v3 Window Info отобразится информация о кнопке Settings… (рис. 7).

 

Рис. 7. Информация о кнопке Settings… окна System Properties

Рис. 7. Информация о кнопке Settings… окна System Properties

Нам нужен ID этой кнопки. В нашем случае он равен 102. Соответственно для передачи фокуса нужной нам кнопке используем команду:

ControlFocus ("System Properties","", 102)

Ну а для нажатия на эту кнопку применяем аналогичную по синтаксису команду:

ControlClick ("System Properties","", 102)

В результате выполнения этих команд появится диалоговое окно Performance Options (рис. 8).

 

Рис. 8. Окно Performance Options

Рис. 8. Окно Performance Options

В нем нужно проверить, установлен ли переключатель Adjust for best appearance, и если нет, то установить его. Затем нужно нажать на кнопку OK, что приведет к закрытию окна Performance Options. На заключительном этапе в окне System Properties нужно нажать на кнопку OK.

Для проверки переключателя Adjust for best performance мы будем использовать функцию ControlCommand("title", "text", controlID, "command" [, "option"]). Оставляя за рамками этой статьи описание всех параметров данной команды (все-таки это не учебник по AutoIt), отметим лишь, что для проверки состояния переключателя мы будем применять команду: ("command") "IsChecked".

Для установки переключателя (если он не установлен) используется та же самая функция, но с командой "Check".

Таким образом, код для проверки состояния переключателя и его установки будет выглядеть следующим образом:

If ControlCommand( "Performance Options","", 2022,

   "IsChecked")=0 Then

       ControlCommand("Performance Options","", 2022,

       "Check")

EndIf

Полный листинг для реализации данной настройки выглядит следующим образом:

;открываем окно System Properties на вкладке Advanced

Run("RunDll32.exe shell32.dll,Control_RunDLL sysdm.cpl @0,3")

;ждем появления окна System Properties и, если оно неактивно, активируем его

WinWait( "System Properties","")

If Not WinActive( "System Properties","") Then WinActivate( "System Properties","")

WinWaitActive( "System Properties","")

;передаем фокус кнопке Settings… и нажимаем на кнопку

ControlFocus ("System Properties","", 102)

ControlClick ("System Properties","", 102)

;ждем открытия окна Performance Options и, если оно неактивно, активируем его

WinWait( "Performance Options","")

If Not WinActive( "Performance Options","") Then WinActivate( "Performance Options","")

WinWaitActive("Performance Options","")

;проверяем состояние переключателя Adjust for best appearance и, если он не установлен, устанавливаем его

If ControlCommand( "Performance Options","", 2022, "IsChecked")=0 Then

   ControlCommand( "Performance Options","", 2022, "Check")

EndIf

;передаем фокус кнопке ОК, нажимаем на кнопку и ждем закрытия окна

ControlFocus ("Performance Options","", 1)

ControlClick ("Performance Options","", 1)

WinWaitClose ("Performance Options","")

;активируем окно System Properties

If Not WinActive("System Properties","") Then WinActivate("System Properties","")

WinWaitActive("System Properties","")

;передаем фокус кнопке ОК, нажимаем на кнопку и ждем закрытия окна System Properties

ControlFocus ("System Properties","", 1)

ControlClick ("System Properties","", 1)

WinWaitClose ("Performance Options","")

Отметим, что приведенный скрипт может работать некорректно, если перед его запуском имеются открытые из числа тех, что используются в скрипте. Поэтому целесообразно добавить в начало этого скрипта небольшой программный код, позволяющий закрывать открытые окна Performance Options и System Properties. Этот программный код может выглядеть следующим образом:

If WinGetState( "Performance Options")<>0 then WinClose( "Performance Options")

If WinGetState( "System Properties")<>0 then WinClose( "System Properties")

Настройки с применением других системных окон производятся аналогичным образом. В качестве еще одно примера рассмотрим отключение экранной заставки (Screen Saver). Отметим, что эту настройку проще реализовать через редактирование реестра (и в нашем листинге именно так и сделано). Этот простой пример позволяет нам познакомиться с еще одним контрольным элементом системного окна — списком.

Итак, для реализации данной настройки нужно вызвать системное окно Screen Saver Settings. Далее необходимо открыть список Screen Saver и выбрать в нем пункт (None). После этого нажимаем на кнопку OK.

Текст программного кода на AutoIt будет в этом случае следующий:

;закрываем окно Screen Saver Settings, если оно открыто

If WinGetState("Screen Saver Settings")<>0 then WinClose("Screen Saver Settings")

;открываем окно Screen Saver Settings

Run("RunDll32.exe shell32.dll,Control_RunDLL desk.cpl @0,1")

;ждем появления окна Screen Saver Settings и, если оно неактивно, активируем его

WinWait("Screen Saver Settings","")

If Not WinActive("Screen Saver Settings", "") Then WinActivate("Screen Saver Settings", "")

WinWaitActive("Screen Saver Settings", "")

;открываем список Screen Saver и выбираем в нем пункт (None)

ControlFocus ("Screen Saver Settings", "", 1300, "ShowDropDown", "")

ControlFocus ("Screen Saver Settings", "", 1300, "SelectString", "(None)")

;передаем фокус кнопке OK и нажимаем на кнопку

ControlFocus ("Screen Saver Settings", "", 1)

ControlClick ("Screen Saver Settings", "", 1)

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

При написании кода на AutoIt большую помощь может оказать не только утилита AutoIt Window Info, но и стороння утилита AU3Record 3.1, которая позволит немного автоматизировать процесс написания скрипта. Данная утилита отслеживает все действия пользователя (движения мыши, нажатия на клавиши) и переводит их в программный код. Конечно, код, формируемый утилитой AU3Record 3.1, далек от совершенства, но его вполне можно использовать в качестве отправной точки для дальнейшей работы.

Создание скрипта с экранной формой

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

С помощью языка AutoIt можно создавать экранные формы и все контрольные элементы, используя соответствующие команды, определяющие размеры экранных форм, координаты контрольных элементов и т.д. Однако существует и более продуктивный способ — воспользоваться утилитой Koda (текущая версия 1.7.0.1), которая представляет собой конструктор экранных форм, специально разработанный для AutoIt (рис. 9).

 

Рис. 9. Создание экранной формы с помощью утилиты Koda

Рис. 9. Создание экранной формы с помощью утилиты Koda

Данная утилита позволяет легко создавать экранные формы, размещать на них контрольные элементы и генерировать соответствующий код программы на AutoIt. В частности, можно создавать окна с множеством вкладок, что очень удобно при создании твикера. На одной закладке Настройка рабочего стола можно разместить контрольные элементы (флажки) выбора настроек только рабочего стола, другую вкладку посвятить настройке панели задач и т.д. (рис. 10).

 

Рис. 10. Экранная форма, созданная за пять минут с использованием утилиты Koda

Рис. 10. Экранная форма, созданная за пять минут с использованием утилиты Koda

Утилита Koda автоматически создает программный код, соответствующий созданной экранной форме и всем контрольным элементам (рис. 11).

 

Рис. 11. Программный код, сгенерированный утилитой Koda, соответствует созданной экранной форме

Рис. 11. Программный код, сгенерированный утилитой Koda, соответствует созданной экранной форме

После того как код сгенерирован, остается лишь написать код обработки всех контрольных элементов формы.

Заключение

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

 

В начало В начало

КомпьютерПресс 4'2008

Наш канал на Youtube

1999 1 2 3 4 5 6 7 8 9 10 11 12
2000 1 2 3 4 5 6 7 8 9 10 11 12
2001 1 2 3 4 5 6 7 8 9 10 11 12
2002 1 2 3 4 5 6 7 8 9 10 11 12
2003 1 2 3 4 5 6 7 8 9 10 11 12
2004 1 2 3 4 5 6 7 8 9 10 11 12
2005 1 2 3 4 5 6 7 8 9 10 11 12
2006 1 2 3 4 5 6 7 8 9 10 11 12
2007 1 2 3 4 5 6 7 8 9 10 11 12
2008 1 2 3 4 5 6 7 8 9 10 11 12
2009 1 2 3 4 5 6 7 8 9 10 11 12
2010 1 2 3 4 5 6 7 8 9 10 11 12
2011 1 2 3 4 5 6 7 8 9 10 11 12
2012 1 2 3 4 5 6 7 8 9 10 11 12
2013 1 2 3 4 5 6 7 8 9 10 11 12
Популярные статьи
КомпьютерПресс использует