powershellcontinuerebootpowershell-workflow

PowerShell script doesnt continue after reboot


I am pretty new to PowerShell scripting so I wanted to write a script that helps our apprentices in setting up new laptops for our customers.

This script should rename the computer, then restart it and then proceed to install some software. Some of the software isnt available through winget because its our system software so I had to put in on a USB drive.

The PowerShell script should continue after the reboot but sadly it doesnt.

Set-ExecutionPolicy Unrestricted -force
Install-Module ThreadJob -Force
import-module ThreadJob
Install-Module PSWindowsUpdate -force
import-module pswindowsupdate
Import-Module ScheduledTasks
Install-Module -Name ScheduledJobTools -force
import-module ScheduledJobTools
function Install-SysInternalsTool{
    $targetDir = Join-Path $env:WinDir "System32\SysInternals"
    $tools = @{
        Autologon = "http://live.sysinternals.com/Autologon.exe"}
    Write-Verbose "Create Directory: $targetDir"
    New-Item -ItemType Directory -Path $targetDir -Force | Out-Null
    try{
        $wc = New-Object System.Net.WebClient
        foreach($tool in $tools.Values){          
            $filePath = Join-Path $targetDir ([IO.Path]::GetFileName($tool))
            Write-Verbose "Downloading $tool"
            $wc.DownloadFile($tool,$filePath)}}
    finally{
        $wc.Dispose()}}
function Enable-AutoLogon{
    param(
    [string] $UserName,
    [string] $Password)
    $exePath = Join-Path $env:WinDir "System32\SysInternals\AutoLogon.exe"
    if(!(Test-Path $exePath)){
        Write-Error "AutoLogon.exe is not found at $exePath"}
    $paths = $UserName.Split("\")
    $domain = $paths[0]
    $user   = $paths[1]
    Start-Process -FilePath  $exePath -ArgumentList "/accepteula", $user, $domain, $password -Wait}
Install-SysInternalsTool
Enable-AutoLogon -UserName ".\admin" -Password "#bs15081!"
$baseUri = 'https://github.com/microsoft/winget-cli/releases/download'
    $files = @(
        @{Uri = "$baseUri/v1.4.10173/Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle"
        OutFile = 'Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle'})
    $jobs = @()
    foreach ($file in $files) {
        $jobs += Start-ThreadJob -Name $file.OutFile -ScriptBlock {
            $params = $using:file
            Invoke-WebRequest @params}}
    Wait-Job -Job $jobs
    foreach ($job in $jobs) {
        Receive-Job -Job $job
        .\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle}
workflow renamereboot {
    $oldname = hostname
    $name = [Microsoft.VisualBasic.Interaction]::InputBox("Neuen Computernamen eingeben:", "Computer Name")
    Add-Type -AssemblyName Microsoft.VisualBasic
    Rename-Computer -NewName $name
    Register-ScheduledJob -Name renamerebootresume `
                      -ScriptBlock {
                          Get-Job -Name NewSetup -State Suspended `
                          | Resume-Job}
    Restart-Computer -pscomputername $oldname -Wait -For PowerShell
    unregister-scheduledjob -name renamerebootresume}
$laufwerk = get-volume | where drivetype -eq removable | foreach driveletter
$punkt=$laufwerk + ":"
<#if (-not(test-path -path $punkt)) {
    echo "Kein USB Stick angeschlossen"}
else {$labtech = Get-ChildItem "$punkt\Labtech" | where {$_.extension -eq ".msi"} | ForEach-Object {$_.FullName}
    start $labtech -NoNewWindow
    $sophos = Get-ChildItem "$punkt\Sophos" | where {$_.extension -eq ".exe"} | ForEach-Object {$_.FullName}
    start $sophos -NoNewWindow
    .\SwyxIt!German64.msi
    .\SophosConnect_2.2.75.msi}#>
#winget import $punkt\winget.json --ignore-versions --accept-package-agreements --accept-source-agreements
winget upgrade Microsoft.DesktopAppInstaller_8wekyb3d8bbwe -h --force --disable-interactivity --accept-package-agreements --accept-source-agreements
winget install -e Mozilla.Firefox -h --force --disable-interactivity --accept-package-agreements --accept-source-agreements
winget install -e geeksoftwareGmbH.PDF24Creator -h --force --disable-interactivity --accept-package-agreements --accept-source-agreements
winget install -e 7zip.7zip -h --force --disable-interactivity --accept-package-agreements --accept-source-agreements
winget install -e Adobe.Acrobat.Reader.64-bit -h --force --disable-interactivity --accept-package-agreements --accept-source-agreements
Get-WindowsUpdate -AcceptAll -Install -autoreboot
renamereboot -JobName NewSetup 2> error.log

Solution

  • Here is my sample script: script to execute(beforeRestart.ps1)

    $DefaultUsername = "admin" # Admin account must be present
    $DefaultPassword = "Password123"
    $command="c:\windows\system32\windowspowershell\v1.0\powershell.exe -executionpolicy unrestricted -File C:\Windows\Temp\afterRestart.ps1"
    $RegPath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
    Set-ItemProperty "HKLM:\Software\Microsoft\Windows\CurrentVersion\RunOnce" -Name '!RunItOnce' -Value $command
    Set-ItemProperty $RegPath "AutoAdminLogon" -Value "1" 
    Set-ItemProperty $RegPath "DefaultUsername" -Value $DefaultUsername
    Set-ItemProperty $RegPath "DefaultPassword" -Value $DefaultPassword 
    Write-Output "This computer is rebooted at $(Get-Date)" | Out-File "C:\Windows\Temp\restsarttest.txt" -Append
    Restart-Computer -Force
    

    Second script stored in C:\Windows\Temp as afterRestart.ps1

    Write-Output "$($env:COMPUTERNAME) is restarted and logged in with $($env:USERNAME) at $(Get-Date)" | Out-File "C:\Windows\Temp\secondrestart.txt" -Append
    Start-Process "msiexec.exe" -wait -ArgumentList '/I C:\Windows\Temp\softToInstall.msi /quiet'
    $RegPath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
    Remove-ItemProperty  -path $RegPath -name "AutoAdminLogon"
    Remove-ItemProperty -path  $RegPath -name "DefaultUsername" 
    Remove-ItemProperty -path  $RegPath -name "DefaultPassword"
    Restart-Computer -Force
    

    Note: This may not be the direct answer to your question, but this is how I did. Also, this script stores password in plain text, but yes it can be modified.