7 / 2008 R2 - Многовариантная установка Microsoft Windows 7 x64

Ответить
Аватара пользователя
DarkHunter

7 / 2008 R2 - Многовариантная установка Microsoft Windows 7 x64

Сообщение DarkHunter »

К сожалению, на habrahabr эти мысли не были востребованы.

Ниже идет сама статья.

Идея написания статьи пришла в голову давно, но по сложившимся обстоятельствам вспомнил именно сегодня.



Некоторое время назад (можно сказать уже довольно давно) я замучился по просьбам знакомых и друзей переставлять Windows 7 на их ноутбуках/стационарных ПК после очередной “супер новой программы” или неумелого обращения с ПК. Тут можно еще сказать о том, что у самого тоже стоит Windows 7 x64 по сложившимся обстоятельствам – это главная причина статьи т.к. для х86 способов очень много. Естественно запросы и железо у людей различно (да и лицензии для разных версий ОС). В тот момент я и начал искать на животрепещущие ответы на интересующие меня вопросы: как автоматизировать процесс переустановки и добавить свои опции.



Windows Automatic Installation Kit – специальный пакет инструментов Microsoft, который должен помочь в процессе развертывания ОС.

С самого начала я хотел просто создать файл ответов. Да, признаюсь – некоторое время меня вполне устраивали 2 USB-брелка с полуавтоматической установкой с кучей скриптов в зависимости от редакции. А потом захотелось оптимизации места…

Продолжая читать форум и статьи на OS Zone, я открыл для себя способ “склеивания” дистрибутивов различной разрядности, но в итоге я получил большую проблему в структуре диска – Win PE использовалась х86 и, естественно, восстановление системы x64 было невозможно. Мне пришлось смириться с этим горем. Но, как оказалось, ненадолго…



Скорее всего, все слышали о скриптовом языке администрирования для Windows под названием AutoIt. В один прекрасный день мне нужно было автоматизировать какое-то мелкое действие, и я наткнулся на AutoIt. Как относится моя ситуация и AutoIt? На первый взгляд совершенно никакой. Дело в том, что этот язык может рисовать и GUI, причем с помощью утилиты из комплекта под названием Aut2exe_x64 можно компилировать нативные х64 exe-скрипты. Забавные интерактивные приложения в некоторых случаях действительно полезны.





Win PE – специализированная облегченная версия Windows, предназначенная для запуска со съемных носителей. Именно из неё мы и начинаем установку Vista/7. К сожалению, Win PE x64 не способна работать с x86 приложениями. Раз это уже урезанная система (а не текстовый режим как в XP), то и возможностей у нас гораздо больше. После непродолжительного поиска я наткнулся на подтверждение моих догадок: установка запускается процессом winpeshl.exe (есть и ini файл настройки), который вызывается при загрузки Win PE, запускает setup.exe в корне системного диска (для PE имя этого диска всегда X: ). У Setup.exe же есть параметр /unnatend: .

Тут у меня и появилась идея!



Идея в том, чтобы перехватить запуск setup.exe и вывести свою программку с необходимым мне внешним видом и настройками. Так же мы можем запускать наши любые х64 программы в среде Win PE (в разумных пределах — очень урезанная ОС).

Сразу оговорюсь, приведенный исходники покажутся некоторым очень неопрятными, непрофессиональными или не оптимизированными – так и есть. Я хочу показать лишь идею. Далекий я от профессионального программирования и скриптинга.



Первый шаг:

Необходимо «нарисовать наше меню для установки», задать опции и скомпилировать скрипт в exe-файл.

Напоминаю: компилировать нужно в х64 бит варианте.



Исходники программы-меню + изображения для Win PE на AutoIt3. Для образа с двумя редакциями: Home Premium, Professional



Код:

