Начиная с Windows 7 компания Microsoft разработала новую технологию массовой установки (развёртывания) своей операционной системы. В оригинальных образах дистрибутивов появились ключевые файлы boot.wim и install.wim, которые являются Предустановочной средой (англ. - Preinstallation Environment, PE) и Устанавливаемой системой, соответственно. И хотя, версии Windows: 7, 8, 8.1 являются устаревшими, а текущими являются версии Windows: 10 и 11, процесс развёртывания (автоматической установки) указанных операционных систем в целом не поменялся. Поэтому приведённые здесь мои наработки работоспособны для всех версий, за исключением некоторых не критичных параметров. А вот в Windows XP всё было по-другому.
Официальная документация и инструменты
На сайте Microsoft Learn - документации компании, есть раздел посвящённый загрузке и установке Windows для производителей компьютеров. Там присутствует подраздел Windows Setup Automation Overview (рус. - Обзор автоматической установки Виндовс). В этом и последующих разделах (есть перевод на русский язык, но может быть несовершенным) подробно описано использование файлов сценариев, этапы установки ОС, конфигурирование системы с помощью скриптов. Замечу, что когда сам осваивал эту технологию и лет 8 назад читал официальную документацию - информация подавалась более логично и полно, а сейчас как-то намешано и неясно, но другого официального источника не нашел нет.
Для создания (генерирования) подходящего сценария автоматической установки - файла autounattend.xml к предполагаемому для развёртывания Установочного образа - файла install.wim используется официальный бесплатный инструмент - Windows Assessment and Deployment Kit (рус. - Средство оценки и развёртывания Виндовс). Скачать подходящую версию можно со страницы Download and install the Windows ADK, а после установить на свой компьютер. Править файл сценария можно и в обычном текстовом редакторе, если знаешь что делаешь, но после желательно проверить ошибки в синтаксисе и применимость параметров к развёртываемому образу с помощью конфигуратора.
Пример файла сценария автоматической установки
Мой вариант создан для автоматической установки 64-битной версии Windows 10 VL (корпоративное лицензирование без ввода ключа во время установки). Указаны языковые параметры, применены некоторые твики, выполнен "трюк" с пользователями, и скрыты различные экраны подтверждения. Работа с диском оставлена на "ручную" настройку.
Файл autounattend.xml целиком
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
<settings pass="windowsPE">
<component name="Microsoft-Windows-International-Core-WinPE" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<InputLocale>en-US</InputLocale>
<SystemLocale>ru-RU</SystemLocale>
<UILanguage>ru-RU</UILanguage>
<UserLocale>ru-RU</UserLocale>
</component>
<component name="Microsoft-Windows-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ImageInstall>
<OSImage>
<InstallFrom>
<MetaData wcm:action="add">
<Key>/image/index</Key>
<Value>1</Value>
</MetaData>
</InstallFrom>
</OSImage>
</ImageInstall>
<UserData>
<AcceptEula>true</AcceptEula>
</UserData>
</component>
</settings>
<settings pass="specialize">
<component name="Microsoft-Windows-ErrorReportingCore" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<DisableWER>1</DisableWER>
</component>
<component name="Microsoft-Windows-RemoteAssistance-Exe" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<fAllowFullControl>false</fAllowFullControl>
<fAllowToGetHelp>false</fAllowToGetHelp>
<fEnableChatControl>false</fEnableChatControl>
</component>
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ComputerName>*</ComputerName>
</component>
<component name="Microsoft-Windows-SQMApi" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<CEIPEnabled>0</CEIPEnabled>
</component>
<component name="Microsoft-Windows-SystemRestore-Main" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<DisableSR>1</DisableSR>
</component>
</settings>
<settings pass="oobeSystem">
<component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<InputLocale>en-US</InputLocale>
<SystemLocale>ru-RU</SystemLocale>
<UILanguage>ru-RU</UILanguage>
<UserLocale>ru-RU</UserLocale>
</component>
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<AutoLogon>
<Enabled>true</Enabled>
<LogonCount>1</LogonCount>
<Password>
<PlainText>true</PlainText>
<Value></Value>
</Password>
<Username>Administrator</Username>
</AutoLogon>
<FirstLogonCommands>
<SynchronousCommand wcm:action="add">
<CommandLine>net user Временный /delete</CommandLine>
<Order>1</Order>
</SynchronousCommand>
</FirstLogonCommands>
<OOBE>
<HideOEMRegistrationScreen>true</HideOEMRegistrationScreen>
<HideOnlineAccountScreens>true</HideOnlineAccountScreens>
<HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
<ProtectYourPC>3</ProtectYourPC>
</OOBE>
<TimeZone>Russian Standard Time</TimeZone>
<UserAccounts>
<AdministratorPassword>
<PlainText>true</PlainText>
<Value></Value>
</AdministratorPassword>
<LocalAccounts>
<LocalAccount wcm:action="add">
<Group>Users</Group>
<Name>Временный</Name>
<Password>
<PlainText>true</PlainText>
<Value></Value>
</Password>
</LocalAccount>
</LocalAccounts>
</UserAccounts>
</component>
<component name="Microsoft-Windows-WinRE-RecoveryAgent" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<UninstallWindowsRE>true</UninstallWindowsRE>
</component>
</settings>
</unattend>
Далее пройдём по этапам установки и параметрам указанным в соответствующих компонентах образа в файле сценария. Мой сценарий установки задаёт конфигурацию для следующих этапов: "windowsPE", "specialize", "oobeSystem".
Настройка установочной среды - этап "windowsPE"
Здесь с помощью группы параметров задаются языковые настройки. В настройках среды установки и устанавливаемой системы используется интерфейс на русском языке, русский формат даты и времени, но английская раскладка клавиатуры.
<InputLocale>en-US</InputLocale>
<SystemLocale>ru-RU</SystemLocale>
<UILanguage>ru-RU</UILanguage>
<UserLocale>ru-RU</UserLocale>
Теоретически, один файл установочного образа системы - install.wim может содержать несколько индексов, т.е. разных редакций устанавливаемой ОС. Я подготавливаю свои образы так, чтобы они содержали только одну редакцию, а значит один индекс.
<ImageInstall>
<OSImage>
<InstallFrom>
<MetaData wcm:action="add">
<Key>/image/index</Key>
<Value>1</Value>
</MetaData>
</InstallFrom>
</OSImage>
</ImageInstall>
Конечно, мы не хотим отвлекаться, чтобы ещё раз прочитать Лицензионное соглашение и принять его.
<UserData>
<AcceptEula>true</AcceptEula>
</UserData>
Конфигурирование системы - этап "specialize"
Каждый параметр на этом этапе задаёт определённые значения для компонентов. Кто читал мои предыдущие статьи - знает, что мне нравится оптимизировать работу ОС, отключая всё лишнее, ненужное. Так и здесь, указанные параметры в основном что-либо отключают. Данные действия также можно выполнить ручной настройкой на установленной системе.
Отключение отправки отчёта об ошибках в корпорацию Microsoft.
<DisableWER>1</DisableWER>
Отключение функций удалённого помощника средствами Windows.
<fAllowFullControl>false</fAllowFullControl>
<fAllowToGetHelp>false</fAllowToGetHelp>
<fEnableChatControl>false</fEnableChatControl>
Важный параметр - имя компьютера. Если этот параметр пропустить, то установка прервётся и спросит. Можно указать любое, но если с одного файла сценария будут произведены установки на множество компьютеров в локальной сети, то возникнут конфликты одинаковых имён. Указывается символ "*", чтобы имена генерировались случайно.
<ComputerName>*</ComputerName>
Отказ от участия в программе улучшения качества программных продуктов методом сбора телеметрии. Есть предположение, что данный параметр игнорируется.
<CEIPEnabled>0</CEIPEnabled>
Отключение системы восстановления Windows считаю рациональным решением, так как при серьёзных повреждениях ОС - мне её проще переустановить предварительно сохранив пользовательские файлы, чем выяснять причины невозможности загрузки.
<DisableSR>1</DisableSR>
Подготовка к первому запуску - этап "oobeSystem"
Повторение настройки языковых параметров, но уже для установленной системы.
<InputLocale>en-US</InputLocale>
<SystemLocale>ru-RU</SystemLocale>
<UILanguage>ru-RU</UILanguage>
<UserLocale>ru-RU</UserLocale>
В случае ручной установки, на завершающем этапе, программа предложит установщику создать пользователя, указав его имя и другие данные. Отказаться от создания пользователя - нельзя! Созданный пользователь будет принадлежать к группе "Администраторы" и войдёт в систему по завершении установки. Встроенный пользователь Администратор также присутствует но будет отключён по-умолчанию. Это излишество, а также потенциальная уязвимость.
Я придумал следующий обходной трюк: создаём временного пользователя (в примере - имя "Временный") в группе Пользователи. Также, включаем встроенного Администратора с пустым паролем и разрешаем ему автоматическую авторизацию в системе. Задаём для Администратора асинхронную команду, выполняемую при первом входе - удалить пользователя "Временный". После перезагрузки Администратор выполняет команду и остаётся единственным (и всемогущим) активным пользователем в системе.
<AutoLogon>
<Enabled>true</Enabled>
<LogonCount>1</LogonCount>
<Password>
<PlainText>true</PlainText>
<Value></Value>
</Password>
<Username>Administrator</Username>
</AutoLogon>
<FirstLogonCommands>
<SynchronousCommand wcm:action="add">
<CommandLine>net user Временный /delete</CommandLine>
<Order>1</Order>
</SynchronousCommand>
</FirstLogonCommands>
<UserAccounts>
<AdministratorPassword>
<PlainText>true</PlainText>
<Value></Value>
</AdministratorPassword>
<LocalAccounts>
<LocalAccount wcm:action="add">
<Group>Users</Group>
<Name>Временный</Name>
<Password>
<PlainText>true</PlainText>
<Value></Value>
</Password>
</LocalAccount>
</LocalAccounts>
</UserAccounts>
Скрываем финальные диалоги входа в аккаунт Microsoft, подключения к беспроводным сетям и установливаем уровень безопасности.
<HideOEMRegistrationScreen>true</HideOEMRegistrationScreen>
<HideOnlineAccountScreens>true</HideOnlineAccountScreens>
<HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
<ProtectYourPC>3</ProtectYourPC>
Обязательно указать часовой пояс, иначе процесс автоматической установки также прервётся запросом. Словесное наименование своего часового пояса нужно узнать из справочника. В моём примере - время по-Москве.
<TimeZone>Russian Standard Time</TimeZone>
Отдельным и последним параметром идёт команда удалить агент восстановления Windows, как ненужный.
<UninstallWindowsRE>true</UninstallWindowsRE>
Послесловие
Рассмотренный файл сценария autounattend.xml у меня сохранён в кодировке UTF-8, так что если копировать из статьи нужно поступить также. Для личных нужд имею модифицированные файлы autounattend-mbr.xml и autounattend-gpt.xml, в которых указаны параметры для автоматической разбивки диска в соответствующих стандартах. В общем, вариантов много и каждый может детально изучив документацию создать свой сценарий автоматической установки Windows.