PDA

Показать полную графическую версию : Альтернативный способ автоматической установки Windows XP


A.A.Z.
20-04-2008, 19:05
Всем привет.
Я одно время долго ломал голову, как можно объединить удобство автоматической (unattended) установки Windows с функциональностью возможности выбора пользователем нужных ему компонентов. В итоге появилась одна мысль.
Я написал программу, которая запускается по DetachedProgram на 39 минуте и следит за окнами. По замыслу, как только на экране появляется диалоговое окно, на кнопку "&Далее >" вешается "таймаут" - программа ждёт заданное кол-во секунд (допустим, 5), отображая это в Caption'е кнопки ("&Далее (5) >", "&Далее (4) >"...), и затем, в случае бездействия пользователя, по истечению 5 секунд сама нажимает на неё (если пользователь начнёт "активничать" - двигать мышку или нажимать на кнопки, то она прекращает свою деятельность по отношению к текущему окну). Таким образом планировалось достичь, как я уже написал, возможности автоустановки Windows путём предварительного задавания соответствующих настроек (серийник, языковые стандарты, сеть и т.д.) и параметра UnattendMode=ProvideDefault, который бы позволил пользователю, в случае чего, что-либо поменять. Например, собственно, имя пользователя, пароль админа и т.п.
Чего я, спрашивается, сюда пишу :) Так вот. Я решил отлавливать появляющиеся диалоговые окна по таймеру через GetForegroundWindow, а затем, если у этого окна класс #32770, искать на нём нужную дефолтную кнопку. Но окно самого первого диалога (в режиме ProvideDefault это как раз-таки диалог выбора имени пользователя и компании), как оказалось, появляется задолго до того, как мы видим его на экране после "установки устройств" - моя программа его обнаруживает и "вытаскивает" на поверхность в самом начале этапа установки устройств. Соответствено - первый вопрос, что бы вы могли посоветовать использовать вместо этого? Была идея отлавливать WindowFromPoint с центра экрана где-нибудь раз 10 в секунду, но пока не знаю, приведёт ли это к чему-нибудь, или нет. Второй вопрос, который возник, это собственно необходимость избегания этого самого "вытаскивания" окон наверх - а может, так оно и к лучшему - чем раньше пользователь введёт данные, тем лучше? Просто я точно не знаю, куда эти диалоги отправляют введённую информацию - не слишком ли рано они будут это делать на 39 минуте.
Наверное, пока всё... Буду рад любым ответам (и вопросам) :)

Drongo
20-04-2008, 19:33
A.A.Z., Таким образом планировалось достичь, как я уже написал, возможности автоустановки Windows путём предварительного задавания соответствующих настроек (серийник, языковые стандарты, сеть и т.д.) »Если удастся закончить Ваш проэкт, то это будет классно! :up Я не спец и знаний не хватает, но думаю, что всё получится. Тем более основная часть написана, остался некоторый ряд частных вопросов. У меня единственный вопрос, не очень относящийся к сути, Ваша программа, она 32-разрядная?!

d petr
20-04-2008, 19:33
A.A.Z., Нечто подобное есть в этой (http://forum.oszone.net/thread-87550.html) теме. Там же можете и спросить у автора что и как.

A.A.Z.
20-04-2008, 19:43
У меня единственный вопрос, не очень относящийся к сути, Ваша программа, она 32-разрядная?! »Конечно :) Но 64-разрядную сделать будет не трудно, я думаю.
Нечто подобное есть в этой теме. Там же можете и спросить у автора что и как. »Спасибо, но там автор подменял сам установщик и работал с .sif'ом напрямую, а я всего лишь "заменяю" действия пользователя :)

Vadikan
20-04-2008, 21:32
A.A.Z., в принципе, можно было бы сделать мультизагрузку - FullUnattended и ProvideDefault.

A.A.Z.
20-04-2008, 21:59
в принципе, можно было бы сделать мультизагрузку - FullUnattended и ProvideDefault. »Вообще конечно да, но так более интересно :) Я собираюсь сделать сборку, которая будет устраивать как людей, которые не разбираются в этом во всём, так и более-менее продвинутых пользователей. Поэтому решил применить какое-нибудь изящное решение. Хотя идея с мультизагрузкой, наверное, самая простая в данной ситуации :)

[upd] В теории (пока что) можно будет в некоторых ситуациях отказываться от winnt.sif, чтобы сохранить консоль восстановления =) Я сейчас хочу заняться тем, чтобы понять, куда установка Windows, собственно, суёт все параметры из winnt.sif - может, их все можно будет "эмулировать" непосредственно в графическом этапе. Когда закончу - отпишусь =)

[upd2] Ура! :) Запустил Total Commander как DetachedProgram, дождался окончания установки устройств, установил Thinstall и WinRAR, замутил на своём ноуте виртуальный флоппик и теперь готов скопировать через него снимок "происходящего" на диске в данный момент. После этого планирую что-нибудь изменить в winnt.sif, прогнать установку ещё раз, сделать второй снимок и найти различия :)

[upd3] Наконец-то скопировал первый снимок системы, теперь очистил winnt.sif (всё, кроме [GuiAttended]) и собираюсь сделать второй снимок :)

[upd4] Сделал всё, убедился, что кроме %windir%\system32\$winnt$.inf (ну и оперативной памяти, естественно), настройки из winnt.sif нигде не хранятся. Сам $winnt$.inf опрашивается, судя по всему, практически сразу после запуска setup.exe, поэтому для более сложных манипуляций нужно действительно использовать метод подмены Setup'а (http://forum.oszone.net/thread-87550.html). Завтра подумаю, как можно объединить мою программку и проект spectre4/fantik :) Если получится, то будет одновременно а) полностью изменяемая конфигурация Windows прямо в процессе установки; б) полностью автоматизированная установка Windows; в) консоль восстановления вместе с этой самой конфигурацией (над этим придётся ещё думать и думать).

vserd
21-04-2008, 15:52
A.A.Z., В теории (пока что) можно будет в некоторых ситуациях отказываться от winnt.sif, чтобы сохранить консоль восстановления »
А чего там думать. там просто нужно секцию [Unattended] начисто снести и будет тебе счастье....
только если ты запускаешь на T39, то консоль уже давно пропущена....

A.A.Z.
21-04-2008, 16:47
А чего там думать. там просто нужно секцию [Unattended] начисто снести и будет тебе счастье....
только если ты запускаешь на T39, то консоль уже давно пропущена.... »В том-то и дело, что с помощью идеи о FakeSetup'е я попытаюсь отказаться от использования winnt.sif (точнее, заменяя его чем-то другим), создавая "вручную" $winnt$.inf в начале графического этапа установки и использования моей программки для дальнейшей автоматизации процесса (такие вещи, как, например, выбор раскладок клавиатуры, эмулировать довольно долго, поэтому я пока не отказываюсь от своей самой первой идеи).




© OSzone.net 2001-2012