Код: Выделить всё

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; main form
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Opt("GUIOnEventMode", 1)
$Form1 = GUICreate("Установка", 232, 400)
GUISetBkColor(0xFFFFFF)
GUICtrlCreatePic(@ScriptDir & "\Images\bek6.bmp", 0, 0, 232, 400)
GUICtrlSetState(-1, $GUI_DISABLE)
$Form1context = GUICtrlCreateContextMenu()
$MenuItem1 = GUICtrlCreateMenuItem("О программе", $Form1context)
GUICtrlSetOnEvent(-1, "MenuItem1Click")
$Group1 = GUICtrlCreateGroup("", 8, 179, 217, 9)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Pic1 = GUICtrlCreatePic(@ScriptDir & "\Images\button.bmp", 24, 48, 180, 36)
GUICtrlSetOnEvent(-1, "Pic1Click")
$Pic2 = GUICtrlCreatePic(@ScriptDir & "\Images\button.bmp", 24, 100, 180, 36)
GUICtrlSetOnEvent(-1, "Pic2Click")
$Pic3 = GUICtrlCreatePic(@ScriptDir & "\Images\button.bmp", 24, 197, 180, 36)
GUICtrlSetOnEvent(-1, "Pic3Click")
$Pic4 = GUICtrlCreatePic(@ScriptDir & "\Images\button.bmp", 24, 244, 180, 36)
GUICtrlSetOnEvent(-1, "Pic4Click")
$Pic5 = GUICtrlCreatePic(@ScriptDir & "\Images\button.bmp", 24, 291, 180, 36)
GUICtrlSetOnEvent(-1, "RecClick")
$Pic6 = GUICtrlCreatePic(@ScriptDir & "\Images\button.bmp", 24, 338, 180, 36)
GUICtrlSetOnEvent(-1, "CMDClick")
$Label1 = GUICtrlCreateLabel("Выберите действие:", 10, 14, 220, 24,$SS_CENTER)
GUICtrlSetFont(-1, 14, 400, 0, 'Tahoma')
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetColor(-1, 0xC0C0C0)
GUICtrlCreateLabel('Обычная установка' ,48, 56, 140, 18, $SS_CENTER)
GUICtrlSetFont(-1, 10, 400, 0, 'Tahoma')
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetcolor(-1, 0xFFFFFF)
GUICtrlCreateLabel('Автоматическая установка' ,33, 108, 170, 18, $SS_CENTER)
GUICtrlSetFont(-1, 10, 400, 0, 'Tahoma')
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetcolor(-1, 0xFFFFFF)
GUICtrlCreateLabel('Far Manager' ,48, 205, 140, 18, $SS_CENTER)
GUICtrlSetFont(-1, 11, 400, 0, 'Tahoma')
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetcolor(-1, 0xFFFFFF)
GUICtrlCreateLabel('Start GimageX ' ,48, 253, 140, 18, $SS_CENTER)
GUICtrlSetFont(-1, 11, 400, 0, 'Tahoma')
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetcolor(-1, 0xFFFFFF)
GUICtrlCreateLabel("Восстановление", 41, 300, 140, 24,$SS_CENTER)
GUICtrlSetFont(-1, 11, 400, 0, 'Tahoma')
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlCreateLabel("Командная строка", 41, 346, 140, 24,$SS_CENTER)
GUICtrlSetFont(-1, 11, 400, 0, 'Tahoma')
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetColor(-1, 0xFFFFFF)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; About
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$Form2 = GUICreate("О программе", 408, 248, 619, 147)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form2Close")
GUISetBkColor(0xFFFFFF)
GUICtrlCreatePic(@ScriptDir & '\images\bek6.bmp', 0, 0, 408, 248)
GUICtrlSetState(-1, $GUI_DISABLE)
$GroupBox1 = GUICtrlCreateGroup("", 16, 16, 377, 185)
$Image1 = GUICtrlCreatePic(@ScriptDir & "\images\cat.jpg", 24, 32, 105, 97)
$Label1 = GUICtrlCreateLabel("Продукт: Оболочка для установки Win 7 x64", 136, 32, 250, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetColor(-1, 0xFFFFFF)
$Label2 = GUICtrlCreateLabel("Версия: 1.5.0", 136, 56, 79, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetFont(-1, 8, 800, 0, "Tahoma")
GUICtrlSetColor(-1, 0xFFFFFF)
$Label3 = GUICtrlCreateLabel("Автор:  DarkHunter", 24, 144, 160, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetFont(-1, 8, 800, 0, "Tahoma")
GUICtrlSetColor(-1, 0xFFFFFF)
$Label5 = GUICtrlCreateLabel("  test field", 20, 168, 220, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetFont(-1, 8, 800, 0, "Tahoma")
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Button1 = GUICtrlCreateButton("&OK", 172, 208, 75, 25, 0)
GUICtrlSetOnEvent(-1, "Button1Click")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Automate menu
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$Form3 = GUICreate("Установка", 232, 187, 192, 139)
GUISetBkColor(0xFFFFFF)
GUICtrlCreatePic(@ScriptDir & '\images\bek6.bmp', 0, 0, 408, 248)
GUICtrlSetState(-1, $GUI_DISABLE)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form3Close")
$Pic5 = GUICtrlCreatePic(@ScriptDir & "\images\button.bmp", 24, 32, 188, 36)
GUICtrlSetOnEvent(-1, "Pic5Click")
$Pic6 = GUICtrlCreatePic(@ScriptDir & "\images\button.bmp", 24, 98, 188, 36)
GUICtrlSetOnEvent(-1, "Pic6Click")
GUICtrlCreateLabel("Автоматическая Win 7 x64 Pro", 33, 42, 180, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetFont(-1, 8, 800, 0, "Tahoma")
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlCreateLabel("Автоматическая Win 7 x64 HP", 33, 112, 180, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetFont(-1, 8, 800, 0, "Tahoma")
GUICtrlSetColor(-1, 0xFFFFFF)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
GUISetState(@SW_SHOW, $Form1)
While 1
	Sleep(100)
WEnd
Func Button1Click()
 GUISetState(@SW_HIDE, $Form2)
EndFunc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Func MenuItem1Click()
  GUISetState(@SW_SHOW, $Form2)
EndFunc
Func Pic1Click()
 Sleep(150)
 RunWait(@HomeDrive & "\Setup.exe /unattend:" & @ScriptDir & "\scripts\Default.xml")
EndFunc
Func Pic2Click()
 Sleep(150)
 GUISetState(@SW_HIDE, $Form1)
 GUISetState(@SW_SHOW, $Form3)
EndFunc
Func Pic3Click()
 Sleep(150)
 Run(@ProgramFilesDir & "\Far\Far.exe")
EndFunc
Func Pic4Click()
 Sleep(150)
 Run(@ProgramFilesDir & "\GimageX\gimagex.exe")
 EndFunc
Func Form1Close()
 Exit
EndFunc
Func Form2Close()
 Exit
EndFunc
Func Form3Close()
 Exit
EndFunc
Func Pic5Click()
  Sleep(150)
 GUISetState(@SW_HIDE, $Form3)
  RunWait(@HomeDrive & "\Setup.exe /unattend:" & @ScriptDir & "\scripts\pro.xml")
EndFunc
Func Pic6Click()
  Sleep(150)
 GUISetState(@SW_HIDE, $Form3)
  RunWait(@HomeDrive & "\Setup.exe /unattend:" & @ScriptDir & "\scripts\HP.xml")
EndFunc
func RecClick()
  sleep(150)
   RunWait(@HomeDrive & "\sources\recovery\RecEnv.exe")
 EndFunc
 Func CMDClick()
  sleep(150)
  Run(@HomeDrive & "\Windows\System32\Cmd.exe", @HomeDrive & "\Windows\System32\")
 EndFunc

В приложенном архиве полностью готовый для компилирования скрипт со всем моим оформлением.



Второй шаг:

Для второго шага нам понадобится: DISM, который интегрирован уже в Windows 7; образ Windows 7 x64.



— Распаковываем наш образ операционной системы в любую папку.

— Удаляем файл ei.cfg из /sources

— Выделяем гигабайт 10 на диске, создаем там какую-либо папку для временного монтирования Win PE (допустим TempMount)

— Открываем cmd.exe и монтируем boot.wim с индексом 2 из распакованного образа диска в папку TempMount так:



Код:

Код: Выделить всё

DISM /Mount-Wim /WimFile:<Ваш путь>\sources\boot.wim /Index:2 /MountDir:<путь до папки>TempMount

Теперь необходимо сформировать где-нибудь такую структуру папок:



Код:

Код: Выделить всё

<Ваш путь>\Program Files\
<Ваш путь>\Sources\
<Ваш путь>\Windows\

В папке \Sources\ у нас будет папка с нашим «загрузчиком».



Мой пример:



Код:

Код: Выделить всё

\Sources\Loader\Images\
\Sources\Loader\scripts\
\Sources\Loader\Loader.exe

Где \Images\ папка с ресурсами оформления загрузчика;

\scripts\ — папка с файлами ответов для каждой редакции Windows*

Loader.exe — сам скрипт



В папке \Program Files\ необходимые нам программы (мы же не забыли добавить их в наш скрипт?), которые мы хотим запускать из установочного диска (обязательно натив х64)



В папке \Windows\ находится такая структура:

Код:

Код: Выделить всё

\System32\winpeshl.ini

Где в winpeshl.ini находится путь до нашего Loader.exe.



Пример содержимого winpeshl.ini:



Код:

Код: Выделить всё

[LaunchApps]
%SYSTEMDRIVE%\sources\Loader\loader.exe

Третий шаг:

Теперь полученную структуру папок мы копируем в \MountTemp и соглашаемся на слияние.

Все. С Win PE можно покончить.

Выполняем в консоли:



Код:

Код: Выделить всё

DISM /UnMount-Wim /MountDir:<Ваш путь>\tempMount /commit

Четвертый шаг:

Теперь создаем iso образ и записываем его на диск/USB привычным вам методом.



Итог:









* Благодаря /unnatend: ключу Setup.exe можно задавать для различных редакций множественный варианты файлов ответов.



В похождениях были изучены справочные материалы команды DISM и сайта OS Zone

Спасибо Boa Soft за идею!

Спасибо за внимание!
Вложения
AutoIt3LoaderWin7Code.7z
(77.66 КБ) 0 скачиваний
AutoIt3LoaderWin7Code.7z
(77.66 КБ) 0 скачиваний
Ответить

Вернуться в «Автоматическая установка Windows 11 / 10 / 8 / 7 / Vista»