我的公司希望使用 Syprep 映像和 autounattend.xml 文件来部署新机器或使用 USB 棒重建旧机器。我们不想使用 SCCM。我将鼓励我们在将来使用 WDS,但我们仍然希望能够通过将 USB 插入机器来实现这一点。
一段时间以来,我一直被一个难题困扰着,我无法让机器在首次登录后自动加入域。我正在使用一些 powershell 脚本来做到这一点。到目前为止,我只是在测试一个脚本来重命名机器。如果我自己在虚拟机上运行它,这会起作用,但如果我从 autounattend.xml 运行它,它将不起作用。Unattend 将在以管理员身份登录时运行一个脚本,该脚本将打开一个批处理文件,该文件以管理员身份运行 powershell 脚本并绕过脚本运行策略。然后该脚本将重命名 PC。
但事实并非如此。我在网上看到,无论如何你都无法通过 WDS 自动加入域,因为 Microsoft 有一个错误,它不允许您通过 OOBE 以外的任何方式加入。这意味着无论如何我都必须让这个脚本能够自动加入域。
当新 PC 首次启动时,我创建的其他脚本将运行,而这个脚本似乎从未实现任何目标。批处理文件似乎执行了,但脚本是否有效则取决于此。我在事件日志中没有看到任何错误。
以下脚本只是重新命名了机器。这只是一个测试。
无人值守脚本:
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 $path -TotalCount 1
如果存在标记最低的 PC 号码,则覆盖该号码。
Get-Content $path | ForEach-Object { if($_ -match ' -r'){ $listName = $_ } }
删除变量和列表中数字的标记。或者,如果是新 PC,它会将新数字添加到列表顶部。
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” + (获取内容 $path -Raw) | 设置内容 $path }`
清除白线。
(gc $path) | ? {$_.trim() -ne "" } | set-content $path
卸载网络驱动器
Remove-PSDrive -Name 'X'
正确格式化域名。
$listName = "Domain" + $listName
重命名电脑并重新启动(需要本地凭据)。
Rename-Computer -NewName $listName -Restart
我是不是做错了?任何建议都会有帮助。我几乎只是想听听别人对此事的看法。我有点束手无策,因为我没有太多东西可以尝试。
答案1
所以在捣鼓了一段时间后,我终于搞定了。我使用 Start-Transcript 为 PowerShell 创建日志文件,删除批处理文件,然后直接从 sysprepped 映像的第一个登录命令启动 PowerShell 脚本。
Rename-Computer
该脚本很可能根本没有运行,但我最终设法在使用该命令之前使用该命令将其加入域Add-Computer
。然后我重新启动了机器,一切就绪了!
谢谢你们的帮助,我对这样的脚本还很陌生,所以如果有什么可以向我学习的话,那就是记录脚本是必不可少的。