Твикер для Windows 8 своими руками
Инструменты для написания твикера
Большинство обычных пользователей вообще никогда не настраивают операционную систему, предпочитая использовать настройки по умолчанию. Однако более продвинутые пользователи настраивают систему под свои вкус и задачи. Кто-то понимает под настройкой изменение внешнего вида рабочего стола, кто-то предпочитает отказаться от всех визуальных эффектов в пользу производительности, а кто-то реализует тонкую настройку операционной системы, отключая все неиспользуемые службы, и т.д. В общем, вариантов индивидуальной настройки ОС предостаточно.
Настройку операционной системы можно производить тремя способами:
- с использованием встроенных в ОС средств настройки;
- путем ручной правки реестра;
- с помощью специализированных утилит по настройке (твикеров).
Вообще, настройку ОС с помощью встроенных средств настройки и путем правки реестра можно отнести к ручной настройке. Причем на практике применяются одновременно оба способа настройки, поскольку в каждом варианте есть свои плюсы и минусы. Так, ручная правка реестра операционной системы — это, действительно, очень эффективный способ настройки. В данном случае любые изменения настроек операционной системы и установленных приложений в конечном счете сводятся к изменению тех или иных ключей реестра. Однако этот способ нельзя назвать простым. Для правки реестра нужно иметь под рукой справочник, поскольку запомнить, что и где нужно править, просто невозможно. Ну и, кроме того, это достаточно длительный по времени процесс, а ошибки правки ключей реестра могут иметь очень негативные последствия.
С одной стороны, использовать только встроенные в операционную систему средства настройки, достаточно просто — это под силу даже начинающим пользователям. С другой — данный способ настройки не всесилен и реализовать тонкую настройку таким образом не удастся.
Специализированные утилиты по настройке объединяют все преимущества как первого, так и второго способа. Действительно, большинство твикеров представляет собой единый центр контроля для доступа к различным встроенным в операционную систему средствам по настройке, то есть позволяют быстро открыть нужное диалоговое окно настройки, благодаря чему пользователю не придется вспоминать, где находится нужное ему диалоговое окно. Кроме того, любой твикер — это, по сути, специализированный редактор реестра. Однако, в отличие от традиционного редактора regedit, в данном случае мы имеем удобный интерфейс, исключающий утомительный поиск нужных параметров в реестре, обеспечивающий доступ только к тем разделам реестра, которые предусмотрены твикером, и, что особенно важно, не позволяющий задавать некорректное значение параметров (то есть ошибиться невозможно).
Программных твикеров для настройки операционной системы существует достаточно много, но найти нужный именно вам — не такая уж простая задача. Стандартные твикеры — это универсальные инструменты для настройки ОС, но именно это качество в ряде случаев становится их недостатком. Дело в том, что в силу своей универсальности любой твикер предлагает огромное количество настроек, большая часть которых лично вам не нужна. Кроме того, опять-таки по причине универсальности твикер предполагает диалог с пользователем, то есть варианты различных настроек. С одной стороны, это хорошо, а с другой — не позволяет автоматизировать процесс настройки. Если, к примеру, вам нужно произвести одинаковую настройку нескольких систем, то использовать универсальные твикеры — это не лучший вариант, поскольку каждый раз нужно будет выбирать одни и те же опциональные настройки в твикерах, что не очень удобно, поскольку можно легко ошибиться.
Для решения подобных задач однотипной настройки лучше воспользоваться узкоспециализированным твикером, позволяющим выполнить всю настройку в автоматическом режиме буквально нажатием одной кнопки. Но, увы, таких специализированных твикеров просто-напросто нет, да и не может быть, поскольку в данном случае всё зависит от того, какие именно настройки должны быть произведены. Единственный вариант — создать такой узкоспециализированный твикер самостоятельно. Причем разработка собственного твикера — это, во-первых, совсем несложно, а во-вторых, — очень интересно.
В настоящей статье мы расскажем о том, как создать собственный твикер для настройки операционной системы Windows 8 (его также можно использовать и для настройки ОС Windows 7). Отметим, что данная статья ориентирована на читателей, которые никогда не занимались программированием. В то же время это не учебник по программированию — надеемся, что пользователи знакомы со школьным базовым курсом информатики. Кроме того, рассчитываем, что читатели знают, что такое реестр и как он редактируется. Заметим также, что вы не найдете здесь законченных листингов программ, однако в статье будет масса примеров выполнения различных настроек. То есть мы попытаемся рассказать вам о мощном инструменте, с помощью которого вы сможете легко создавать твикеры для собственных нужд.
Инструменты для написания твикера
Итак, что же нам потребуется для написания твикера? Прежде всего нужен язык программирования, который, во-первых, должен быть простым в освоении, а во-вторых — уметь работать с реестром.
Конечно, можно воспользоваться такими популярными языками программирования, как Visual C#, Visual C++, или другими, входящими в пакет Visual Studio. Однако эти языки программирования, хотя и обладают огромными функциональными возможностями, но сложны в освоении. Поэтому оптимальным выбором для решения нашей задачи будет скриптовый язык AutoIt, который изначально разрабатывался как средство для создания скриптов автоматизации (иногда называемых макросами) для программ Microsoft Windows, то есть скриптов для выполнения часто повторяющихся задач, таких как инсталляция идентичных наборов программ на большое количество компьютеров. В более поздних версиях AutoIt улучшился дизайн языка и возросла общая функциональность, что приблизило его к языкам общего назначения. Сегодня AutoIt — это самый мощный инструмент для написания различных скриптов. Кроме того, этот язык можно эффективно применять для создания разнообразных небольших приложений.
Достоинством данного языка является его простота, а также наличие встроенного компилятора и вспомогательных утилит. Этот скриптовый язык поддерживает работу с объектами COM (Сomponent Object Modelling), вызов функций из 32-битных динамических библиотек, множество API-функций, имитацию работы с мышью и нажатия любых клавиш на клавиатуре, а также многое другое. Кроме того, в AutoIt имеется возможность создавать оконные формы (GUI) со стандартными элементами управления. И самое главное — этот язык позволяет работать с реестром системы.
Кроме всего прочего, AutoIt распространяется бесплатно, и его можно загрузить с сайта производителя www.autoitscript.com. Нелишним будет отметить, что в языке AutoIt реализована отличная система справки с примерами кода. Правда, справка реализована на английском языке, но на сайтах, посвященных этому языку, можно скачать и ее русскоязычную версию.
От теории к практике
Для написания твикера мы будем использовать справочник по реестру Windows 8, который можно найти в этом номере журнала.
Итак, прежде всего нужно установить программу AutoIt. Мы будем использовать последнюю версию — AutoIt v.3.3.8.1. Для того чтобы начать работу с программой, запускаем утилиту SciTE Script Editor (редактор для написания скрипта). В принципе, можно поступить и иначе: создать текстовый файл (пустой) и сохранить его с расширением *.au3. Если потом открыть этот файл (выбираем в контекстном меню файла команду EditScript), то автоматически запустится редактор SciTE Script Editor, в главном окне которого можно набирать нужные команды.
Сначала мы рассмотрим пример, как реализовать скрипт для настройки операционной системы без диалоговых окон, то есть как создать исполняемый EXE-файл, при запуске которого автоматически будут произведены все нужные настройки без возможности выбора.
Для этого нам нужно прежде сформировать список всех необходимых настроек, которые можно реализовать путем внесения изменений в реестр. В качестве примера рассмотрим список тех настроек, которые мы традиционно производим при тестировании компьютеров и ноутбуков, оснащенных SSD-накопителем. Последнее обстоятельство особенно важно, поскольку для SSD-накопителей целесообразно отключить такие функции, как Boot defrag, Boot Prefetching, Application Launch Prefetching, SuperFetch, а также фоновую дефрагментацию и авторазметку.
Итак, список наших настроек следующий:
- настройка функции User Account Control (UAC);
- отключение Windows SmartScreen;
- запрет запуска Remote Registry;
- запрет запуска службы Windows Firewall;
- запрет запуска службы Windows Defender;
- запрет запуска службы Security Center;
- запрет запуска службы автоматического обновления Windows;
- удаление стрелок с ярлыков на рабочем столе;
- сокрытие области уведомлений на панели задач;
- отображение всех иконок и уведомлений в области Tray;
- отключение экранной заставки (Screen Saver);
- запрет запуска мастера очистки рабочего стола (Desktop Cleanup Wizard);
- установка режима визуальных эффектов;
- отображение значка Computer на рабочем столе;
- отображение значка Control Panel на рабочем столе;
- отображение значка User’s Files (Файлы пользователя) на рабочем столе;
- отображение значка Network на рабочем столе;
- уменьшение размера иконок на панели задач;
- задание режима группировки кнопок на панели задач;
- добавление пункта Take Ownership в контекстное меню файлов;
- отображение скрытых файлов и папок;
- отображение расширений всех файлов;
- использование флажков (check box) для выделения файлов и папок в проводнике;
- изменение региональных настроек;
- изменение информации об OEM-производителе компьютера;
- увеличение скорости открытия окон;
- отключение функции Boot defrag;
- отключение функций Boot Prefetching и Application Launch Prefetching;
- отключение функции функции SuperFetch;
- отключение фоновой дефрагментации диска;
- отключение фоновой авторазметки диска.
Все эти, а также многие другие настройки можно реализовать путем правки реестра. Для работы с реестром в скриптовом языке 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 присвоить параметрам PromptOnSecureDesktop и ConsentPromtBehaviorAdmin типа REG_DWORD значение 0. Используем для этого команду:
RegWrite("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System", "PromptOnSecureDesktop", "REG_DWORD", 0)
RegWrite("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System", "ConsentPromtBehaviorAdmin", "REG_DWORD", 0)
Правда, тут есть один нюанс. Если изначально система была загружена при включенной функции UAC, то скрипт на ее отключение в реестре не сработает. Дело в том, что даже если вы вошли в систему с полномочиями администратора, то у вас будет запрашиваться подтверждение на выполнение определенных действий. Для автоматизированного скрипта это не годится. Дабы избежать этой неприятности, в самое начало программы нужно добавить директиву #RequireAdmin. В этом случае все правки в реестре, в частности отключение функции UAC, можно производить даже при активированной функции UAC, избегая при этом запросов на подтверждение производимых операций.
Аналогично, пользуясь справочником по настройке реестра, реализуем все остальные настройки. В результате получаем следующий листинг нашего скрипта (комментарии в программе начинаются с символа «;»):
; настройкафункции User Account Control (UAC)
RegWrite("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System", "PromptOnSecureDesktop", "REG_DWORD", 0)
RegWrite("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System", "ConsentPromtBehaviorAdmin", "REG_DWORD", 0)
;отключение Windows SmartScreen
RegWrite("HKLM\SOFTWARE\Policies\Microsoft\Windows\System", "EnableSmartScreen", "REG_DWORD", 0)
;запретзапуска Remote Registry
RegWrite("HKLM\System\CurrentControlSet\Services\RemoteRegistry", "Start", "REG_DWORD", 4)
;запретзапускаслужбы Windows Firewall
RegWrite("HKLM\System\CurrentControlSet\Services\MpsSvc", "Start", "REG_DWORD", 4)
;запретзапускаслужбы Windows Defender
RegWrite("HKLM\System\CurrentControlSet\Services\ WinDefend ", "Start", "REG_DWORD", 4)
;запретзапускаслужбы Security Center
RegWrite("HKLM\System\CurrentControlSet\Services\ wscsvc", "Start", "REG_DWORD", 4)
;запрет запуска службы автоматического обновления Windows
RegWrite("HKLM\System\CurrentControlSet\Services\wuauserv", "Start", "REG_DWORD", 4)
RegWrite("HKLM\Software\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update", "AUOptions", "REG_DWORD", 1)
;удаление стрелок с ярлыков на рабочем столе
RegDelete ("HKLM\SOFTWARE\Classes\lnkfile", "IsShortcut")
RegWrite ("HKLM\SOFTWARE\Classes\lnkfile", "IsNotShortcut", "REG_SZ", "")
;скрытие области уведомлений на панели задач
RegWrite ("HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", "NoAutoTrayNotify", "REG_DWORD", 1)
;отображение всех иконок и уведомлений в области Tray
RegWrite ("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer", "EnableAutoTray", "REG_DWORD", 0)
;отключение экранной заставки (ScreenSaver)
RegWrite("HKCU\Control Panel\Desktop", "ScreenSaveActive", "REG_SZ", 0)
;запрет запуска мастера очистки рабочего стола (DesktopCleanupWizard)
RegWrite("HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", "NoDisktopCleanupWizard", "REG_DWORD", 1)
;установка режима визуальных эффектов по умолчанию
RegWrite("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\VisualEffects", "VisualFXSetting", "REG_DWORD", 3)
;отображение значка Computer на рабочем столе
RegWrite("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel", "{20D04FE0-3AEA-1069-A2D8-08002B30309D}", "REG_DWORD", 0)
;отображение значка Control Panel на рабочем столе
RegWrite("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel", "{5399E694-6CE5-4D6C-8FCE-1D8870FDCBA0}", "REG_DWORD", 0)
;отображение значка User’s Files (Файлы пользователя) на рабочем столе
RegWrite("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel", "{59031a47-3f72-44a7-89c5-5595fe6b30ee}", "REG_DWORD", 0)
;отображение значка Network на рабочем столе
RegWrite("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel", "{F02C1A0D-BE21-4350-88B0-7367FC96EF3C}", "REG_DWORD", 0)
;уменьшение размера иконок на панели задач
RegWrite("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", "TaskbarSmallIcons", "REG_DWORD", 1)
;задание режима группировка кнопок на панели задач
RegWrite("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", "TaskbarGlomLevel", "REG_DWORD", 1)
;добавление пункта TakeOwnership в контекстное меню файлов
RegWrite("HKLM\SOFTWARE\Classes\*\shell\runas")
RegWrite("HKLM\SOFTWARE\Classes\*\shell\runas", "(Default)", "REG_SZ", "Take Ownership" )
RegWrite("HKLM\SOFTWARE\Classes\*\shell\runas", "NoWorkingDirectory", "REG_SZ", " ")
RegWrite("HKLM\SOFTWARE\Classes\*\shell\runas\command")
RegWrite("HKLM\SOFTWARE\Classes\*\shell\runas\command", "IsolatedCommand", "REG_SZ", ‘cmd.exe /c takeown /f “%1” && icalcs “%1” /grant administrators:F’)
RegWrite("HKLM\SOFTWARE\Classes\*\shell\runas\command", "(Default)", "REG_SZ", 'cmd.exe /c takeown /f "%1" && icalcs "%1" /grant administrators:F')
;отображениескрытыхфайловипапок
RegWrite("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", "Hidden", "REG_DWORD", 1)
;отображениерасширенийвсехфайлов
RegWrite("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", "HideFileExt", "REG_DWORD", 0)
;использование флажков (check box) для выделения файлов и папок в проводнике
RegWrite("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", "AutoCheckSelect", "REG_DWORD", 1)
;изменениерегиональныхнастроек
RegWrite("HKCU\Control Panel\International", "Locale", "REG_SZ", "00000419")
RegWrite("HKCU\Control Panel\International", "LocaleName", "REG_SZ", "ru-RU")
RegWrite("HKCU\Control Panel\International", "s1159", "REG_SZ", " ")
RegWrite("HKCU\Control Panel\International", "s2359", "REG_SZ", " ")
RegWrite("HKCU\Control Panel\International", "sCountry", "REG_SZ", "Russia")
RegWrite("HKCU\Control Panel\International", "sCurrency", "REG_SZ", "р.")
RegWrite("HKCU\Control Panel\International", "sDate", "REG_SZ", ".")
RegWrite("HKCU\Control Panel\International", "sDecimal", "REG_SZ", ",")
RegWrite("HKCU\Control Panel\International", "sGrouping", "REG_SZ", "3;0")
RegWrite("HKCU\Control Panel\International", "sLanguage", "REG_SZ", "RUS")
RegWrite("HKCU\Control Panel\International", "sList", "REG_SZ", ";")
RegWrite("HKCU\Control Panel\International", "sLongDate", "REG_SZ", "d MMMM yyyy 'г.'")
RegWrite("HKCU\Control Panel\International", "sMonDecimalSep", "REG_SZ", ",")
RegWrite("HKCU\Control Panel\International", "sMonGrouping", "REG_SZ", "3;0")
RegWrite("HKCU\Control Panel\International", "sMonThousandSep", "REG_SZ", " ")
RegWrite("HKCU\Control Panel\International", "sShortDate", "REG_SZ", "dd.MM.yyyy")
RegWrite("HKCU\Control Panel\International", "sShortTime", "REG_SZ", "H:mm")
RegWrite("HKCU\Control Panel\International", "sThousand", "REG_SZ", " ")
RegWrite("HKCU\Control Panel\International", "sTime", "REG_SZ", ":")
RegWrite("HKCU\Control Panel\International", "sTimeFormat", "REG_SZ", "H:mm:ss")
RegWrite("HKCU\Control Panel\International", "sYearMonth", "REG_SZ", "MMMM yyyy")
RegWrite("HKCU\Control Panel\International", "iCountry", "REG_SZ", 7)
RegWrite("HKCU\Control Panel\International", "iCurrency", "REG_SZ", 3)
RegWrite("HKCU\Control Panel\International", "iDate", "REG_SZ", 1)
RegWrite("HKCU\Control Panel\International", "iFirstDayOfWeek", "REG_SZ", 0)
RegWrite("HKCU\Control Panel\International", "iMeasure", "REG_SZ", 0)
RegWrite("HKCU\Control Panel\International", "iNegCurr", "REG_SZ", 8)
RegWrite("HKCU\Control Panel\International", "iPaperSize", "REG_SZ", 9)
RegWrite("HKCU\Control Panel\International", "iTime", "REG_SZ", 1)
;изменение информации об OEM-производителе компьютера
RegWrite("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation", "Manufacturer", "REG_SZ", "ComputerPress")
RegWrite("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation", "Model", "REG_SZ", "Test")
;увеличениескоростиоткрытияокон
RegWrite("HKCU\Control Panel\Desktop", "MenuShowDelay", "REG_SZ", 0)
;отключениефункции Boot defrag
RegWrite("HKLM\SOFTWARE\Microsoft\Dfrg\BootOptimizeFunction", "Enable", "REG_SZ", "N")
;отключениефункций Boot Prefetching и Application Launch Prefetching
RegWrite("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters", "EnablePrefetcher", " REG_DWORD", 0)
;отключениефункциифункции SuperFetch
RegWrite("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters", "EnableSuperfetch", " REG_DWORD", 0)
;отключениефоновойдефрагментациидиска
RegWrite("HKLM\SOFTWARE\ Microsoft\Dfrg\BootOptimizeFunction", "Enable", "REG_SZ", “N”)
;отключениефоновойавторазметкидиска
RegWrite("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ OptimalLayout", "EnableAutoLayout", "REG_DWORD", 0)
После того как код программы написан, его можно апробировать. Для этого достаточно нажать клавишу F5 или выбрать на панели инструментов в меню Tools команду Go. Если всё работает как нужно, можно скомпилировать скрипт в исполняемый EXE-файл. Однако не стоит торопиться, поскольку наш скрипт еще далек от совершенства.
Как известно, написание кода программы не отнимает много времени. Куда сложнее выявить в нем все баги. Для того чтобы выявить ошибки в коде программы или узнать, какую из указанных команд программа не может выполнить, следует добавить в программу обработчик ошибок. Простейший вариант такого обработчика следующий. Функции RegWrite и RegDelete и возвращают значение 0 при неуспешном выполнении операции (возникновении ошибки) — этим обстоятельством можно воспользоваться для написания обработчика ошибок.
Присвоим результат выполнения функций RegWrite и RegDelete переменной $Result (переменные и константы должны начинаться с символа $), а также определим строковую константу $string, которой присвоим значение выполняемого действия. Кроме того, определим функцию Error($Result, $string), которой в качестве аргумента передаются переменная $Result и строка $string. Смысл функции Error($Result, $string) заключается в том, что при возникновении ошибки появляется окно сообщений (Message Box). Тогда нашу функцию можно задать следующим образом:
Func Error($Result, $string)
If $Result=0 Then
MsgBox(48, "Ошибка!", "Операция "& $string & " не может быть выполнена")
EndIf
EndFunc
В данном примере команда MsgBox(48, "Ошибка!", "Операция "& $string & " не может быть выполнена") выводит окно сообщения с заголовком «Ошибка!», а само сообщение будет таким: «Операция " & $string & "не может быть выполнена». Cимвол & — это операция объединения строк. Заметим, что объявление функции может размещаться в любом месте программы.
Чтобы не приводить весь листинг программного кода, ограничимся лишь рассмотрением обновленного варианта кода для операции отключения функции UserAccountControl (UAC):
$string="отключение функции User Account Control"
$Result=RegWrite("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System", "EnableLUA", "REG_DWORD", 0)
Error($Result, $string)
В этом случае, если, к примеру, возникает ошибка записи в реестр при попытке отключения функции UserAccountControl, появляется окно с сообщением: «Отключение функции User Account Control не может быть выполнено».
На следующем шаге написания скрипта в конце можно добавить очень простой код:
$Action=MsgBox(1, "", "Для завершения настройки системы необходимо перезагрузить компьютер" & @CRLF & "Нажмите "OK", чтобы перезагрузить прямо сейчас")
If $Action=1 Then
Shutdown(2)
ElseIf $Action=2 Then
Exit
EndIf
Собственно, речь идет о добавлении команды Shutdown(2), которая приведет к перезагрузке системы после внесения всех изменений в реестр. Это необходимо сделать просто потому, что большинство изменений в реестре вступают в силу только после перезагрузки системы. А значит, завершающим этапом нашего твикера должна стать перезагрузка системы.
Однако в нашем примере прежде на экран выводится диалоговое окно с двумя кнопками: OK и Cancel и предложением: «Для завершения настройки системы необходимо перезагрузить компьютер. Нажмите OK, чтобы перезагрузить прямо сейчас». Если пользователь нажимает кнопку OK, то происходит перезагрузка системы, а если на кнопку Cancel, то скрипт завершается.
В принципе, мы получили вполне рабочую программу настройки операционной системы и на этом этапе можно скомпилировать EXE-файл.
Однако можно еще больше усовершенствовать нашу утилиту.
Дело в том, что, несмотря на широкие возможности по настройке операционной системы методом правки реестра, возможности данного способа небезграничны. Существуют специфические настройки, которые очень просто реализовать встроенными средствами операционной системы, но практически невозможно путем редактирования реестра. Проблема заключается в том, что иногда одна настройка операционной системы приводит к необходимости корректировки большого числа параметров реестра, причем может оказаться и так, что некоторые из них являются уникальными для данной конфигурации компьютера и не могут быть перенесены на другой ПК.
Попробуйте, к примеру, выполнить настройку режима энергопотребления путем редактирования реестра. Это фактически невозможно. Поэтому для создания по-настоящему функционального твикера нам нужно дополнить его теми настройками, которые невозможно реализовать через реестр.
Для этого нам нужно, чтобы, во-первых, наш твикер умел автоматически вызывать необходимые диалоговые окна, через которые можно реализовать нужные настройки системы, а во-вторых, чтобы он умел работать с этими диалоговыми окнами, то есть отмечать нужные флажки или радиокнопки (переключатели) и нажимать на нужные кнопки. Благо, возможности языка AutoIt позволяют очень просто реализовать такой программный код.
Многие диалоговые окна Windows могут быть вызваны как DLL-библиотеки. Для этого используется команда Rundll32.exe с параметрами. К примеру, для запуска любого элемента контрольной панели применяется следующий синтаксис команды:
Rundll32.exe shell32.dll,Control_RunDLL *.cpl,
где *.cpl — это файл, отвечающий какому-либо модулю контрольной панели. Так, чтобы вызвать окно самой контрольной панели, в AutoIt используется команда Run("Rundll32.exe shell32.dll,Control_RunDLL"), а команда Riun("Rundll32.exe shell32.dll,Control_RunDLL intl.cpl @0,0") откроет диалоговое окно Regional and Language Options на вкладке Formats.
Подробный справочник по DLL-библиотекам можно найти в Интернете. Кроме того, большинство DLL-библиотек, отвечающих за системные диалоговые окна, доступ к которым осуществляется через контрольную панель (файлы с расширением *.cpl), можно найти в разделе реестра HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ControlPanel.
Отметим, что не все диалоговые окна Windows можно вызвать указанным способом. Есть окна, которые, хотя и могут быть вызваны, но вот работа с их контрольными элементами просто невозможна в том смысле, что скриптовый язык AutoIt просто не может идентифицировать в них контрольные элементы. В качестве примера можно привести окно "Power Options" для настройки схемы энергопотребления.
Вызов этого окна в программе, написанной на AutoIt, выглядит следующим образом:
Run("RunDll32.exe shell32.dll,Control_RunDLL powercfg.cpl, ,1")
Однако все опциональные настройки, расположенные в древовидной структуре, оказываются недоступными для языка AutoIt. Увы, но информационная утилита AutoIt Window Info, которая используется для идентификации контрольных элементов в окнах и поставляется вместе с языком AutoIt, в данном случае бессильна.
Отметим, что реализовать настройку схемы энергопотребления через реестр также невозможно. Но даже в такой ситуации выход есть. Для настройки схемы энергопотребления мы воспользуемся командой powercfg.exe, которая запускается в командной строке.
У этой команды есть очень много различных параметров, с которыми можно ознакомиться, набрав в командной строке powercfg.exe /?
С помощью этой команды, можно, настроив схему энергопотребления, экспортировать ее в POW-файл, а потом в скрипте настройки вставить команду для импортирования созданного POW-файла.
Но можно поступить и проще. Если для настройки схемы энергопотребления требуется лишь указать время, через которое отключается монитор, время, через которое компьютер уходит в сон, время, через которое отключаются диски, и время, через которое наступает режим гибернации, то проще воспользоваться командой powercfg.exe с соответствующими параметрами.
Предположим, мы хотим сделать так, чтобы монитор и диски никогда не отключались, а компьютер не уходил в состояние сна и в режим гибернации. Соответствующие этим режимам параметры команды powercfg, при условии, что настраивается режим питания от электросети (AC), будут следующие:powercfg.exe/CHANGE monitor-timeout-ac 0
powercfg.exe /CHANGE disk-timeout-ac 0
powercfg.exe /CHANGE standby-timeout-ac 0
powercfg.exe /CHANGE hibernate-timeout-ac 0
Если требуется настроить схему энергопотребления ноутбука, то вместо параметра -ac нужно вставить -dc.
Ну а чтобы вставить эти команды в наш скрипт, перепишем их на языке AutoIt:
RunWait(@ComSpec & " /c " & 'powercfg.exe /CHANGE monitor-timeout-ac 0', "", @SW_HIDE)
RunWait(@ComSpec & " /c " & 'powercfg.exe /CHANGE disk-timeout-ac 0' , "", @SW_HIDE)
RunWait(@ComSpec & " /c " & 'powercfg.exe /CHANGE standby-timeout-ac 0', "", @SW_HIDE)
RunWait(@ComSpec & " /c " & 'powercfg.exe /CHANGE hibernate-timeout-ac 0', "", @SW_HIDE)
Ну и напоследок назовем еще пару усовершенствований, которые имеет смысл сделать в скрипте для настройки Windows.
В нашем скрипте практически все настройки будут работать как для операционной cиcтемы Windows 8, так и для Windows 7, за исключением двух. Первая из них — это отключение функции Windows SmartScreen, которая имеется лишь в Windows 8. Для того чтобы учесть это обстоятельство и сделать скрипт настройки применимым как для Windows 7, так и для Windows 8, нужно сделать так, чтобы отключение функции Windows SmartScreen происходило только в том случае, если установлена операционная система Windows 8.
Вторая настройка, которую следует изменить с учетом особенностей Windows 8, — это настройка схемы энергопотребления. Дело в том, что синтаксис команды powercfg.exe в Windows 8 несколько отличается от ее синтаксиса в Windows 7, и учесть это обстоятельство довольно просто. В случае Windows 8 мы будем использовать один синтаксис команды powercfg.exe, а в случае Windows 7 — другой.
В AutoIt тип установленной операционной системы можно определить с помощью оператора (встроенного макроса) @OSVersion. Если установлена операционная система Windows 8, то этот оператор возвращает строку "WIN_2008".
Для того чтобы отключение функции Windows SmartScreen происходило только для операционной системы Windows 8, используем условный оператор If:
If @OSVersion="WIN_2008" then
$string="отключение Windows SmartScreen"
$Result=RegWrite("HKLM\SOFTWARE\Policies\Microsoft\Windows\System", "EnableSmartScreen", "REG_DWORD", 0)
Error($Result, $string)
EndIf
Аналогично учитываем и разницу в синтаксисах команды powercfg.exe для Windows 8 и Windows 7:
If @OSVersion=”WIN_2008” then
RunWait(@ComSpec & “ /c “ & ‘powercfg.exe /CHANGE monitor-timeout-ac 0’, “”, @SW_HIDE)
RunWait(@ComSpec & “ /c “ & ‘powercfg.exe /CHANGE disk-timeout-ac 0’ , “”, @SW_HIDE)
RunWait(@ComSpec & “ /c “ & ‘powercfg.exe /CHANGE standby-timeout-ac 0’, “”, @SW_HIDE)
RunWait(@ComSpec & “ /c “ & ‘powercfg.exe /CHANGE hibernate-timeout-ac 0’, “”, @SW_HIDE)
Else
RunWait(@ComSpec & “ /c “ & ‘powercfg.exe -CHANGE -monitor-timeout-ac 0’, “”, @SW_HIDE)
RunWait(@ComSpec & “ /c “ & ‘powercfg.exe -CHANGE -disk-timeout-ac 0’ , “”, @SW_HIDE)
RunWait(@ComSpec & “ /c “ & ‘powercfg.exe -CHANGE -standby-timeout-ac 0’, “”, @SW_HIDE)
RunWait(@ComSpec & “ /c “ & ‘powercfg.exe -CHANGE -hibernate-timeout-ac 0’, “”, @SW_HIDE)
EndIf
Ну и последнее существенное изменение, которое мы внесем в наш скрипт, — это добавление GUI-формы с возможностью выбора опций.
Напомним, что в нашем скрипте есть несколько настроек, которые имеет смысл делать только для SSD-накопителей, но они бессмысленны для HDD-дисков. К ним относятся следующие настройки:
- отключение функции Boot defrag;
- отключение функций Boot Prefetching и Application Launch Prefetching;
- отключение функции функции SuperFetch;
- отключение фоновой дефрагментации диска;
- отключение фоновой авторазметки диска.
Следовательно, для того чтобы использовать скрипт настройки на системах и с SSD, и с HDD, было бы весьма кстати создать графический интерфейс для утилиты настройки (GUI-форму) с контрольными элементами типа радиокнопок, позволяющих задавать тип накопителя (рис. 1). А в самом скрипте нужно сделать так, чтобы отключение всех перечисленных функций производилось только для SSD-накопителя.
Рис. 1. Оконная форма твикера
Мы не станем описывать каждый оператор для создания формы и всех контрольных элементов на ней, а лишь приведем фрагмент кода, в котором строится оконная форма, задается надпись и создается группа в двумя радиокнопками (SSD и HDD). Ну а для запуска утилиты используется кнопка с надписью "Tweak":
Opt("GUICoordMode", 0)
$Form = GUICreate("ComputerPress Tweaker", 320, 170)
$Label=GUICtrlCreateLabel("Твикер для настройки Windows 7/8", 10, 20, 300, 50, $SS_CENTER)
GuiCtrlCreateGroup("", 10, 30, 280, 55)
$HDD_Check=GuiCtrlCreateRadio("HDD", 50,20,50,20)
$SSD_Check=GuiCtrlCreateRadio("SSD", 150,0,50,20)
GUICtrlSetState($SSD_Check, $GUI_CHECKED)
$Start_Button = GUICtrlCreateButton("Start", -110, 55, 100, 25, 0)
Далее необходимо написать код, запускающий форму и обрабатывающий все события контрольных элементов формы. Мы сделаем так, чтобы при нажатии на кнопку Start сначала считывалось значение радиокнопок и, если выбрана радиокнопка SSD, то строковой переменной $Param присваивается значение "SSD", а если выбрана радиокнопка HDD, то присваивается значение "HDD". После присвоения значения строковой переменной $Param на выполнение запускается основной скрипт настройки. При этом основной скрипт настройки удобно оформить в виде функции (назовем ее Tweak), которой в качестве аргумента передается значение переменной $Param. Соответствующий модуль программы выглядит следующим образом:
While 1
$msg = GUIGetMsg()
Select
Case $msg=$GUI_EVENT_CLOSE
ExitLoop
Case $msg=$Start_Button
If GUICtrlRead($HDD_Check)=$GUI_CHECKED Then
$Param="HDD"
ElseIf GUICtrlRead($SSD_Check)=$GUI_CHECKED Then
$Param="SSD"
EndIf
Tweak($Param)
EndSelect
WEnd
Осталось лишь объявить саму функцию Tweak($Param). Для этого используется конструкция:
Func Tweak($Param)
…(тело функции)
EndFunc
Ну а в качестве тела функции выступает наш основной скрипт настройки. Для того чтобы отключение функций Boot defrag, Application Launch Prefetching, SuperFetch, фоновой дефрагментации диска и фоновой авторазметки диска производилось только для SSD-накопителя, используется условный оператор If. Соответствующий фрагмент кода выглядит следующим образом:
If $Param="SSD" Then
$string="отключение функции Boot defrag"
$Result=RegWrite("HKLM\SOFTWARE\Microsoft\Dfrg\BootOptimizeFunction", "Enable", "REG_SZ", "N")
Error($Result, $string)
$string="отключение функций Boot Prefetching и Application Launch Prefetching"
$Result=RegWrite("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters",
"EnablePrefetcher", "REG_DWORD", 0)
Error($Result, $string)
$string="отключение функции функции SuperFetch"
$Result=RegWrite("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters",
"EnableSuperfetch", "REG_DWORD", 0)
Error($Result, $string)
$string="отключение фоновой дефрагментации диска"
$Result=RegWrite("HKLM\SOFTWARE\ Microsoft\Dfrg\BootOptimizeFunction", "Enable", "REG_SZ", "N")
Error($Result, $string)
$string="отключение фоновой авторазметки диска"
$Result=RegWrite("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OptimalLayout", "EnableAutoLayout",
"REG_DWORD", 0)
Error($Result, $string)
EndIf
Начало кода нашего твикера в редакторе AutoIt показано на рис. 2.
Рис. 2. Начало кода нашего твикера в редакторе AutoIt
Заключение
Итак, мы рассмотрели базовые принципы написания твикера для настройки операционной системы Windows 8 и Windows 7. Этот твикер является узкоспециализированным (в этом и была главная задумка) и его основное преимущество в том, что он позволяет очень быстро и абсолютно одинаково настраивать компьютеры путем внесения изменений в реестр. Пользуясь идеями, изложенными в статье, читатели смогут создать собственный твикер, сделав настройки под свои предпочтения. Мы использовали для написания твикера скриптовый язык AutoIt, который обладает широчайшими функциональными возможностями, а освоить этот язык программирования под силу любому школьнику. Одним словом, дерзайте, и у вас обязательно получится.