Upgrade naar PowerShell 5: Gemakkelijke Stappen & Scripts

Als je besluit om PowerShell 5.1 te installeren, heb ik een technische handleiding gemaakt met enkele scripts om dit proces voor jou te automatiseren.

Disclaimer: Alle code die in dit bericht wordt genoemd, is ‘as is’. Sommige kunnen werken, sommige werken mogelijk niet in jouw omgeving, maar als je niets hebt om mee te beginnen, zal het dienen als een sjabloon om mee te beginnen.

Als je hulp nodig hebt bij het vinden van de versie van PowerShell die je gebruikt, raad ik aan om How to Check your PowerShell Version (All the Ways!) te bekijken.

Stap #1: Ontdekking

De eerste stap bij het uitvoeren van een bedrijfsbrede upgrade van PowerShell is ontdekking. Hoe ziet het huidige landschap eruit? Je kunt iets niet veranderen zonder het eerst te begrijpen, en verrassend genoeg hebben veel organisaties geen idee wat ze hebben!

Bestaande besturingssystemen

De eerste taak is om te begrijpen welke besturingssystemen je momenteel hebt waar je PowerShell 5.1 wilt implementeren. Hoewel, op sommige systemen, heb je mogelijk al besloten om PowerShell 5.1 te installeren en weet je het niet. PowerShell 5.1 is uitgebracht als een gebundeld hulpmiddel in de Windows 10 Anniversary Update en in de RTM-versie van Windows Server 2016, dus als je een van die besturingssystemen of nieuwer hebt, ben je al klaar.

Voor de andere systemen moet je een lijst verzamelen. Heb je geen systeembeheertool zoals SCCM? Geen probleem! Gebruik PowerShell om PowerShell te helpen! Als je Active Directory hebt, is hier een snelle one-liner om een overzicht te krijgen van wat er is.

PS> Get-ADComputer -Filter "OperatingSystem -like 'Windows*'" -Properties OperatingSystem | group operatingsystem | sort name
Count Name                      Group
----- ----                      -----
922 Windows 10 Enterprise     XXXXXXXXXXXXXXXXXX
714 Windows 7 Enterprise      XXXXXXXXXXXXXXXXXX
23 Windows 7 Professional     XXXXXXXXXXXXXXXXXX
4 Windows 7 Ultimate          XXXXXXXXXXXXXXXXXX
2 Windows 8 Consumer Pre...   XXXXXXXXXXXXXXXXXX
1 Windows 8 Enterprise        XXXXXXXXXXXXXXXXXX

Hoe ziet jouw omgeving eruit? Heb je nog oude Windows XP- of Server 2003-machines? Zo ja, dan heb je pech. Het beste wat je daar kunt doen is PowerShell v2, maar als je nog steeds een aantal van die machines in jouw omgeving hebt, is PowerShell het minste van je zorgen! Voor elk besturingssysteem dat Windows 7 SP1/Windows Server 2008R2 SP1 of hoger heeft, kan PowerShell 5.1 worden geïnstalleerd.

Het opstellen van een lijst met vereiste doelen

Op toepasselijke besturingssystemen heeft PowerShell 5.1 een paar vereisten en eisen waaraan moet worden voldaan voordat het werkt.

  • Ten minste .NET Framework 4.5.2 geïnstalleerd. Dit is geen installatievereiste en de installatie zal toch doorgaan, maar sommige functies zullen niet werken, dus doe het gewoon alvast!
  • PowerShell 5.1 Preview mag niet zijn geïnstalleerd
  • Op Windows 7- of Server 2008R2-machines met PowerShell v3 geïnstalleerd, moet je de waarde van PSModulePath opslaan of eerst upgraden naar v4.
  • Op Windows 7- of Server 2008R2-machines, als je DSC gebruikt, zorg er dan voor dat WinRM is ingeschakeld.
  • De installatie heeft een herstart nodig, dus zorg ervoor dat je dit plant.

Omdat ik lui ben en van plan ben dat jij hetzelfde bent, hier is een klein script dat ik heb gemaakt om je op weg te helpen met het bepalen van wat voor soort voorbereidend werk je te wachten staat. Voor de WinRM-vereiste zou je code kunnen opnemen van dit script van mij, aangezien je elk apparaat aanraakt. Maar weet wel dat deze aanpak vereist dat elke computer PowerShell Remoting ingeschakeld heeft.

