Сценарий автоматической установки Windows без создания второго пользователя группы Администраторы

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

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

Начиная с 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 целиком



    
        
            en-US
            ru-RU
            ru-RU
            ru-RU
        
        
            
                
                    
                        
                            /image/index
                            1
                        
                    
                
            
            
                true
            
        
    
    
        
            1
        
        
            false
            false
            false
        
        
            *
        
        
            0
        
        
            1
        
    
    
        
            en-US
            ru-RU
            ru-RU
            ru-RU
        
        
            
                true
                1
                
                    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>
</code></pre></div>

<p>Далее пройдём по&nbsp;этапам установки и&nbsp;параметрам указанным в&nbsp;соответствующих компонентах образа в&nbsp;файле сценария. Мой сценарий установки задаёт конфигурацию для&nbsp;следующих этапов: «windowsPE», «specialize», «oobeSystem».</p>

<h3>Настройка установочной среды&nbsp;— этап «windowsPE»</h3>

<p>Здесь с&nbsp;помощью группы параметров задаются языковые настройки. В&nbsp;настройках среды установки и&nbsp;устанавливаемой системы используется интерфейс на&nbsp;русском языке, русский формат даты и&nbsp;времени, но&nbsp;английская раскладка клавиатуры.</p>

<pre><code class="xml"><InputLocale>en-US</InputLocale>
<SystemLocale>ru-RU</SystemLocale>
<UILanguage>ru-RU</UILanguage>
<UserLocale>ru-RU</UserLocale></code></pre>

<p>Теоретически, один файл установочного образа системы&nbsp;— <em>install.wim</em> может содержать несколько индексов, т.е. разных редакций устанавливаемой ОС. Я&nbsp;подготавливаю свои образы так, чтобы они содержали только одну редакцию, а&nbsp;значит один индекс.</p>

<pre><code class="xml"><ImageInstall>
    <OSImage>
        <InstallFrom>
            <MetaData wcm:action="add">
                <Key>/image/index</Key>
                <Value>1</Value>
            </MetaData>
        </InstallFrom>
    </OSImage>
</ImageInstall></code></pre>

<p>Конечно, мы не&nbsp;хотим отвлекаться, чтобы ещё&nbsp;раз прочитать Лицензионное соглашение и&nbsp;принять его.</p>

<pre><code class="xml"><UserData>
    <AcceptEula>true</AcceptEula>
</UserData></code></pre>

<h3>Конфигурирование системы&nbsp;— этап «specialize»</h3>

<p>Каждый параметр на&nbsp;этом этапе задаёт определённые значения для&nbsp;компонентов. Кто читал мои предыдущие статьи&nbsp;— знает, что&nbsp;мне нравится оптимизировать работу ОС, отключая всё лишнее, ненужное. Так и&nbsp;здесь, указанные параметры в&nbsp;основном что-либо отключают. Данные действия также можно выполнить ручной настройкой на&nbsp;установленной системе.</p>

<p>Отключение отправки отчёта об&nbsp;ошибках в&nbsp;корпорацию Microsoft.</p>

<pre><code class="xml"><DisableWER>1</DisableWER></code></pre>

<p>Отключение функций удалённого помощника средствами Windows.</p>

<pre><code class="xml"><fAllowFullControl>false</fAllowFullControl>
<fAllowToGetHelp>false</fAllowToGetHelp>
<fEnableChatControl>false</fEnableChatControl></code></pre>

<p>Важный параметр&nbsp;— имя компьютера. Если этот параметр пропустить, то&nbsp;установка прервётся и&nbsp;спросит. Можно указать любое, но&nbsp;если с&nbsp;одного файла сценария будут произведены установки на&nbsp;множество компьютеров в&nbsp;локальной сети, то&nbsp;возникнут конфликты одинаковых имён. Указывается символ »<strong>*</strong>», чтобы имена генерировались случайно.</p>

<pre><code class="xml"><ComputerName>*</ComputerName></code></pre>

<p>Отказ от&nbsp;участия в&nbsp;программе улучшения качества программных продуктов методом сбора телеметрии. Есть предположение, что&nbsp;данный параметр игнорируется.</p>

<pre><code class="xml"><CEIPEnabled>0</CEIPEnabled></code></pre>

<p>Отключение системы восстановления Windows считаю рациональным решением, так как&nbsp;при&nbsp;серьёзных повреждениях ОС&nbsp;— мне её проще переустановить предварительно сохранив пользовательские файлы, чем выяснять причины невозможности загрузки.</p>

<pre><code class="xml"><DisableSR>1</DisableSR></code></pre>

