Назад | Перейти на главную страницу

Автоматическое присоединение машины к домену

Моя компания хотела бы использовать образ 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 команда. Затем я перезагрузил машину, и это сработало!

Спасибо за помощь, ребята, я новичок в написании подобных сценариев, поэтому, если есть чему поучиться у меня, так это тому, что очень важно вести журнал ваших скриптов.