Автоматизация процесса установки с использованием файла ответов
Автоматизация процесса установки с использованием файла ответов

Начиная с 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.

Комментарии (10)


  1. NikaLapka
    01.06.2024 17:14

    ..Встроенный пользователь Администратор также присутствует но будет отключён по-умолчанию. Это излишество, а также потенциальная уязвимость.

    Я придумал .. создаём временного пользователя (в примере - имя "Временный") в группе Пользователи. Также, включаем встроенного Администратора с пустым паролем и разрешаем ему автоматическую авторизацию в системе. Задаём для Администратора асинхронную команду, выполняемую при первом входе - удалить пользователя "Временный". После перезагрузки Администратор выполняет команду и остаётся единственным (и всемогущим) активным пользователем в системе.

    Вы перепутали окошки, такие советы нужно на Двач постить, а не на хабр.


  1. dartraiden
    01.06.2024 17:14

    Это излишество

    Сколько и чего вы сэкономите, используя встроенного администратора?

    а также потенциальная уязвимость

    Каким образом?

    Отключение системы восстановления Windows считаю рациональным решением, так как при серьёзных повреждениях ОС - мне её проще переустановить предварительно сохранив пользовательские файлы, чем выяснять причины невозможности загрузки.

    А при несерьёзных? Отключение восстановления - это выстрел себе в ногу. Точки восстановления это самый лучший и простой способ быстрого решения внезапных проблем, который надо пробовать в первую очередь. Причем, точки восстановления могут помочь даже в тяжёлых случаях, когда нет резервных копий реестра (создание которых по умолчанию выключено).

    Повода гордиться тем, что переустановить проще, чем изучить логи, я тоже не вижу.


    1. isadora-6th
      01.06.2024 17:14

      Я никогда не страдал выключательством точек восстановления, но как-то за жизнь при поломках чаще всего видел многозначительное "нет недавних точек восстановления системы" или при восстановлении оно ему особо не помогало.

      Но вообще, обычно если система не может делать 'sfc /scannow' с ошибкой - жить ей не очень долго так то.


  1. nronnie
    01.06.2024 17:14

    В Линуксе вы тоже под root работаете?


  1. fat_dude
    01.06.2024 17:14

    А разве wds ещё работает? С 11 винды система раскатывается только с mdt, об этом прям в установщике говорит. К слову, им настраивать всё ещё проще, не надо мучаться с ADK и файлами ответов, интерфейс там чуток понятнее.

    А в целом это всё та же установка с xml и DISM.EXE, так что сути не меняется.


    1. navion
      01.06.2024 17:14

      MDT тоже уже deprecated и никогда официально не поддержил Windows 11, остался только SCCM.

      А правильно сделанный OSD в MDT на порядок сложнее файла ответов (который можно сгенерить онлайн) с PXE.


      1. fat_dude
        01.06.2024 17:14

        Оно просто не будет работать с файлом ответов
        Оно просто не будет работать с файлом ответов

        If you currently use WDS with boot.wim from installation media for end-to-end operating system deployment, and your OS version isn't supported, deprecated, or blocked, it's recommended that you use deployment tools such as MDT, Configuration Manager, or a non-Microsoft solution with a custom boot.wim image.

        Ну пока что в официальной доке про это ничего не сказано. Блин, вообще грусно, MDT отличная вещь для дома и небольших сетей. Опять долбаться с майкрософтовским мусором, только эту штуку настроил.

        А что сложного в настройке MDT? Дефолтный task sequence работает отлично, просто немножечко параметров накинуть в ini файлы и скрипт чтоб админа выключал встроенного:

        $ADMINACCOUNT = Get-LocalUser | ? { $_.SID -like 'S-1-5-21-*-500'}
        Disable-LocalUser -InputObject $ADMINACCOUNT
        New-Item 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList' -Force | New-ItemProperty -Name $ADMINACCOUNT.Name -Value 0 -PropertyType DWord -Force
        


        1. navion
          01.06.2024 17:14

          А что сложного в настройке MDT?

          Для текущей задачи он избыточен, а если делать полноценный OSD, то придётся изучить целый мир вокруг MDT. Возможно PSD продлит ему жизнь, но проект ведёт полтора человека и тоже могут забросить в любой момент.


  1. Busla
    01.06.2024 17:14

    обходные трюки не нужны — погуглите «boot into audit mode»


  1. rdp
    01.06.2024 17:14

    Встроенный пользователь Администратор также присутствует но будет отключён по-умолчанию. Это излишество, а также потенциальная уязвимость.

    Это устранение уязвимости.