PowerShell 5へのアップグレード:簡単な手順とスクリプト

PowerShell 5.1をインストールすることを決めた場合、このプロセスを自動化するためのスクリプトを含んだ技術的な手順書を作成しました。免責事項:この記事で言及されているすべてのコードは現状有姿で提供されます。一部は動作するかもしれませんし、環境によっては動作しないかもしれませんが、何もない場合はテンプレートとして使用できます。

PowerShellのバージョンを確認するのに役立つ場合、PowerShellバージョンを確認する方法(すべての方法!)をチェックすることをおすすめします。

ステップ#1:発見

エンタープライズ全体でPowerShellのアップグレードを実行するためのステップ#1は、発見です。現在の状況はどのようなものですか?何かを変更する前に、それを理解する必要があります。驚くべきことに、多くの組織は自分たちが持っているものを全く把握していません!

既存のオペレーティングシステム

最初のタスクは、PowerShell 5.1にアップグレードしたい場所に現在インストールされているオペレーティングシステムを把握することです。ただし、一部のシステムではすでにPowerShell 5.1がインストールされているかもしれませんが、それを知らないかもしれません。PowerShell 5.1はWindows 10 Anniversary UpdateおよびWindows Server 2016のRTMバージョンでバンドルされたツールとしてリリースされたため、これらのオペレーティングシステムまたはそれ以降のバージョンを使用している場合はすでに使用できます。

それ以外の場合は、リストを作成してください。SCCMのようなシステム管理ツールがない場合でも問題ありません!PowerShellを使用してPowerShellをサポートしましょう!Active Directoryがある場合、以下のワンライナーを使用して全体像を把握できます。

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

あなたの環境はどのようなものですか?古いWindows XPやServer 2003のマシンはありますか?もしそうなら、残念ですがうまくいきません。そこでは最高でPowerShell v2が使用できますが、まだそのようなマシンが環境に残っているのであれば、PowerShellは最も心配する必要のないものでしょう!Windows 7 SP1/Windows Server 2008R2 SP1以上のオペレーティングシステムには、PowerShell 5.1をインストールすることができます。

前提条件のターゲットリストの作成

該当するオペレーティングシステムでは、PowerShell 5.1を使用する前にいくつかの前提条件と要件を満たす必要があります。

  • 少なくとも.NET Framework 4.5.2がインストールされていること。これはインストールの要件ではありませんが、一部の機能が動作しなくなるため、早めにインストールしてください!
  • PowerShell 5.1 Previewがインストールされていないこと
  • PowerShell v3がインストールされているWindows 7またはServer 2008R2のマシンでは、まずPSModulePathの値を保存するか、まずv4にアップグレードする必要があります。
  • Windows 7またはServer 2008R2のマシンでDSCを使用する場合は、WinRMを有効にする必要があります。
  • インストールには再起動が必要なので、スケジュールすることを確認してください。

私が怠け者であることを意図しているため、あなたがどのような事前準備作業が必要かを把握するためのスクリプトを用意しました。WinRMの要件については、各マシンに触れるために、このスクリプトからのコードを含めることができます。ただし、このアプローチでは、各コンピュータにPowerShell Remotingが有効になっている必要があります。

## これはActive Directory、テキストファイル、SQLデータベースなどであるかもしれません$computers = Get-AdComputer -Filter *foreach ($c in $computers.Name) {	try {		$session = New-PSSession -ComputerName $c		$icmParams = @{			Session = $session		}		$output = @{        	ComputerName = $c		}    	## PowerShell v3を実行している場合		$icmParams.ScriptBlock = { $env:PSModulePath; [Environment]::GetEnvironmentVariable("PSModulePath", "Machine") }		$output.PSModulePath = (Invoke-Command @icmParams) -split ';' | Select-Object -Unique | Sort-Object    	## 既存のバージョンを取得する    	$icmParams.ScriptBlock = { $PSVersionTable.BuildVersion.ToString() }    	$output.PSModulePath = Invoke-Command @icmParams		## .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	}

既存のスクリプトがPowerShell 5.1で実行されることを確認してください。

PowerShellチームのメンバー自身が、すべてのスクリプトPowerShell 5.1で動作すると語ってくれているにもかかわらず、常にビジネスプロセスに関与するコードでは、他のマシンの同じオペレーティングシステムに5.1をインストールし、すべてのテストを実行することをお勧めします。これにより、確実に動作することを保証できます。

ステップ2:展開

必要な前提条件をすべて解決し、PowerShell 5.1を展開する準備が整ったら、次のステップは展開です。5.1の展開は、他のソフトウェアの展開と似ています。使用しているツールに依存します。たとえば、Active Directoryがあり、GPOを使用したい場合は、その方法を選択できます。同様に、SCCMも利用できます。ここでは製品にはこだわりませんので、もちろんPowerShellでやり方を説明します。

まず、ローカルマシンにC:\PowerShellDeploymentというフォルダを作成します。次に、必要なバージョンの適切なバージョンをそのフォルダにダウンロードし、psexecのコピーを取得します。次に、PowerShellは自己アップグレードできないため、古き良きVBScriptに頼る必要があります。以下に、初めに作成したスクリプトを示します。これを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

ローカルマシンにVBSが保存されたら、以下のようなPowerShellスクリプトを作成し、どこかに保管してください。

## 再び、ADである必要はありません$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}

上記のスクリプトを実行すると、コンピュータがオンラインかどうかをチェックし、PowerShellインストーラとVBSをリモートコンピュータにコピーし、実行し、自分自身をクリーンアップし、コンピュータを再起動します。いつも通り、メンテナンスウィンドウでスケジュールしてください!PowerShellのインストールには再起動が必要であり、このスクリプトは容赦なく実行します。

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