Показать полную графическую версию : Только для экспертов! FAKE-Setup своими руками.
Только для экспертов! FAKE-Setup своими руками.
Метод использования Fake-копии SETUP.EXE был придуман неким Pyron с форума MSFN и нынче широко используется для Unattend-пакетов, в основном драйверов (пакеты от Bashrat, BoaSoft и др.). Подробней о том как он фунциклирует можно почитать в мануалах к пакетам и на форумах MSFN. Несмотря на простой алгоритм, для написания EXE-файла нужно быть немного программером, а это ИМХО не совсем справедливо! ;). Поэтому я решил реализовать его на AutoIT, но здесь ждал облом - AutoIT v.3 напрочь отказывался запускаться в PRE-Setup окружении WinXP, хотя между тем прекрасно работал из под Win2K. К счастью, все заработало на версии 2.64, которая до сих пор доступна для скачивания.
Привожу пример скрипта, где совмещены обе возможности - AutoIT и PreSetup чтобы всегда можно было выбрать удобный интерфейс. Код намеренно не тестировался и может содержать ошибки - кому нужно, тот поймет что к чему. ;) Многое зависит еще от содержимого Presetup.Cmd
HideAutoItWin,On
SetBatchLines,100
;=======================================================
; Восстанавливаем параметры командной строки
;-------------------------------------------------------
SetEnv,i,0
Repeat,%0%
EnvAdd,i,1
StringTrimLeft,parm,%i%,0
SetEnv,CmdLine,%CmdLine% %parm%
EndRepeat
;=======================================================
; Установка путей к утилитам и драйверам
;-------------------------------------------------------
SetEnv,DrvTag,drv51
SetEnv,WrkDir,%SystemDrive%\\Install
;=======================================================
; Установка всех требуемых файлов
;-------------------------------------------------------
FileInstall,setupORG.exe,%SystemRoot%\\System32\\setupORG.exe
FileInstall,presetup.cmd,%WrkDir%\\presetup.cmd
FileInstall,cmdow.exe,%WrkDir%\\cmdow.exe
FileInstall,7za.exe,%WrkDir%\\7za.exe
FileInstall,setpath.exe,%WrkDir%\\setpath.exe
FileInstall,watchdrv.exe,%WrkDir%\\watchdrv.exe
;=======================================================
; Трикс с переименованием
;-------------------------------------------------------
IfExist,%SystemRoot%\\System32\\Setup.exe,RunWait,CMD /C REN Setup.exe SetupOld.exe,%SystemRoot%\\System32,Hide
IfExist,%SystemRoot%\\System32\\SetupORG.exe,RunWait,CMD /C REN SetupORG.exe Setup.exe,%SystemRoot%\\System32,Hide
;=======================================================
; Собственно запуск процесса установки
;-------------------------------------------------------
SetBatchLines,1
;-------------------------------------------------------
RunWait,CMD /C PreSetup.cmd %DrvTag% %WrkDir%,%WrkDir%\\,Hide
RunWait,Setup.exe %CmdLine%,%SystemRoot%\\System32
;=======================================================
; Чистим после себя
;-------------------------------------------------------
RunWait,CMD /C RD /Q /S %WrkDir%,%SystemDrive%\\,Hide
P.S. Несмотря на "убогость" и сложный синтаксис морально-устаревшей версии, использование AutoIT открывает широкие возможности для автоматизации установки, некоторые из которых я еще сам не освоил. Вот только некоторые:
1. Свобода от правки inf-файлов, все инструменты включены уже в один файл - SETUP.EXE, который устанавливается простым копированием.
2. Свобода выбора между WATCHDRV и стандартным AutoIT-методом отслеживания окон, тем более что WATCHDRV отрабатывает не всегда.
3. Возможность условного заполнения реквизитов. Например, загрузив из INI-файла базу всех ПК можно автоматически заполнить имя машины, лицензионный ключ и т.д. Сам не пробывал - нужды пока не было.
bogomolv
15-04-2006, 10:41
amel27
Объясни, плз, идею FAKE-Setup. Без этого невозможно понять суть своего предложения.
bogomolv
Ok, осознал. Подправил скрипт - перегнал две строчки из PRESETUP.CMD чтобы смысл был ясен.
Идея проста - оригинальный SETUP.EXE переименовывается в дистрибутиве в SETUPORG а вместо него подкладывают FAKE-копию, которая и запускается установщиком. FAKE-setup выполняет необходимые действия (обычно лишь запускает PRESETUP.CMD), переименовывает все обратно и, наконец, запускает оригинальный SETUP.EXE. Важно, чтобы FAKE-setup не завершал работу в течении всего процесса установки, иначе произойдет прерывание и перезагрузка.
bogomolv
В старой версии статьи об установке драйверов с CD этот способ излагался. Он еще есть в старой оффлайн версии, наверное. И на MSFN он есть на англ. (http://unattended.msfn.org/unattended.xp/view/web/35/)
bogomolv
17-04-2006, 07:41
amel27, Vadikan
Спасибо, понял о чем речь.
Но вопросы к amel27 остались:
Из твоего скрипта не видно, зачем тебе "свобода выбора между WATCHDRV и стандартным AutoIT-методом отслеживания окон", и где и как ты собираешься юзать "возможность условного заполнения реквизитов"?
А вообще-то метод заинтересовал с точки зрения возможности реализации одного трюка, которым давно пользуюсь, но делаю это коряво:
Одним из стандартных приемов установки Windows является выделение на диске раздела под систему с последующим автоматическим переформатированием этого раздела в ходе переустановки системы. Так красиво и элегантно избавляемся от мусора и возможности воспроизведения кривых настроек прежней системы. К тому же в ходе автопереустановки не появляется нарушающий unattend'ность запрос, что делать со старой папкой Windows.
Способ всем хорош, но его условие - наличие свободного раздела. Не все это любят, а неподготовленные пользователи к тому же не умеют им пользоваться, и бесполезно им объяснять, что не надо сохранять свои документы на диске C:!
Я для автоудаления прежней системы использую такую конструкцию:
1. На винчестер кладу заточненный под пользователя дистрибутив со всеми дровами и всеми дополнительными программами (что-то вроде дистрибутива на скрытом разделе ноутбуков Asus).
2. Разворачиваю на диске WinPE (в собственной облегченной сборке).
3. Запуск переустановки системы осуществляется файлом UNATTEND.BAT, который из-под Windows меняет BOOT.INI, создает маркерный файл и отправляет систему на перезагрузку под WinPE:
echo Удалить системные файлы>>c:\delwin.bat
bootcfg /default /id 2
shutdown -r -t 0
4. Загрузившаяся WinPE "реагирует" на наличие c:\delwin.bat и запускает:
del %DISK%:\delwin.bat
rd /s /q %DISK%:\windows
rd /s /q %DISK%:\docume~1
rd /s /q %DISK%:\progra~1
rd /s /q %DISK%:\system~1
rd /s /q %DISK%:\recycled
rd /s /q %DISK%:\RECYCLER
@dir %DISK%:\
@%DISTR%:
@cd %DISTR%
.\I386\winnt32.exe /s:.\I386 /unattend1:unattend.txt /noreboot
exit
Давно пытаюсь избавиться от этой конструкции, которую сам называю "стол-на-стул". Ведь нужно-то мне совсем немного - научить установщик Windows удалять системные папки на первом "неграфическом" этапе установки...
В принципе, я и свою конструкцию неплохо отточил: перезагрузка и запуск установки из-под WinPE занимают у меня не более 50 сек, нарисовал скрипты автоматизации процесса развертывания WinPE на жестком диске, та же самая WinPE на установочном мультизагрузочном CD служит для подготовки жесткого диска на новом компьютере, а на самом жестком диске WinPE в качестве дополнительной оси неплохо помогает восстановить рухнувшую систему.
Удается даже руководить этими процессами по телефону, подсказывая детям своих друзей и знакомых, что и как нужно сделать, чтобы ОНО опять заработало :)
bogomolv
Из твоего скрипта не видно, зачем тебе "свобода выбора между WATCHDRV и стандартным AutoIT-методом отслеживания окон", и где и как ты собираешься юзать "возможность условного заполнения реквизитов"?
1. WATCHDRV срабатывает не всегда, классический пример - дрова в VMware... И по сути - это использование "дыры" в безопасности, которую в любое время могут прикрыть. Кстати, если внимательно читать автора он именно об этом и писал.
2. Это только "мысли вслух"... Как вариант - дождаться окна ввода реквизитов, затем идентифицировать к-либо способом машину (MAC-адрес, BIOS или еще как... тут нужно обмозговать), по этому индексу вытянуть из INI-файла нужную инфу и вставить куда надо.
З.Ы. В AutoIT меня не устраивает только привязка к языку, а собирать титлы окон для всех языков (у меня их три) и систем (тоже три) не очень хочется...
bogomolv
Давно пытаюсь избавиться от этой конструкции, которую сам называю "стол-на-стул". Ведь нужно-то мне совсем немного - научить установщик Windows удалять системные папки на первом "неграфическом" этапе установки...ИМХО вполне реально. Примерный алгоритм:
1. Запустить под Windows первую фазу установки (только копирование):
winnt32.exe /tempdrive:c /unattend:unattend.txt /norebootВ результате будут созданы временные каталоги C:\$WIN_NT$.~BT и C:\$WIN_NT$.~LS,
а также BOOT.INI типа:
[Boot Loader]
Default=C:\$WIN_NT$.~BT\BOOTSECT.DAT
[Operating Systems]
C:\$WIN_NT$.~BT\BOOTSECT.DAT="Microsoft Windows XP Professional Setup"2. Сохранить все это хозяйство где-нибудь в укромном месте и восстановить исходный BOOT.INI
3. Проверить содержимое winnt.sif в $WIN_NT$.~BT на предмет строчек:[Unattended]
TargetPath=*
NTUpgrade=No4. Заменить в $WIN_NT$.~LS SETUP.EXE на Fake-копию, которая перед установкой сделает RD всем каталогам WINDOWS.* (кроме %WINDIR%), ну и дальше по списку...
5. Сваять скрипт, который при запуске копирует коталоги $WIN_NT$.* и BOOT.INI в корень диска C: и перегружает машину, после чего сразу стартует графическая часть Unattend-установки.
З.Ы. Одно "неудобство" - папка %WINDIR% после каждой переустановки будет называться по другому.
bogomolv
18-04-2006, 09:08
amel27
Спасибо, буду думать.
На первый взгляд - еще более тяжеловесная конструкция...
bogomolv
На первый взгляд - еще более тяжеловесная конструкция...На самом деле первая фаза почти совпадает с методом подготовки дистрибутива Gosh (http://gosh.msfnhosting.com/part1.htm) с форума MSFN, готовый дистриб гораздо компактнее и его несложно переделать для установки с CD... Ну и на одну перезагрузку должно получиться меньше.
bogomolv
19-04-2006, 06:57
amel27
На самом деле первая фаза почти совпадает с методом подготовки дистрибутива Gosh
Это я сразу понял. Года три назад даже пытался освоить этот метод. Полностью с ним так и не разобрался.
Так и не понял, что представляют собой эти временные каталоги? Насколько они универсальны, и можно ли их использовать для установки на разных машинах? Не является ли этот метод чем-то вроде Sysprep-установки, рекомендуемой для однотипных машин...
Подробности уже подзабыл, но осталась уверенность, что этот метод не для моего подхода, когда я из стандартного дистрибутива и заготовок драйверов и программ общего назначения готовлю дистрибутив, заточенный под конкретного пользователя и его машину (или группу машин).
bogomolv
что представляют собой эти временные каталоги?~LS - все файлы дистрибутива явно прописанные в dosnet.inf
~BT - загрузочные файлы (полный набор из загрузочных дискет, только с учетом обновлений)
Насколько они универсальны, и можно ли их использовать для установки на разных машинах? Не является ли этот метод чем-то вроде Sysprep-установки, рекомендуемой для однотипных машин...К машинам привязки нет, ведь это просто набор файлов (кроме двух файлов ответов, кот. можно удалить). В работе всегда использую только GOSH-дистрибутивы, но они не подходят для повторной установки с HDD (там просто нет winnt32.exe). Мне только один раз попадался дистрибутив (XP SP2 OEM) когда в dosnet.inf были пропущены файлы из txtsetup.inf, приходилось вручную потом копировать в образ.
В контексте твоего вопроса все это можно понимать как отложенную установку, которую можно продолжить при необходимости в любое время.
bogomolv
20-04-2006, 19:46
amel27
Спасибо за толковое разъяснение.
А ссылку на свежее описание метода не дашь? У меня сохранилась ссылка только на старое описание, которое уже давно не обновлялось.
bogomolv
нет, ссылки нет но там практически ничего не изменилось, вот несколько дополнений из личного опыта:
1. Для того чтобы к GOSH-дистрибутиву можно было применять трансформ-паки типа nLite нужно дополнительно скопироватьиз дистрибутива файл dosnet.inf... а если изменения касаются txtsetup.sif, то по окончании процесса скопировать его из i386 в BOOT. Для пакетов драйверов, затрагивающих начальную фазу загрузки (MassStorage) нужно дополнительно скинуть из i386 в BOOT файлы *.sys (только новые).
2. Для локализованных версий нужно дополнительно скопировать bootfont.bin
3. Для XP SP2, 2K3 SP1 файл setupldr.bin взять из дистрибутивов XP SP0/SP1, 2K3 SP0
Boa Soft
21-04-2006, 10:20
Для XP SP2, 2K3 SP1 файл setupldr.bin взять из дистрибутивов XP SP0/SP1, 2K3 SP0
При использовании BCDW, совместимого с SP2 это совершенно не нужно. Новый setupldr.bin патчится нормально.
DmitryOlenin
21-04-2006, 16:01
Если я понял все правильно, то FAKE-setup делает нечто, после чего передает управление настоящему файлу setup.exe, который отрабатывает после копирования файлов и перезагрузки.
Выше писали о том, как бы все от старой винды почистить, а потом ставить начать, при этом запустив все из Windows.
Так может проще сделать так:
1. winnt32.exe /tempdrive:c /unattend:unattend.txt /noreboot
2. Пишем на чем угодно setup.exe так, чтобы он просто запускал наш батник и закрывался.
3. Батник создаем и кладем его в $WIN_NT$.~LS. Например так: create.bat @echo off
ren "%SystemDrive%\$WIN_NT$.~LS\setup.exe" setup1.exe
copy /y setup.exe "%SystemDrive%\$WIN_NT$.~LS\"
echo @echo off>%SystemDrive%\$WIN_NT$.~LS\dele.bat
echo rd %windir%>>%SystemDrive%\$WIN_NT$.~LS\dele.bat
echo rd %ProgramFiles%>>%SystemDrive%\$WIN_NT$.~LS\dele.bat
echo rd %allusersprofile%>>%SystemDrive%\$WIN_NT$.~LS\dele.bat
echo rd %homepath%>>%SystemDrive%\$WIN_NT$.~LS\dele.bat
echo del setup.exe>>%SystemDrive%\$WIN_NT$.~LS\dele.bat
echo ren setup1.exe setup.exe>>%SystemDrive%\$WIN_NT$.~LS\dele.bat
echo setup.exe>>%SystemDrive%\$WIN_NT$.~LS\dele.bat
Итого скрипт для установки из винды будет состоять из 3х строк.
Установка файлов винды, копирование батника, перезагрузка компа.
Или я чего-то не понял? Если так - поясните пожалуйста ;)
DmitryOlenin
21-04-2006, 23:04
Только что проверил на виртуалке.
У меня почему-то не создается директория [и]$WIN_NT$.~LS[/b]
Но при этом инсталляция идет(проверил после перезагрузки). Более того, директория $WIN_NT$.~BT занимает около 10Мб.
Кто-нибудь может обьяснить, как такое может быть?
P.S.
Проверил dosnet.inf, он далеко не пустой.
-----------
Дело в файле автоустановки (*.sif). Попробовал без него ввести серийник и прочее руками - все ок.
Может галочка - копировать все файлы не ставится по умолчанию?
---------------
Точно, только что проверил. По-умолчанию эта галка не стоит...
DmitryOlenin
Если я понял все правильно, то FAKE-setup делает нечто, после чего передает управление настоящему файлу setup.exe, который отрабатывает после копирования файлов и перезагрузки.Именно так, причем независимо от способа установки - с CD или HDD.
2. Пишем на чем угодно setup.exe так, чтобы он просто запускал наш батник и закрывался.
3. Батник создаем и кладем его в $WIN_NT$.~LS. Например так: create.bat Попробуй хоть раз написать "на чем угодно setup.exe", например на AutoIt и перед запуском оригинального SETUP запусти "CDM /K" - обнаружишь много для себя интересного, например что %windir% удалить уже невозможно, так как это текущая папка для новой WINDOWS... Смысл строчки "del setup.exe" тоже не понятен, впрочем она и не отработает.
EDIT: извиняюсь, насчет %windir% поторопился - действительно, CMD создается еще в старой Windows... Текст не стал править, остальное остается в силе.
DmitryOlenin
22-04-2006, 10:00
amel27
Проверил бы... Только я пока до конца не разобрался во взаимодействии упакованного setup.ex_, setuporg.exe и presetup.bat.
У меня драйвера от Башрата, так что, по идее, все это должно использоваться.
Cтрочка rd /q /s d:\windows, именно так она выглядела после отработки батника в старой винде, не отработала в том самом presetup.bat.
P.S.
Да, кстати, я попробовал написать на чем угодно setup.exe. 7Кб вышло. Да, кстати, само себя переименовать он вполне может.
Я так понял под cdm имелось в виду cmd. Если у меня получится сначала передать управление моему файлу, то, есть предположение, каталог вида d:\windows вполне удалится.
bogomolv
23-04-2006, 02:18
amel27, DmitryOlenin
Ткните пальцем, куда класть свой setup.exe, кого при этом переименовывать и т.д.
Ваши предложения:
REN Setup.exe SetupOld.exe,%SystemRoot%\\System32
и
ren "%SystemDrive%\$WIN_NT$.~LS\setup.exe" setup1.exe
У меня ни в $WIN_NT$.~LS, ни в $WIN_NT$.~BT вообще нет никаких setup.exe!
Пока лишь удалось создать дистрибутив из временных папок $WIN_NT$.~LS и $WIN_NT$.~BT и вписать его в свою конструкцию переустановки с HDD:
1) с HDD запускается батник, создающий маркерный файл и перезапускающий систему под WinPE;
2) WinPE, реагируя на маркерный файл, удаляет системные папки и копирует из нового дистрибутива $WIN_NT$.~LS, $WIN_NT$.~BT и boot.ini и вновь отправляет машину на перезагрузку;
3) после перезагрузки подхватываются $WIN_NT$.~LS и $WIN_NT$.~BT и начинается установка Windows.
В результате удалось сэкономить 1 минуту на первом графическом этапе установки с HDD, и установка всей системы (с дровами и прогами) занимает 13 мин 40 сек.
Если научите, как и чем удалять системные папки, не презагружаясь в WinPE, удастся сэкономить еще 40 сек.
А вот с размерами дистрибутива выигрыш небольшой - 379MB против прежних 392MB (это без папки $OEM$).
Кстати о рекордах. При обычном способе вся система у меня ставится примерно за 14 мин 40 сек - 15 мин.
Когда вышел на этот уровень, обнаружилась такая ерунда - после завершения последнего графического этапа установки остается голубой экран с курсором и система висит до 2 минут, лишь изредка помигивая лампочкой активности HDD. В итоге никак не мог перешагнуть рубеж в 16 мин 30 сек.
Вот выдержка из setuplog.txt:
04/21/2006 21:29:53.077,d:\xpsprtm\base\ntsetup\syssetup\services.c,496,,SetupStartService: Sending StartService to <Eventlog>
ЗАВИСАНИЕ НА 30 сек
04/21/2006 21:30:22.952,d:\xpsprtm\base\ntsetup\syssetup\services.c,498,,SetupStartService: Sent StartService to <Eventlog>
....
ПОСЛЕДНЯЯ ЗАПИСЬ ПЕРЕД ПЕРЕЗАГРУЗКОЙ
04/21/2006 21:30:22.968,d:\xpsprtm\base\ntsetup\syssetup\syssetup.c,6664,END_SECTION,Installing Windows NT
ЕЩЕ ОДНО ЗАВИСАНИЕ ДО 2 мин ... И СЛЕДУЮЩАЯ ЗАПИСЬ УЖЕ ПОСЛЕ ПЕРЕЗАГРУЗКИ
04/21/2006 21:32:31.140,d:\xpsprtm\base\ntsetup\syssetup\oobe.c,1127,,SetupOobeInitDebugLog
....
Нашел крайне глупое, но работающее(!) решение этой проблемы. На выходе из стадии CMDLINES запускаю установку "тяжелого" MSI-установщика (Nero7 или MSIntelliPoint для своей мыши). Причем запускаю не через RunWait, а через Run. То есть последние стадии установки Windows идут параллельно с работой MSI-установщика. В итоге - никаких зависонов! Эти самые MSI-установщики даже не всегда успевают отработать до конца!
Setuplog.txt такой установки:
04/21/2006 23:11:02.187,d:\xpsprtm\base\ntsetup\syssetup\services.c,496,,SetupStartService: Sending StartService to <Eventlog>
НЕТ ЗАВИСАНИЯ
04/21/2006 23:11:02.187,d:\xpsprtm\base\ntsetup\syssetup\services.c,498,,SetupStartService: Sent StartService to <Eventlog>
....
04/21/2006 23:11:02.203,d:\xpsprtm\base\ntsetup\syssetup\syssetup.c,6664,END_SECTION,Installing Windows NT
НЕТ ЗАВИСАНИЯ. РАЗРЫВ В 40 сек НА ПЕРЕЗАГРУЗКУ
04/21/2006 23:11:42.328,d:\xpsprtm\base\ntsetup\syssetup\oobe.c,1127,,SetupOobeInitDebugLog
Кто-нибудь, что-нибудь понимает? Я - нет.
Да и решением найденый способ, конечно, назвать нельзя. Сам знаю, что MSI-установщики не рекомендованы для CMDLINES. В результате MSIntelliPoint нормально ставится в одном случае из пяти, а Nero7 так вообще приходится переустанавливать на следующей стадии...
P.S. Дистрибутив WinXP SP2 Prof RUS Corporate Edition (самоделка). Проверял на несамодельной WinXP SP2 Prof RUS VLK. Кроме того, что она у меня всегда ставится на 2 минуты дольше (заметно медленнее идет стадия копирования файлов), поведение такое же. Пробовал и с интегрированными обновлениями и без - все так же.
DmitryOlenin
Я так понял под cdm имелось в виду cmdГлубокомысленное замечание :)
bogomolv
У меня ни в $WIN_NT$.~LS, ни в $WIN_NT$.~BT вообще нет никаких setup.exe!поищи i386\setup.ex_
Ткните пальцем, куда класть свой setup.exe, кого при этом переименовывать и т.д.1. Оригинальный setup.exe переименовать в setuporg.exe, и обеспечить его попадание в System32 во время установки, варианты:
- использовать txtsetup.sif (можно запаковать в setuporg.ex_);
- использовать ф-цию AutoIT FileInstall;
- прямое копирование перед переименованием. Имхо не лучший вариант, т.к. привязан к абсолютному пути.
2. Запаковать Fake setup.exe в setup.ex_ и поместить в i386
REN Setup.exe SetupOld.exe
REN SetupOrg.exe Setup.exeЕсли научите, как и чем удалять системные папки, не презагружаясь в WinPE, удастся сэкономить еще 40 сек.Попробуй перед запуском оригинального setup.exe запутить "CMD /K" и удалить папки/файлы из командной строки.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.