## Dit kan Active Directory zijn, een tekstbestand, een SQL-database, wat dan ook$computers = Get-AdComputer -Filter *foreach ($c in $computers.Name) {	try {		$session = New-PSSession -ComputerName $c		$icmParams = @{			Session = $session		}		$output = @{        	ComputerName = $c		}    	## In het geval dat ze PowerShell v3 draaien		$icmParams.ScriptBlock = { $env:PSModulePath; [Environment]::GetEnvironmentVariable("PSModulePath", "Machine") }		$output.PSModulePath = (Invoke-Command @icmParams) -split ';' | Select-Object -Unique | Sort-Object    	## De bestaande versie ophalen    	$icmParams.ScriptBlock = { $PSVersionTable.BuildVersion.ToString() }    	$output.PSModulePath = Invoke-Command @icmParams		## Controleer .NET Framework 4.5.2		if (Get-ChildItem -Path "\$c\c$\windows\Microsoft.NET\Framework" -Directory | Where-Object {$_.Name -match '^v4.5.2.*' }) {			$output.DotNetGood = $true		} else {			$output.DotNetGood = $false		}		[pscustomobject]$output	} catch {	} finally {		Remove-PSSession -Session $session -ErrorAction Ignore	}

Zorg ervoor dat bestaande scripts worden uitgevoerd met PowerShell 5.1

Zelfs als leden van het PowerShell-team zelf mij hebben verteld dat alle scripts zouden moeten werken met PowerShell 5.1, is dat niet altijd het geval. Voor elke code die kritieke bedrijfsprocessen uitvoert, raad ik altijd aan om 5.1 te installeren op dezelfde besturingssysteem van een andere machine en alle tests op die manier uit te voeren om er zeker van te zijn.

Stap #2: Implementatie

Zodra je alle vereisten uit de weg hebt geruimd en klaar bent om PowerShell 5.1 uit te rollen, is de volgende stap om het te doen! Het uitrollen van 5.1 is vergelijkbaar met andere software-implementaties. Hoe je dit aanpakt, is afhankelijk van de tools die je al hebt. Als je bijvoorbeeld Active Directory hebt en GPO’s wilt gebruiken, kun je die route volgen, SCCM zou ook werken. Ik probeer hier productagnostisch te zijn, dus hier is hoe ik het zou doen met PowerShell natuurlijk!

Eerst maak ik een map op mijn lokale machine met de naam C:\PowerShellDeployment. Vervolgens zal ik de juiste versie(s) die ik nodig heb downloaden naar die map en meteen een kopie van psexec meenemen. Omdat PowerShell zichzelf niet kan upgraden, moeten we teruggrijpen naar het goede oude VBScript. Hier is een klein script dat ik lang geleden heb gemaakt om je op weg te helpen. Ik sla het op als C:\PowerShellDeployment\installPs.vbs.

Set oShell = WScript.CreateObject("WScript.Shell")
Set oFso = CreateObject("Scripting.FileSystemObject")
strWorkingDir = oFso.GetParentFolderName(wscript.ScriptFullName)

'Change this to whatever file name it is
psInstallerPath = strWorkingDir & "\Windows6.1-KB2819745-x86-MultiPkg.msu"
Set swbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set swbemServices = swbemLocator.ConnectServer(".", "Root\CIMV2")
if oFSO.GetFileVersion("c:\windows\system32\windowsPowerShell\v1.0\PowerShell.exe") = "6.0.6002.18111"
then
	Set colArchs = swbemServices.ExecQuery("SELECT SystemType FROM Win32_ComputerSystem",,48)
	For Each objArch in colArchs
    	if
        	InStr(objArch.SystemType,"x64-based PC") > 0
        Then
        	oShell.Run "wusa.exe " & psInstallerPath & " /quiet /norestart",0,True
		Else
        	Wscript.Quit(10)
		End If
	Next
End if

Zodra je het VBS-bestand op je lokale machine hebt opgeslagen, maak dan een PowerShell-script zoals dit en bewaar het ergens.

## Opnieuw, hoeft niet AD te zijn$computers = Get-AdComputer -Filter *foreach ($Computer in $Computers) {    if (Test-Connection -Computername $Computer -Quiet -Count 1) {        $folderPath = 'C:\PowerShellDeployment'        Copy-Item -Path $folderPath -Destination "\$Computer\c$"        psexec \$Computer cscript "$folderPath\installPs.vbs"        Remove-Item "\$Computer\c$\PowerShellDeployment" -Recurse -Force        Restart-Computer -Computername $Computer -Force}

Voer het bovenstaande script uit, en het zou moeten controleren of de computer online is, de PowerShell-installateur en het VBS-bestand naar de externe computer kopiëren, het uitvoeren, opruimen en de computer opnieuw opstarten. Zoals altijd, plan dit in een onderhoudsvenster! Het installeren van PowerShell vereist een herstart, en dit zal het gewoon zonder spijt doen.

Source:
https://adamtheautomator.com/install-powershell-5/