Обновление до PowerShell 5: Простые шаги и сценарии

Если вы решите установить PowerShell 5.1, я создал техническое руководство с некоторыми скриптами для автоматизации этого процесса для вас. Отказ от ответственности: Весь код, упомянутый в этом посте, предоставляется в том виде, в котором он есть. Некоторые из них могут работать, некоторые могут не работать в вашей среде, но если у вас нет ничего, чтобы начать, он будет служить вам шаблоном для начала работы.

Если вам нужна помощь в определении версии PowerShell, которую вы используете, я рекомендую ознакомиться с Как проверить версию PowerShell (все способы!).

Шаг №1: Обнаружение

Первым шагом при обновлении PowerShell во всей организации является обнаружение. Какова текущая ситуация? Вы не можете что-то изменить, не понимая этого, и, к удивлению, многие организации не имеют представления о том, что у них есть!

Существующие операционные системы

Первая задача – понять, какие операционные системы у вас есть и на какие из них вы хотите установить PowerShell 5.1. Однако на некоторых системах вы можете уже решить установить PowerShell 5.1 и не знать об этом. PowerShell 5.1 был выпущен как включенное в состав инструментального набора средств в обновлении Windows 10 Anniversary и в RTM-версии Windows Server 2016, поэтому если у вас есть одна из этих операционных систем или более новая, вы уже готовы к работе.

Для остальных убедитесь, что у вас есть список. Нет системы управления системами, такой как 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.
  • На машинах с Windows 7 или Server 2008R2 с установленным PowerShell v3 вы должны либо сохранить значение PSModulePath, либо сначала обновиться до версии v4.
  • На машинах с Windows 7 или Server 2008R2, если используется DSC, убедитесь, что WinRM включен.
  • Установка потребует перезагрузки, так что убедитесь, что вы планируете это.

Поскольку я ленив и намерен, чтобы и ты был таким же, вот небольшой скрипт, который я создал, чтобы помочь тебе начать разбираться в том, какие предварительные работы тебя ждут. Для требования WinRM ты можешь включить код из этого скрипта моего тоже, так как ты будешь работать с каждым компьютером. Однако знай, что для этого подхода необходимо включить удаленное выполнение PowerShell на каждом компьютере.

## Это может быть 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 и вы хотите использовать групповые политики, вы можете пойти этим путем, аналогично будет работать 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/