Actualizar a PowerShell 5: Pasos sencillos y scripts

Si decides instalar PowerShell 5.1, he creado un tutorial técnico con algunos scripts para automatizar este proceso para ti. Descargo de responsabilidad: Todo el código mencionado en esta publicación es tal cual. Algunos pueden funcionar, otros pueden no funcionar en tu entorno, pero si no tienes nada para empezar, servirá como una plantilla para que comiences.

Si necesitas ayuda para encontrar qué versión de PowerShell estás utilizando, te recomiendo que consultes Cómo verificar tu versión de PowerShell (¡Todas las formas!).

Paso #1: Descubrimiento

El primer paso para realizar una actualización de PowerShell en toda la empresa es el descubrimiento. ¿Cómo es el panorama actualmente? No puedes cambiar algo sin entenderlo primero, y sorprendentemente, muchas organizaciones no tienen idea de lo que tienen!

Sistemas operativos existentes

La primera tarea es entender qué sistemas operativos tienes actualmente y en cuáles te gustaría tener PowerShell 5.1. Aunque, en algunos sistemas, es posible que ya hayas decidido instalar PowerShell 5.1 sin saberlo. PowerShell 5.1 se lanzó como una herramienta incluida en la actualización de aniversario de Windows 10 y en la versión RTM de Windows Server 2016, por lo que si tienes alguno de esos sistemas operativos o más recientes, ya estás listo para continuar.

Para los demás, asegúrate de reunir una lista. ¿No tienes una herramienta de gestión de sistemas como SCCM? ¡No hay problema! ¡Usa PowerShell para ayudarte con PowerShell! Si tienes Active Directory, aquí tienes una línea de comando rápida para tener una visión general de lo que hay disponible.

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

¿Cómo es tu entorno? ¿Tienes alguna máquina antigua con Windows XP o Server 2003? Si es así, estás de mala suerte. Lo mejor que puedes hacer allí es PowerShell v2, pero si todavía tienes algunas de esas máquinas en tu entorno, ¡PowerShell es lo menos de tus preocupaciones! Para cualquier sistema operativo que tenga Windows 7 SP1/Windows Server 2008R2 SP1 o superior, se puede instalar PowerShell 5.1.

Creando una lista de requisitos previos

En los sistemas operativos correspondientes, PowerShell 5.1 tiene algunos requisitos previos y requisitos que cumplir antes de que funcione.

  • Debe tener instalado al menos .NET Framework 4.5.2. Esto no es un requisito de instalación y la instalación seguirá adelante, pero algunas características no funcionarán, así que ¡hágalo de una vez!
  • No se debe instalar PowerShell 5.1 Preview
  • En máquinas con Windows 7 o Server 2008R2 con PowerShell v3 instalado, debe guardar el valor de PSModulePath o primero actualizar a v4.
  • En máquinas con Windows 7 o Server 2008R2, si usa DSC, asegúrese de habilitar WinRM.
  • La instalación requerirá reiniciar, así que asegúrese de programarlo.

Porque soy perezoso y quiero que tú también lo seas, aquí tienes un pequeño script que preparé para que puedas empezar a descubrir qué tipo de trabajo previo se necesita. Para el requisito de WinRM, podrías incluir código de este script mío, ya que estás accediendo a cada máquina. Aunque debes saber que este enfoque requiere que cada computadora tenga habilitado PowerShell Remoting.

## Esto podría ser Active Directory, un archivo de texto, una base de datos SQL, lo que sea$computers = Get-AdComputer -Filter *foreach ($c in $computers.Name) {	try {		$session = New-PSSession -ComputerName $c		$icmParams = @{			Session = $session		}		$output = @{        	ComputerName = $c		}    	## En caso de que estén ejecutando PowerShell v3		$icmParams.ScriptBlock = { $env:PSModulePath; [Environment]::GetEnvironmentVariable("PSModulePath", "Machine") }		$output.PSModulePath = (Invoke-Command @icmParams) -split ';' | Select-Object -Unique | Sort-Object    	## Obtener la versión actual    	$icmParams.ScriptBlock = { $PSVersionTable.BuildVersion.ToString() }    	$output.PSModulePath = Invoke-Command @icmParams		## Comprobar .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	}

Asegúrese de que los scripts existentes se ejecuten con PowerShell 5.1.

Aunque los miembros del equipo de PowerShell me han dicho que todos los scripts deberían funcionar con PowerShell 5.1, no siempre es así. Para cualquier código que ejecute procesos críticos para el negocio, siempre recomiendo instalar 5.1 en el mismo sistema operativo de otra máquina y realizar todas las pruebas de esa manera solo para estar seguro.

Paso #2: Implementación

Una vez que haya completado todos los requisitos previos y esté listo para comenzar a implementar PowerShell 5.1, el siguiente paso es hacerlo. La implementación de 5.1 es similar a otras implementaciones de software. La forma en que lo hagas depende de las herramientas que ya tengas. Por ejemplo, si tienes Active Directory y quieres usar GPO, puedes seguir ese camino, SCCM también funcionaría. Intento ser agnóstico al producto aquí, así que aquí está cómo lo haría con PowerShell, por supuesto.

Primero, crearé una carpeta en mi máquina local llamada C:\PowerShellDeployment. Luego, descargaré la(s) versión(es) apropiada(s) que necesito en esa carpeta y obtendré una copia de psexec mientras estoy en eso. Después, como PowerShell no puede actualizarse a sí mismo, necesitamos recurrir a un buen y viejo VBScript. Aquí hay un pequeño script que creé hace mucho tiempo para que puedas comenzar. Lo guardaré en 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

Una vez que haya guardado el VBS en su máquina local, cree un script de PowerShell como este y guárdelo en algún lugar.

## Nuevamente, no tiene que ser AD$computadoras = Get-AdComputer -Filter *foreach ($Computadora in $Computadoras) {    if (Test-Connection -Computername $Computadora -Quiet -Count 1) {        $carpeta = 'C:\PowerShellDeployment'        Copy-Item -Path $carpeta -Destination "\$Computadora\c$"        psexec \$Computadora cscript "$carpeta\installPs.vbs"        Remove-Item "\$Computadora\c$\PowerShellDeployment" -Recurse -Force        Restart-Computer -Computername $Computadora -Force}

Ejecute el script anterior, y verificará si la computadora está en línea, copiará el instalador de PowerShell y el VBS en la computadora remota, lo ejecutará, limpiará después de sí mismo y reiniciará la computadora. Como siempre, programe esto en una ventana de mantenimiento. La instalación de PowerShell requiere un reinicio, y esto lo hará sin ninguna consideración.

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