Цель
Создание сценария Powershell для автоматизации предоставления компьютеров в домене.
Процесс сценария
(Перед запуском сценария Set-ExecutionPolicy Unrestricted
выполняется, затем сценарийзапускается от имени администратора.)
- Делать вещи.Получите переменные и сохраните их в реестре, если это необходимо, после перезагрузки.
- Создание запланированного задания для возобновления после перезагрузки.
- Присоединение к домену.
- Продолжение сценария после перезагрузки с помощью запланированного задания.Перезагрузите несколько раз до завершения.
Issue
По какой-то причине запланированное задание не будет запускаться после присоединения к домену и перезагрузки.После первой перезагрузки, если я открою задачу без внесения изменений и повторно введу пароль там, где будет предложено, он запустится и продолжит работу при последующих перезагрузках.
Я собирался запустить это как SYSTEM, ноЯ не могу сохранить учетные данные и возобновить их таким образом (так как они зашифрованы текущим пользователем, который первым открыл скрипт).Также, похоже, что Chocolatey не нравится устанавливать пакеты при запуске в качестве SYSTEM.
Я думаю, что переименование компьютера или присоединение к домену во время перезагрузки вызывает проблему.
Сценарий
Вот части, которые я считаю актуальными, но полный сценарий приведен на Github ниже, если я пропустил что-то важное.
Полный сценарий : https://github.com/gotylergo/w10-helpdesk-toolkit/blob/master/provision-pc.ps1
$ScriptDir = "$env:ProgramData\ProvisionPC"
$ScriptPath = "$ScriptDir\ProvisionPC.ps1"
function Set-ScheduledRebootTask {
$TaskAction = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NonInteractive -NoLogo -NoProfile -File $ScriptPath"
$TaskTrigger = New-ScheduledTaskTrigger -RandomDelay (New-TimeSpan -Minutes 5) -AtStartup
$TaskSettings = New-ScheduledTaskSettingsSet -DontStopOnIdleEnd -RestartInterval (New-TimeSpan -Minutes 1) -RestartCount 10 -StartWhenAvailable
$Task = New-ScheduledTask -Action $TaskAction -Trigger $TaskTrigger -Settings $TaskSettings
$CurrentUser = Get-CimInstance -ClassName Win32_ComputerSystem | Select-Object -expand UserName
$Task | Register-ScheduledTask -TaskName "ProvisionPC" -User $CurrentUser -Password $LocalAdminPwd
if ($?) {
Write-Output "Scheduled task created. Script will continue after reboot."
} else {
Write-Error "Scheduled task could not be created. Run script manually after reboot."
}
$DomainAdminUser = Read-Host "Enter your domain admin username in the form of domain.com\username"
$DomainAdminPwd = Read-Host "Enter your domain admin password" -AsSecureString
$Credentials = [System.Management.Automation.PSCredential]::new($DomainAdminUser, $DomainAdminPwd)
$DomainName = $Credentials.GetNetworkCredential().Domain
$NewPCName = Read-Host "Enter the new computer name"
$LocalAdminPwd = ""
if ($Pwd1_txt -eq $Pwd2_txt) {
$LocalAdminPwd = $Pwd1_txt
# Set password and enable Administrator account
Set-LocalUser -Name "Administrator" -Password $Pwd1 -PasswordNeverExpires:$true
if ($?) {
Write-Output "Administer password set."
} else {
Write-Error "Error: Couldn't set Administrator password. "
}
Enable-LocalUser -Name "Administrator"
if ($?) {
Write-Output "Administer account enabled."
} else {
Write-Error "Error: Couldn't enable administrator account. "
}
# Set currently logged in admin account password to Administrator password
Set-LocalUser -Name $env:UserName -Password $Pwd1 -PasswordNeverExpires:$true
if ($?) {
Write-Output "$env:UserName password set."
} else {
Write-Error "Error: Couldn't set $env:UserName password. "
}
} else {
throw "Passwords don't match!"
}
Set-ScheduledRebootTask
# Join to domain and restart
Add-Computer -DomainName $DomainName -Server HQ-corpdc01 -NewName $NewPCName -Credential $Credentials -Restart -Force