Configurations/PowerShellLab/PostSetup/RunAll.ps1
#requires -version 5.1 [cmdletbinding()] Param( #run the script without any prompting [Switch]$Force ) #this is here in case the script is aborted from previous runs [void]$PSDefaultParameterValues.remove("write-host:foregroundcolor") if (-Not $Force) { $msg = @" This control script will run all post update tasks on virtual machines that are part of the PowerShellLab Autolab configuration. It is assumed you have not modified anything in the configuration files. The script will do the following: - Run Windows Update on all virtual machines - Download Git on the Win10 client - Download Sysinternals tools on the Win10 client - Install VSCode on the Win10 client - Update PowerShell help on the Win10 client - Reboot all virtual machines Before running this script, all configuration setup must be complete. You must also have performed an interactive logon on the Windows 10 client with the Company\Administrator account to complete the Windows 10 setup. Once the profile is complete, you can log off. If any of the commands fail, try running it separately. Make sure all virtual machines are running before continuing. $(Get-VM Win10,SRV1,SRV2,SRV3,DOM1 | Out-String) "@ Clear-Host Write-Host $msg -ForegroundColor Cyan $coll = @() $coll+= [System.Management.Automation.Host.ChoiceDescription]::new("Yes &Y") $coll+= [System.Management.Automation.Host.ChoiceDescription]::new("No &N") $r = $host.ui.PromptForChoice("Do you want to continue with this script?","",$coll,1) If ($r -eq 1) { return } } #if not using -Force #set a default color for the progress messages $PSDefaultParameterValues.add("write-host:foregroundcolor","yellow") Get-Job | Remove-Job -force $pass = ConvertTo-SecureString -String "P@ssw0rd" -AsPlainText -Force #credential for domain administrator $admin = New-Object PSCredential "company\administrator",$pass #password for SRV3 which is in a workgroup $wg = New-Object PSCredential "srv3\administrator",$pass Write-Host "[$(Get-Date -format T)] Starting the post process" Write-Host "[$(Get-Date -format T)] Creating PSSessions" #create PSSessions. Some of these variables are un-used at this time $all = @() $srv3 = New-PSSession -VMName SRV3 -Credential $wg $all+=$srv3 $win10 = New-PSSession -VMName Win10 -Credential $admin $all+=$win10 $servers = New-PSSession -VMName SRV1,SRV2,DOM1 -Credential $admin $all+=$servers Write-Host "[$(Get-Date -format T)] Waiting for sessions to become available" Do { Start-Sleep -Seconds 1 } Until ( ($all| Get-PSSession).Availability -notcontains 'busy') Write-Host "[$(Get-Date -format T)] Running Windows Update" &$PSScriptRoot\Run-WindowsUpdate.ps1 -session $all -asJob Write-Host "[$(Get-Date -format T)] Waiting for Win10 session to become available" Do { Start-Sleep -Seconds 1 } Until ( ($win10|Get-PSSession).Availability -eq 'available') Write-Host "[$(Get-Date -format T)] Install SysInternals on Windows 10" &$PSScriptRoot\Install-Sysinternals.ps1 -Session $win10 | Out-Null Write-Host "[$(Get-Date -format T)] Waiting for Win10 session to become available" Do { Start-Sleep -Seconds 1 } Until ( ($win10|Get-PSSession).Availability -eq 'available') Write-Host "[$(Get-Date -format T)] Downloading Git on Windows 10" &$PSScriptRoot\Download-Git.ps1 -session $win10 | Out-Null Write-Host "[$(Get-Date -format T)] Waiting for Win10 session to become available" Do { Start-Sleep -Seconds 1 } Until ( ($win10|Get-PSSession).Availability -eq 'available') <# #add some name resolution calls to help with errors I'm getting about #being unable to resolve the redirected name Invoke-Command { Resolve-DnsName go.microsoft.com | Out-Null Resolve-DnsName azurewebsites.net | out-null Resolve-DnsName az764295.vo.msecnd.net | out-null } -Session $all #> Write-Host "[$(Get-Date -format T)] Installing VSCode on Windows 10" #for some unknown reason this fails when using an existing session # .\install-vscode -session $win10 | Out-Null &$PSScriptRoot\install-vscode.ps1 -VMName Win10 -Credential $admin | Out-Null Write-Host "[$(Get-Date -format T)] Updating PowerShell help on Windows 10" Do { Start-Sleep -Seconds 1 } Until ( ($win10 | Get-PSSession).Availability -eq 'available') #update help and suppress all error messages Invoke-Command { Update-Help -force -ErrorAction SilentlyContinue } -session $win10 Write-Host "[$(Get-Date -format T)] Waiting for Windows Update Jobs to complete" Wait-Job WinUp* Write-Host "[$(Get-Date -format T)] Stopping Windows 10" Stop-VM Win10 -AsJob | Wait-Job | Out-Null Write-Host "[$(Get-Date -format T)] Stopping member servers" Get-VM SRV1,SRV2,SRV3 | Stop-VM -Force -AsJob Write-Host "[$(Get-Date -format T)] Stopping DOM1" Stop-VM DOM1 -AsJob | Wait-Job | Out-Null Write-Host "[$(Get-Date -format T)] Restarting all virtual machines" Start-VM SRV3,DOM1 -asjob | Wait-Job | Out-Null Start-VM SRV1,SRV2,Win10 -asjob | Out-Null #clean up $all | Remove-PSSession $PSDefaultParameterValues.remove("write-host:foregroundcolor") Write-Host "[$(Get-Date -format T)] Ending the post process script" -ForegroundColor green |