Моя компания хотела бы использовать образ Syprep и файл autounattend.xml для развертывания новых компьютеров или восстановления старых с помощью USB-накопителя. Мы не хотим использовать SCCM. Я буду подталкивать нас к использованию WDS в будущем, но мы по-прежнему хотим иметь возможность сделать это, просто вставив USB в машину.
Некоторое время я был пойман на одном препятствии: я не могу заставить машину автоматически присоединиться к домену после первого входа в систему. Для этого я использую несколько сценариев PowerShell. Пока я просто тестирую сценарий для переименования машины. Это работает, если я сам запустил его на виртуальной машине, но не будет работать, если я запущу его из autounattend.xml. Unattend запустит сценарий при входе в систему в качестве администратора, который откроет командный файл, который запускает сценарий PowerShell от имени администратора и обходит политику выполнения сценария. Затем этот сценарий переименует компьютер.
За исключением того, что это не так. В сети Я видел, что вы не можете выполнить автоматическое присоединение к домену через WDS в любом случае, поскольку у Microsoft есть ошибка, которая не позволяет вам присоединиться через какой-либо другой проход, кроме OOBE. Это означает, что в любом случае я должен заставить этот скрипт работать для автоматического присоединения к домену.
Когда новый компьютер загружается в первый раз, другие сценарии, которые я создал, будут запускаться, в то время как этот, кажется, никогда ничего не достигает. Кажется, что командный файл выполняется, но не важно, работает ли сценарий или нет. Я не вижу ошибок в журнале событий.
Приведенные ниже сценарии просто переименовывают машину. Это просто проверка.
Сценарий автоматической установки:
C:\_scripts\4_psbypass.bat
Пакетный скрипт:
@echo off
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""C:\_scripts\Rename-PC.ps1""' -Verb RunAs}"
@echo - PC name changed>> C:\log.txt
@echo - Joined to example domain>> C:\log.txt
@echo - Machine restarted>> C:\log.txt
del %0
Скрипт Powershell:
Этот сценарий будет помещен в WIM-файл образа, который мы развернем. Этот сценарий будет выполнен после того, как учетная запись администратора выполнит первоначальный автоматический вход. Сценарий использует учетные данные администратора домена, чтобы найти файл списка, к которому он будет обращаться. После ввода учетных данных сценарий проверит соответствующее имя ПК. Если это новая сборка, он просто посмотрит на верхний номер ПК в списке и переименует себя в этот номер, добавляя следующий номер в начало списка. Если ПК требует восстановления, добавьте '-r' рядом с его номером, например: << 199 -r >>. Затем сценарий удалит '-r', переименует компьютер и не будет добавлен в список. Если имеется несколько отмеченных номеров, то будет выбрано наименьшее число. Сценарий перезагрузит компьютер и удалит себя после выполнения.
Создает учетные данные для всего сценария PowerShell. Должен быть администратором домена.
$user = "Domain\admin"
$pass = Get-Content "C:\_scripts\_cred\adaapass.txt" | ConvertTo-SecureString
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $user, $pass
Временно подключает сетевой диск на время выполнения сценария.
New-PSDrive -Name 'X' -PSProvider FileSystem -Root "\\path\c$\DiskImagingPathTests\_scripts" -Credential $cred
Определяет путь к существующему списку компьютеров домена. Находит файл txt exlist txt на смонтированном диске.
$path = "X:\exlist.txt"
Сохраняет верхний номер списка. $ listName = Get-Content -Path $ path -TotalCount 1
Перезаписывает номер, сохраненный на самом младшем помеченном ПК, если он существует.
Get-Content $path | ForEach-Object {
if($_ -match ' -r'){
$listName = $_
}
}
Снимает отметку с числа в переменной и списке. Или, если это новый компьютер, он добавит новый номер в начало списка.
if($listName -match "(?<content>.*) -r"){
(Get-Content $path) -replace $listName, $listName.split(" ")[0] | Set-Content $path
$listName = $matches['content']
} else {
$listName = [string] ([int] $listName + 1)
$listName + "
n "+ (Get-Content $ path -Raw) | Set-Content $ path}`
Убирает белые пятна.
(gc $path) | ? {$_.trim() -ne "" } | set-content $path
Размонтирует сетевой диск
Remove-PSDrive -Name 'X'
Правильно форматирует имя для домена.
$listName = "Domain" + $listName
Переименовывает компьютер и перезагружается (требуются локальные учетные данные).
Rename-Computer -NewName $listName -Restart
Я поступаю неправильно? Любой совет поможет. Мне почти просто нужно второе мнение по этому поводу. Я как бы застрял у стены, потому что мне нечего больше пробовать.
Так что, повозившись с этим некоторое время, я наконец понял. Я использовал Start-Transcript для создания файлов журналов для PowerShell, удалил пакетные файлы и просто запустил сценарии PowerShell прямо из первой команды входа в систему моего sysprepped образа.
Скорее всего, сценарий даже не запускался, но мне удалось в конце концов присоединить его к домену, используя Rename-Computer
до того, как я использовал Add-Computer
команда. Затем я перезагрузил машину, и это сработало!
Спасибо за помощь, ребята, я новичок в написании подобных сценариев, поэтому, если есть чему поучиться у меня, так это тому, что очень важно вести журнал ваших скриптов.