升級到 PowerShell 5:簡單步驟和腳本

如果您决定安装PowerShell 5.1,我已经创建了一个技术指南,并提供了一些脚本来自动化此过程。免责声明:本帖中提及的所有代码均为现状。有些代码可能适用,有些可能不适用于您的环境,但如果您一无所知,它将作为您开始的模板。

如果您需要帮助找到正在运行的PowerShell版本,我建议查看如何检查您的PowerShell版本(所有方法!)

第一步:发现

进行企业级PowerShell升级的第一步是发现。当前的情况如何?在不了解情况的情况下无法进行更改,令人惊讶的是,许多组织并不知道他们拥有什么!

现有操作系统

首先要了解您当前拥有哪些操作系统,并希望将它们升级到PowerShell 5.1。但是,在某些系统上,您可能已经决定安装PowerShell 5.1,但不知道。PowerShell 5.1是作为Windows 10周年更新和Windows Server 2016 RTM版本的捆绑工具发布的,因此,如果您已经安装了这两个操作系统或更新版本,您已经可以开始了。

对于其他系统,请确保收集一个列表。没有像SCCM这样的系统管理工具?没问题!使用PowerShell来帮助PowerShell!如果您有活动目录,下面是一个快速的一行命令,可以为您提供整体情况的概览。

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 預覽版
  • 在安裝了 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/