Сегодня продолжение темы, которую я поднял в канале Telegram. Мы одним выстрелом убиваем двух зайцев:
- Ускоряем и упрощаем настройку новых компьютеров
- На любых ПК обходим требование ученой записи Microsoft при установке Windows
В Telegram я выложил первый вариант решения. Сегодня добавляю к нему второй и публикую объединённую запись в блоге.
[+] Сегодня в программе
Задача
Прочитав об экранах OOBE в Windows 11 24H2, товарищ Shirixae принес в личку свои трудности с процессом установки.
По работе ему регулярно приезжают новые ноутбуки, которые нужно настраивать и отдавать пользователям. Учетные записи Microsoft (MSA) им не нужны, поэтому требуется создавать локальный аккаунт. Первый шаг — всегда BypassNRO и перезагрузка. Дальше все экраны этапа OOBE, пусть у локального аккаунта их и поменьше чем у MSA
При этом чистая установка исключена по условиям задачи — ноутбуки должны быть в оригинальной комплектации, включая ОС. Продвинутых средств развертывания типа автопилота нет. Получается скучная и не интеллектуальная работа.
Суть решения
Запуск sysprep с указанием на файл ответов и перезагрузкой в OOBE!
Утилита sysprep входит в состав Windows и служит для подготовки образа к развертыванию. Она фигурировала в статье про создание настроенного образа системы. Там выполнялась операция обобщения образа, но здесь она не нужна.
Я покажу два варианта решения с разным расположением файла ответов.
Вариант 1 – файл ответов на флешке
Этот вариант я публиковал в Telegram. Задача решается в два шага:
- Скопируйте в корень флешки файл ответов с именем
UnattendOOBE.xml
, например. - На первом же экране OOBE (выбор региона) нажмите Shift + F10, щелкните окно командной строки и введите команду:
"C:\Windows\System32\Sysprep\sysprep.exe" /reboot /oobe /unattend:D:\UnattendOOBE.xml
Здесь C — буква тома с Windows, D — буква флешки. Во время установки определиться с буквами дисков можно с помощью diskpart — lis vol или блокнота.
Система перезагрузится и выполнит установку уже с учетом ваших параметров в файле ответов.
Ускорение
Чтобы не вводить длинную команду вручную каждый раз, рядом с файлом ответов создайте oobe.cmd
с таким содержимым:
powershell -command "(Get-Volume).DriveLetter | Foreach-Object {if (Test-Path "${PSItem}:\UnattendOOBE.xml") {&"$pwd\Sysprep\sysprep.exe /reboot /oobe /unattend:$(${PSItem}):\UnattendOOBE.xml"}}"
Тогда достаточно выполнить в консоли:
D:\oobe.cmd
Строго говоря, для этой задачи из моего файла ответов нужен только проход oobeSystem. Но удалять раздел windowsPE необязательно, он уже ни на что не повлияет.
Бонус
Если раскомментировать в моем файле ответов пароль учетной записи Admin и однократный автологон, этап OOBE автоматизируется полностью. Именно так можно создавать локальную учетную запись, обходя требование аккаунта Microsoft. Причем в связи с новыми препонами в 24H2 ценность файла ответов лишь возросла.
Вариант 2 – файл ответов в интернете
Прочитав о первом варианте в Telegram, Alexandr Petnitsky спросил, можно ли загрузить файл ответов из интернета, тем самым обходясь без флешки. В качестве примера он привел очень короткую и легко запоминающуюся команду для активации Windows с помощью пиратского KMS-сервера.
Нет проблем! На первом же экране OOBE (выбор региона) нажмите Shift + F10, щелкните окно командной строки и введите команду:
powershell -c "irm https://bit.ly/oobe | iex"
⚠️ В общем случае я не рекомендую запускать скрипты из интернета, потому что это небезопасно. Я привожу эту команду в демонстрационных целях, но она абсолютно рабочая.
В минутном ролике показаны все этапы процесса, который занимает 4-5 минут.
Как это работает
Из командной строки вызывается PowerShell, которому передается команда параметром -c
(сокращенный -command
). Командлет Invoke-RestMethod (псевдоним irm) скачивает скрипт PowerShell по ссылке и передает его на выполнение командлету Invoke-Expression (псевдоним iex).
Скрипт скачивает файл ответов, в котором автоматизированы все шаги OOBE. В том числе создается учетная запись Admin с паролем Admin. С этими учетными данными выполняется однократный автоматический вход в систему.
В принципе, можно не скачивать файл ответов, а сразу внедрить его в скрипт в закомментированном виде и извлекать на диск этим же скриптом. Но я предпочел не смешивать разные сущности.
Как настроить решение под себя
Для самостоятельной реализации этого решения вам понадобятся:
- Файл ответов и скрипт PowerShell, доступные в интернете по прямым ссылкам. Для размещения подойдут pastebin, GitHub и подобные сервисы.
- Сервис для сокращения ссылки на скрипт. Это не обязательно, но сокращает команду. Я использовал https://bitly.com/.
Файл ответов
Вы можете взять мой файл ответов из pastebin или статьи в блоге и доработать его для своих целей. Как минимум, задать свое имя и пароль для локальной учетной записи.
Скрипт PowerShell
Скрипт состоит из двух частей.
# Automating OOBE by downloading an answer file from the internet # https://www.outsidethebox.ms/22491/#internet # # # # # # # # # # # # # # # # # # # # ################ # # # # # # # # # # # # # # # # # # # # ################ # Pre-checks: if not in OOBE, exit out # https://oofhours.com/2023/09/15/detecting-when-you-are-in-oobe/ $TypeDef = @" using System; using System.Text; using System.Collections.Generic; using System.Runtime.InteropServices; namespace Api { public class Kernel32 { [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern int OOBEComplete(ref int bIsOOBEComplete); } } "@ Add-Type -TypeDefinition $TypeDef -Language CSharp $IsOOBEComplete = $false $hr = [Api.Kernel32]::OOBEComplete([ref] $IsOOBEComplete) if ($IsOOBEComplete) { Write-Host "Not in OOBE, nothing to do." exit 0 } # # # # # # # # # # # # # # # # # # # # ################ # Download the answer file and point sysprep to it Write-Host "Your username and password will be: Admin/Admin" -ForegroundColor DarkGreen $uri = "https://pastebin.com/raw/aiLyKTXQ" $answer = "$env:temp\UnattendOOBE.xml" (Invoke-RestMethod -Uri $uri).OuterXml | Out-File -FilePath $answer -Encoding utf8 -Force foreach ($letter in $((Get-Volume).DriveLetter)) { if (Test-Path "$($letter):\Windows\System32\Sysprep\sysprep.exe") { Invoke-Expression "$($letter):\Windows\System32\Sysprep\sysprep.exe /reboot /oobe /unattend:$answer" break } }
Первая часть необязательная, но важная. Она проверяет, находимся ли мы на этапе OOBE (спасибо, Майкл Нихауз). Это хорошая страховка от случайного выполнения в рабочей системе.
Во второй части в дело вступают те же самые командлеты Invoke-RestMethod и Invoke-Expression. Файл ответов скачивается во временную папку и сохраняется на диск в кодировке UTF-8. Затем он передается в качестве параметра утилите sysprep.
Заключение
У обоих вариантов общий знаменатель — sysperp и файл ответов. Однако дальше они полностью противоположны: в первом варианте интернет не нужен, а во втором без него не обойтись.
Должен признаться, что мне не приходило в голову размещать файл ответов в интернете, пока мне не задали вопрос. И я практически сразу начал использовать этот метод в своих экспериментах на виртуальных машинах!
Разумеется, если я добавляю в ISO свои твики и скрипты, все автоматизируется с самого первого прохода WindowsPE. Но иногда мне нужно просто проверить другое издание и/или язык, и пересобирать ради этого ISO нет смысла. На копирование файлов и создание нового образа уйдет больше времени, чем на ручные действия на этапе Windows PE. А на этапе OOBE можно уже и скрипт вызвать.
Авто Баня
А можно сделать запрос логина пароля в командной строке?