<h3>Подготовка к&nbsp;первому запуску&nbsp;— этап «oobeSystem»</h3>

<p>Повторение настройки языковых параметров, но&nbsp;уже для&nbsp;установленной системы.</p>

<pre><code class="xml"><InputLocale>en-US</InputLocale>
<SystemLocale>ru-RU</SystemLocale>
<UILanguage>ru-RU</UILanguage>
<UserLocale>ru-RU</UserLocale></code></pre>

<p>В&nbsp;случае ручной установки, на&nbsp;завершающем этапе, программа предложит установщику создать пользователя, указав его имя и&nbsp;другие данные. Отказаться от&nbsp;создания пользователя&nbsp;— нельзя! Созданный пользователь будет принадлежать к&nbsp;группе «Администраторы» и&nbsp;войдёт в&nbsp;систему по&nbsp;завершении установки. Встроенный пользователь Администратор также присутствует, но&nbsp;будет отключён по-умолчанию. Это излишество, а&nbsp;также потенциальная уязвимость.</p>

<p>Я&nbsp;придумал следующий обходной трюк: создаём временного пользователя (в&nbsp;примере&nbsp;— имя «Временный») в&nbsp;группе Пользователи. Также, включаем встроенного Администратора с&nbsp;пустым паролем и&nbsp;разрешаем ему автоматическую авторизацию в&nbsp;системе. Задаём для&nbsp;Администратора асинхронную команду, выполняемую при&nbsp;первом входе&nbsp;— удалить пользователя «Временный». После перезагрузки Администратор выполняет команду и&nbsp;остаётся единственным (и&nbsp;всемогущим) активным пользователем в&nbsp;системе.</p>

<pre><code class="xml"><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></code></pre>

<p>Скрываем финальные диалоги входа в&nbsp;аккаунт Microsoft, подключения к&nbsp;беспроводным сетям и&nbsp;установливаем уровень безопасности.</p>

<pre><code class="xml"><HideOEMRegistrationScreen>true</HideOEMRegistrationScreen>
<HideOnlineAccountScreens>true</HideOnlineAccountScreens>
<HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
<ProtectYourPC>3</ProtectYourPC></code></pre>

<p>Обязательно указать часовой пояс, иначе процесс автоматической установки также прервётся запросом. Словесное наименование своего часового пояса нужно узнать из&nbsp;справочника. В&nbsp;моём примере&nbsp;— время по-Москве.</p>

<pre><code class="xml"><TimeZone>Russian Standard Time</TimeZone></code></pre>

<p>Отдельным и&nbsp;последним параметром идёт команда удалить агент восстановления Windows, как&nbsp;ненужный.</p>

<pre><code class="xml"><UninstallWindowsRE>true</UninstallWindowsRE></code></pre>

<h2>Послесловие</h2>

