Búsqueda de sitios web

Actualice el nombre del producto del sistema operativo del registro con PowerShell


Espero que muchos de ustedes sean como yo y hayan realizado, o realizarán, una actualización local de Windows 10 a Windows 11. Es bastante fácil ejecutar una expresión de PowerShell como esta para ver el nombre del sistema operativo.

Get-CimInstance win32_operatingsystem | Select-Object -property Caption

Obtengo un valor como Windows 11 Pro. Sin embargo, la información del sistema operativo también se almacena en el registro en HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion.

El proceso de actualización no parece actualizar el valor de ProductName. Sin entrar en los méritos de la "mejor" forma de obtener información del sistema operativo, simplemente quiero revisar esta configuración de registro. Naturalmente, quiero usar PowerShell para automatizar esta sencilla tarea porque tendré varias máquinas que necesitaré actualizar.

Consiguiendo información

Primero, quiero una función de PowerShell simple que proporcione información basada en los valores de registro actuales.

Function Get-OSProduct {
    [CmdletBinding()]
    Param()

    $reg = Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion'
    [PSCustomObject]@{
        Computername   = $env:computername
        ProductName    = $reg.Productname
        Build          = "{0}.{1}" -f $reg.CurrentBuildNumber,$reg.UBR
        Edition        = $reg.EditionID
        DisplayVersion = $reg.DisplayVersion
        Installed      = (Get-Date 1/1/1970).AddSeconds($reg.InstallDate)
    }
}

Cargar esto en mi sesión de PowerShell me da esto.

Por lo que puedo decir, la fecha de instalación es cuando ejecuté la actualización de Windows 11 en mi ThinkPad. La propiedad Build la construí a partir de dos valores de registro para reflejar la misma información que obtengo cuando ejecuto winver.exe. Algunos podrían argumentar que Windows 11 es en realidad Windows 10.5, pero como ese no es un valor legítimo, quiero actualizar el valor de ProductName del registro con el valor que obtengo de Get-CimInstance.

Establecer el valor

Actualización 15 de octubre de 2021 Resulta que este valor de registro en particular que estoy a punto de cambiar no es persistente. Windows cambiará el nombre del producto nuevamente a Windows 10 al reiniciar. Aun así, es posible que el código le resulte útil como ejemplo de modificación de otras configuraciones del registro.

Esto es bastante sencillo de lograr.

Function Set-OSProductName {
    [cmdletbinding(SupportsShouldProcess)]
    Param()

    #save the registry path to a variable to keep code easier to read
    $regPath = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion'

    #get OS name from CIM
    $os = Get-CimInstance -ClassName Win32_OperatingSystem -Property Caption
    Write-Verbose "Detected operatings system $($os.caption)"

    #get current value
    $current = Get-ItemPropertyValue -Path $regPath -Name ProductName
    Write-Verbose "Current product name is $current"

    #update the registry value
    #I'm creating my own -whatif code
    if ($pscmdlet.ShouldProcess($regpath,"Update ProductName from $current to $($os.caption)")) {
        Set-ItemProperty -Path $regPath -Name ProductName -Value $os.Caption
    }
}

Como estoy actualizando el registro, esto debe ejecutarse en una sesión elevada. También agregué soporte para -Whatif especificando SupportsShouldProcess en el atributo cmdletbinding. Podría haber dejado que Set-ItemProperty detectara automáticamente -WhatIf, pero decidí que quería escribir mi propio controlador Whatif para usar un mensaje más detallado.

Volveré a ejecutar el comando y, en un instante, actualicé el registro.

Resumen

Mi intención en este artículo no es debatir las ventajas de obtener información del sistema operativo de CIM o del Registro. Es posible que tenga un caso de uso atractivo y exclusivo de su entorno que prevalezca sobre el otro. O tal vez simplemente desea una pequeña orientación sobre cómo utilizar PowerShell para actualizar el registro. Estas funciones están diseñadas para ejecutarse localmente. Sin embargo, puede modificarlos para utilizar la comunicación remota de PowerShell y trabajar en computadoras remotas. Pero te dejaré esas modificaciones a ti.

Artículos relacionados