Domain

無人值守機器加入域

  • February 7, 2020

我的公司想使用 Syprep 映像和 autounattend.xml 文件來部署新機器或使用 U 盤重建舊機器。我們不想使用 SCCM。我將來會推動我們使用 WDS,但我們仍然希望能夠通過將 USB 插入機器來做到這一點。

我現在遇到了一個障礙,第一次登錄後我無法讓機器自動加入域。我正在使用一些 powershell 腳本來執行此操作。到目前為止,我只是在測試一個腳本來重命名機器。如果我自己在 VM 上執行它,這可以工作,但如果我從 autounattend.xml 執行它,它將無法工作。Unattend 將在以管理員身份登錄時執行腳本,該腳本將打開一個批處理文件,該批處理文件以管理員身份執行 powershell 腳本並繞過腳本執行策略。然後該腳本將重命名 PC。

除了,它沒有。線上 我已經看到無論如何您都無法通過 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 文件中。一旦管理員帳戶執行初始自動登錄,此腳本將執行。該腳本使用域管理員憑據來查找它將訪問的列表文件。輸入憑據後,腳本將檢查適當的 PC 名稱。如果它是一個新版本,它將簡單地查看列表中的頂部 PC 編號並將其自身重命名為該編號,同時將下一個編號添加到列表頂部。如果 PC 需要重建,請在其編號旁邊添加“-r”,例如:<< 199 -r >>。然後該腳本將刪除“-r”,重命名 PC 並且不會添加到列表中。如果有多個標記的數字,那麼它將以最小的數字為目標。該腳本將重新啟動 PC 並在執行後自行刪除。

為整個 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

定義現有域 PC 列表的路徑。從已安裝的驅動器中查找 txt exlist txt 文件。

$path = "X:\exlist.txt"

儲存列表的頂部編號。 $ listName = Get-Content -Path $ 路徑 -TotalCount 1

如果存在,則覆蓋用最低標記 PC 儲存的數字。

Get-Content $path | ForEach-Object { if($_ -match ' -r'){ $listName = $_ } }

從變數和列表中的數字中刪除標記。或者,如果它是一台新 PC,它將在列表頂部添加一個新號​​碼。

if($listName -match "(?&lt;content&gt;.*) -r"){ (Get-Content $path) -replace $listName, $listName.split(" ")[0] | Set-Content $path $listName = $matches['content'] } else { $listName = [string] ([int] $listName + 1) $listName + "n" + (獲取內容 $ path -Raw) | Set-Content $ 路徑}`

清理白線。

(gc $path) | ? {$_.trim() -ne "" } | set-content $path

解除安裝網路驅動器

Remove-PSDrive -Name 'X'

為域正確格式化名稱。

$listName = "Domain" + $listName

重命名 PC 並重新啟動(需要本地憑據)。

Rename-Computer -NewName $listName -Restart

我做錯了嗎?任何建議都會有所幫助。我幾乎只是想就此事發表第二意見。我有點被困在牆上,因為我沒有更多的東西可以嘗試。

因此,在修補了一段時間後,我終於明白了。我使用 Start-Transcript 為 PowerShell 創建日誌文件,刪除了批處理文件,然後直接從我的 sysprep 映像的第一個登錄命令啟動了 PowerShell 腳本。

該腳本很可能甚至沒有執行,但我最終通過在使用該Rename-Computer命令之前使用該Add-Computer命令將其加入域。然後我重新啟動了機器,這成功了!

感謝各位的幫助,我對這樣的腳本編寫相當陌生,所以如果要向我學習一件事,那就是記錄你的腳本是必不可少的。

引用自:https://serverfault.com/questions/988247