Minha empresa gostaria de usar uma imagem Syprep e um arquivo autounattend.xml para implantar novas máquinas ou reconstruir as antigas com um pendrive. Não queremos usar SCCM. Vou nos pressionar a usar o WDS no futuro, mas ainda queremos poder fazer isso apenas colocando um USB na máquina.
Eu fui pego em um obstáculo por um tempo agora, não consigo fazer a máquina ingressar no domínio automaticamente após o primeiro logon. Estou usando alguns scripts powershell para fazer isso. Até agora estou apenas testando um script para renomear a máquina. Isso funciona se eu mesmo executá-lo em uma VM, mas não funcionará se eu executá-lo a partir do autounattend.xml. O Unattend executará um script no logon como administrador que abrirá um arquivo em lote que executa um script powershell como administrador e ignora a política de execução do script. Esse script renomeará o PC.
Exceto, não. Online, vi que você não pode fazer o ingresso no domínio automaticamente através do WDS, pois a Microsoft tem um bug que não permite que você entre por qualquer passagem que não seja OOBE. O que significa que, de qualquer forma, tenho que fazer com que esse script funcione para uma associação automática de domínio.
Quando o novo PC for inicializado pela primeira vez, outros scripts que criei serão executados, enquanto este parece nunca conseguir nada. Parece que o arquivo de lote é executado, mas o script funciona ou não. Não vejo nenhum erro no log de eventos.
Os scripts abaixo simplesmente renomeiam a máquina. Isto é apenas como um teste.
Script autônomo:
C:\_scripts\4_psbypass.bat
Roteiro em lote:
@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
Script Powershell:
Este script será colocado no arquivo WIM da imagem que iremos implantar. Uma vez que a conta de administrador executa um autologon inicial, este script será executado. O script usa credenciais de administrador de domínio para encontrar o arquivo de lista que ele acessará. Depois que as credenciais forem inseridas, o script verificará o nome do PC apropriado. Se for uma nova compilação, ele simplesmente olhará para o número do PC no topo da lista e se renomeará para esse número enquanto adiciona o próximo número ao topo da lista. Se um PC precisar de reconstrução, adicione um ' -r' ao lado de seu número, por exemplo: << 199 -r >>. O script removerá o ' -r', renomeará o PC e não adicionará à lista. Se houver vários números marcados, ele terá como alvo o número mais baixo. O script reiniciará o PC e se excluirá após a execução.
Cria a credencial para todo o script do powershell. Precisa ser administrador de domínio.
$user = "Domain\admin"
$pass = Get-Content "C:\_scripts\_cred\adaapass.txt" | ConvertTo-SecureString
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $user, $pass
Monta a unidade de rede temporariamente durante o script.
New-PSDrive -Name 'X' -PSProvider FileSystem -Root "\\path\c$\DiskImagingPathTests\_scripts" -Credential $cred
Define o caminho para a lista existente de PCs de domínio. Localiza o arquivo txt exlist txt da unidade montada.
$path = "X:\exlist.txt"
Armazena o número superior da lista. $listName = Get-Content -Path $path -TotalCount 1
Substitui o número armazenado com o PC marcado mais baixo, se houver.
Get-Content $path | ForEach-Object {
if($_ -match ' -r'){
$listName = $_
}
}
Remove a marca do número na variável e na lista. Ou se for um novo PC, adicionará um novo número ao topo da lista.
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 }`
Limpa linhas brancas.
(gc $path) | ? {$_.trim() -ne "" } | set-content $path
Desmonta a unidade de rede
Remove-PSDrive -Name 'X'
Formata o nome corretamente para o domínio.
$listName = "Domain" + $listName
Renomeia o PC e reinicia (requer credenciais locais).
Rename-Computer -NewName $listName -Restart
Estou indo sobre isso errado? Qualquer conselho será de ajuda. Eu quase só quero uma segunda opinião sobre o assunto. Estou meio que preso em uma parede, já que não tenho muito mais coisas para tentar.
Então, depois de mexer nisso por um tempo, finalmente consegui. Eu usei Start-Transcript para criar arquivos de log para o PowerShell, removi os arquivos em lote e apenas iniciei os scripts do PowerShell diretamente do primeiro comando de logon da minha imagem sysprepped.
O script provavelmente nem estava em execução, mas consegui juntá-lo ao domínio eventualmente usando o
Rename-Computer
comando antes de usar oAdd-Computer
comando. Então eu reiniciei a máquina e isso funcionou!Obrigado pela ajuda pessoal, sou bastante novo em scripts como este, então se há uma coisa a aprender comigo, é que registrar seus scripts é essencial.