<p>Рассмотренный файл сценария <em>autounattend.xml</em> у&nbsp;меня сохранён в&nbsp;кодировке <strong>UTF-8</strong>, так что&nbsp;если копировать из&nbsp;статьи нужно поступить также. Для&nbsp;личных нужд имею модифицированные файлы <em>autounattend-mbr.xml</em> и&nbsp;<em>autounattend-gpt.xml</em>, в&nbsp;которых указаны параметры для&nbsp;автоматической разбивки диска в&nbsp;соответствующих стандартах. В&nbsp;общем, вариантов много и&nbsp;каждый может детально изучив документацию создать свой сценарий автоматической установки Windows.</p>
    
            <p class="copyrights"><span class="source">&copy;&nbsp;<a target="_blank" rel="nofollow" href="https://habr.com/ru/articles/818835/?utm_source=habrahabr&amp;amp;utm_medium=rss&amp;amp;utm_campaign=818835">Habrahabr.ru</a></span></p>
                    </div>
                                                    
            <br>
            <!--<div align="left">
                <script type="text/topadvert">
                load_event: page_load
                feed_id: 12105
                pattern_id: 8187
                tech_model:
                </script><script type="text/javascript" charset="utf-8" defer="defer" async="async" src="//loader.topadvert.ru/load.js"></script>
            </div>
            <br>-->

            <div style="padding-left: 20px;">
                <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2514821055276660"
                        crossorigin="anonymous"></script>
                <!-- PCNews 336x280 -->
                <ins class="adsbygoogle"
                     style="display:block"
                     data-ad-client="ca-pub-2514821055276660"
                     data-ad-slot="1200562049"
                     data-ad-format="auto"></ins>
                <script>
                    (adsbygoogle = window.adsbygoogle || []).push({});
                </script>
            </div>
            <!-- comments -->
                            <noindex>
                    <div style="margin: 25px;" id="disqus_thread"></div>
                    <script type="text/javascript">
                        var disqus_shortname = 'pcnewsru';
                        var disqus_identifier = '1451806';
                        var disqus_title = 'Сценарий автоматической установки Windows без создания второго пользователя группы Администраторы';
                        var disqus_url = 'http://pcnews.ru/blogs/scenarij_avtomaticeskoj_ustanovki_windows_bez_sozdania_vtorogo_polzovatela_gruppy_administratory-1451806.html';

                        (function() {
                            var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
                            dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
                            (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
                        })();
                    </script>
                    <!--<noscript>Please enable JavaScript to view the <a rel="nofollow" href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>-->
                    <!--<a href="http://disqus.com" rel="nofollow" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>-->
                </noindex>
            
        </div>

        <br class="clearer"/>
    </div>
    <br class="clearer"/>

    

        <div id="footer-2nd"></div>

        <div id="footer">
            <br/><br/>
            <ul class="horz-menu">
                <li class="about"><a href="/info/about.html" title="О проекте">О
                        проекте</a></li>
                <li class="additional-menu"><a href="/archive.html" title="Архив материалов">Архив</a>
                </li>
                <li class="additional-menu"><a href="/info/reklama.html"
                                               title="Реклама" class="menu-item"><strong>Реклама</strong></a>
                    <a href="/info/partners.html" title="Партнёры"
                       class="menu-item">Партнёры</a>
                    <a href="/info/legal.html" title="Правовая информация"
                       class="menu-item">Правовая информация</a>
                    <a href="/info/contacts.html" title="Контакты"
                       class="menu-item">Контакты</a>
                    <a href="/feedback.html" title="Обратная связь" class="menu-item">Обратная
                        связь</a></li>
                <li class="email"><a href="mailto:pcnews@pcnews.ru" title="Пишите нам на pcnews@pcnews.ru"><img
                                src="/media/i/email.gif" alt="e-mail"/></a></li>
                <li style="visibility: hidden">
                    <noindex>
                        <!-- Rating@Mail.ru counter -->
                        <script type="text/javascript">
                            var _tmr = window._tmr || (window._tmr = []);
                            _tmr.push({id: "93125", type: "pageView", start: (new Date()).getTime()});
                            (function (d, w, id) {
                                if (d.getElementById(id)) return;
                                var ts = d.createElement("script");
                                ts.type = "text/javascript";
                                ts.async = true;
                                ts.id = id;
                                ts.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//top-fwz1.mail.ru/js/code.js";
                                var f = function () {
                                    var s = d.getElementsByTagName("script")[0];
                                    s.parentNode.insertBefore(ts, s);
                                };
                                if (w.opera == "[object Opera]") {
                                    d.addEventListener("DOMContentLoaded", f, false);
                                } else {
                                    f();
                                }
                            })(document, window, "topmailru-code");
                        </script>
                        <noscript>
                            <div style="position:absolute;left:-10000px;">
                                <img src="//top-fwz1.mail.ru/counter?id=93125;js=na" style="border:0;" height="1"
                                     width="1" alt="Рейтинг@Mail.ru"/>
                            </div>
                        </noscript>
                        <!-- //Rating@Mail.ru counter -->

                    </noindex>
                </li>
            </ul>
        </div>

        <!--[if lte IE 7]>
        <iframe id="popup-iframe" frameborder="0" scrolling="no"></iframe>
        <![endif]-->
        <!--<div id="robot-image"><img class="rbimg" src="i/robot-img.png" alt="" width="182" height="305" /></div>-->
        <!--[if IE 6]>
        <script>DD_belatedPNG.fix('#robot-image, .rbimg');</script><![endif]-->

    </div>

<!--[if lte IE 7]>
<iframe id="ie-popup-iframe" frameborder="0" scrolling="no"></iframe>
<![endif]-->


    <div id="footer-adlinks"></div>

    
    
    
        <noindex>


            <!--LiveInternet counter--><script type="text/javascript">
                document.write("<a rel='nofollow' href='//www.liveinternet.ru/click' "+
                    "target=_blank><img src='//counter.yadro.ru/hit?t45.6;r"+
                    escape(document.referrer)+((typeof(screen)=="undefined")?"":
                        ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth?
                            screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+
                    ";"+Math.random()+
                    "' alt='' title='LiveInternet' "+
                    "border='0' width='1' height='1'><\/a>")
            </script><!--/LiveInternet-->

            <!-- Rating@Mail.ru counter -->
            <script type="text/javascript">
                var _tmr = window._tmr || (window._tmr = []);
                _tmr.push({id: "93125", type: "pageView", start: (new Date()).getTime()});
                (function (d, w, id) {
                    if (d.getElementById(id)) return;
                    var ts = d.createElement("script"); ts.type = "text/javascript"; ts.async = true; ts.id = id;
                    ts.src = "https://top-fwz1.mail.ru/js/code.js";
                    var f = function () {var s = d.getElementsByTagName("script")[0]; s.parentNode.insertBefore(ts, s);};
                    if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f, false); } else { f(); }
                })(document, window, "topmailru-code");
            </script><noscript><div>
                    <img src="https://top-fwz1.mail.ru/counter?id=93125;js=na" style="border:0;position:absolute;left:-9999px;" alt="Top.Mail.Ru" />
                </div></noscript>
            <!-- //Rating@Mail.ru counter -->



            <!-- Yandex.Metrika counter -->
            <script type="text/javascript">
                (function (d, w, c) {
                    (w[c] = w[c] || []).push(function () {
                        try {
                            w.yaCounter23235610 = new Ya.Metrika({
                                id: 23235610,
                                clickmap: true,
                                trackLinks: true,
                                accurateTrackBounce: true,
                                webvisor: true,
                                trackHash: true
                            });
                        } catch (e) {
                        }
                    });

                    var n = d.getElementsByTagName("script")[0],
                        s = d.createElement("script"),
                        f = function () {
                            n.parentNode.insertBefore(s, n);
                        };
                    s.type = "text/javascript";
                    s.async = true;
                    s.src = "https://mc.yandex.ru/metrika/watch.js";

                    if (w.opera == "[object Opera]") {
                        d.addEventListener("DOMContentLoaded", f, false);
                    } else {
                        f();
                    }
                })(document, window, "yandex_metrika_callbacks");
            </script>
            <noscript>
                <div><img src="https://mc.yandex.ru/watch/23235610" style="position:absolute; left:-9999px;" alt=""/>
                </div>
            </noscript>
            <!-- /Yandex.Metrika counter -->

            <!-- Default Statcounter code for PCNews.ru http://pcnews.ru-->
            <script type="text/javascript">
                var sc_project=9446204;
                var sc_invisible=1;
                var sc_security="14d6509a";
            </script>
            <script type="text/javascript"
                    src="https://www.statcounter.com/counter/counter.js"
                    async></script>
            <!-- End of Statcounter Code -->

            <script>
                (function (i, s, o, g, r, a, m) {
                    i['GoogleAnalyticsObject'] = r;
                    i[r] = i[r] || function () {
                            (i[r].q = i[r].q || []).push(arguments)
                        }, i[r].l = 1 * new Date();
                    a = s.createElement(o),
                        m = s.getElementsByTagName(o)[0];
                    a.async = 1;
                    a.src = g;
                    m.parentNode.insertBefore(a, m)
                })(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');

                ga('create', 'UA-46280051-1', 'pcnews.ru');
                ga('send', 'pageview');

            </script>

            <script async="async" src="/assets/uptolike.js?pid=49295"></script>

        </noindex>
    



<!--<div id="AdwolfBanner40x200_842695" ></div>-->
<!--AdWolf Asynchronous Code Start -->

<script type="text/javascript" src="https://pcnews.ru/js/blockAdblock.js"></script>

<script type="text/javascript" src="/assets/jquery.min.js"></script>
<script type="text/javascript" src="/assets/a70a9c7f/jquery/jquery.json.js"></script>
<script type="text/javascript" src="/assets/a70a9c7f/jquery/jquery.form.js"></script>
<script type="text/javascript" src="/assets/a70a9c7f/jquery/jquery.easing.1.2.js"></script>
<script type="text/javascript" src="/assets/a70a9c7f/jquery/effects.core.js"></script>
<script type="text/javascript" src="/assets/a70a9c7f/js/browser-sniff.js"></script>
<script type="text/javascript" src="/assets/a70a9c7f/js/scripts.js"></script>
<script type="text/javascript" src="/assets/a70a9c7f/js/pcnews-utils.js"></script>
<script type="text/javascript" src="/assets/a70a9c7f/js/pcnews-auth.js"></script>
<script type="text/javascript" src="/assets/a70a9c7f/js/pcnews-fiximg.js"></script>
<script type="text/javascript" src="/assets/a70a9c7f/js/pcnews-infobox.js"></script>
</body>
</html>