¿Script de PowerShell para devolver versiones de .NET Framework en una máquina?

182

¿Cuál sería un script de PowerShell para devolver versiones de .NET Framework en una máquina?

Mi primera suposición es algo relacionado con WMI. ¿Hay algo mejor?

Debería ser una línea para devolver solo la última versión para cada instalación de .NET [en cada línea].

MattUebel
fuente
77
Una máquina puede (y tendrá) múltiples versiones del Fx. ¿Cómo quieres manejar eso? Y luego está el desastre Fx2 .. Fx3.5SP1. ¿Qué versión quieres escuchar?
Henk Holterman
Supongo que sería necesario devolver el número de versión completo para cada instalación.
MattUebel
1
¿No hay una manera de hacer esto a través de WMI?
Mark Richman
Usted solicitó PowerShell, hice algo para C # (aplicación de consola). Si estás interesado, aquí está ...
Matt
Es realmente increíble que no haya algo como:asp.net -v
Altimus Prime el

Respuestas:

354

Si va a utilizar el registro, debe repetir para obtener la versión completa de 4.x Framework. Las respuestas anteriores devuelven el número raíz en mi sistema para .NET 3.0 (donde los números WCF y WPF, que están anidados bajo 3.0, son más altos, no puedo explicar eso), y no devuelven nada para 4.0. .

EDITAR: Para .Net 4.5 y versiones posteriores, esto cambió ligeramente de nuevo, por lo que ahora hay un buen artículo de MSDN aquí que explica cómo convertir el valor de Release a un número de versión .Net, es un choque total de trenes :-(

Esto me parece correcto (tenga en cuenta que genera números de versión separados para WCF y WPF en 3.0. No sé de qué se trata). También genera tanto Cliente como Completo en 4.0 (si tiene ambos instalados):

Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -recurse |
Get-ItemProperty -name Version,Release -EA 0 |
Where { $_.PSChildName -match '^(?!S)\p{L}'} |
Select PSChildName, Version, Release

Según el artículo de MSDN, puede crear una tabla de búsqueda y devolver el número de versión del producto de marketing para versiones posteriores a la 4.5:

$Lookup = @{
    378389 = [version]'4.5'
    378675 = [version]'4.5.1'
    378758 = [version]'4.5.1'
    379893 = [version]'4.5.2'
    393295 = [version]'4.6'
    393297 = [version]'4.6'
    394254 = [version]'4.6.1'
    394271 = [version]'4.6.1'
    394802 = [version]'4.6.2'
    394806 = [version]'4.6.2'
    460798 = [version]'4.7'
    460805 = [version]'4.7'
    461308 = [version]'4.7.1'
    461310 = [version]'4.7.1'
    461808 = [version]'4.7.2'
    461814 = [version]'4.7.2'
    528040 = [version]'4.8'
    528049 = [version]'4.8'
}

# For One True framework (latest .NET 4x), change the Where-Object match 
# to PSChildName -eq "Full":
Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse |
  Get-ItemProperty -name Version, Release -EA 0 |
  Where-Object { $_.PSChildName -match '^(?!S)\p{L}'} |
  Select-Object @{name = ".NET Framework"; expression = {$_.PSChildName}}, 
@{name = "Product"; expression = {$Lookup[$_.Release]}}, 
Version, Release

De hecho, ya que tengo que actualizar esta respuesta, aquí hay un script para generar el script anterior (con un poco más) de la fuente de descuento para esa página web. Esto probablemente se romperá en algún momento, por lo que mantendré la copia actual anterior.

# Get the text from github
$url = "https://raw.githubusercontent.com/dotnet/docs/master/docs/framework/migration-guide/how-to-determine-which-versions-are-installed.md"
$md = Invoke-WebRequest $url -UseBasicParsing
$OFS = "`n"
# Replace the weird text in the tables, and the padding
# Then trim the | off the front and end of lines
$map = $md -split "`n" -replace " installed [^|]+" -replace "\s+\|" -replace "\|$" |
    # Then we can build the table by looking for unique lines that start with ".NET Framework"
    Select-String "^.NET" | Select-Object -Unique |
    # And flip it so it's key = value
    # And convert ".NET FRAMEWORK 4.5.2" to  [version]4.5.2
    ForEach-Object { 
        [version]$v, [int]$k = $_ -replace "\.NET Framework " -split "\|"
        "    $k = [version]'$v'"
    }

# And output the whole script
@"
`$Lookup = @{
$map
}

# For extra effect we could get the Windows 10 OS version and build release id:
try {
    `$WinRelease, `$WinVer = Get-ItemPropertyValue "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" ReleaseId, CurrentMajorVersionNumber, CurrentMinorVersionNumber, CurrentBuildNumber, UBR
    `$WindowsVersion = "`$(`$WinVer -join '.') (`$WinRelease)"
} catch {
    `$WindowsVersion = [System.Environment]::OSVersion.Version
}

Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse |
    Get-ItemProperty -name Version, Release -EA 0 |
    # For The One True framework (latest .NET 4x), change match to PSChildName -eq "Full":
    Where-Object { `$_.PSChildName -match '^(?!S)\p{L}'} |
    Select-Object @{name = ".NET Framework"; expression = {`$_.PSChildName}}, 
                @{name = "Product"; expression = {`$Lookup[`$_.Release]}}, 
                Version, Release,
    # Some OPTIONAL extra output: PSComputerName and WindowsVersion
    # The Computer name, so output from local machines will match remote machines:
    @{ name = "PSComputerName"; expression = {`$Env:Computername}},
    # The Windows Version (works on Windows 10, at least):
    @{ name = "WindowsVersion"; expression = { `$WindowsVersion }}
"@
Jaykul
fuente
Esto es exactamente lo que estoy buscando también, pero estoy teniendo dificultades para entender qué está haciendo exactamente esto. Por lo que entiendo, está saliendo al registro NDP y buscando recursivamente a través de cada carpeta que se ajusta a la '^(?!S)\p{L}'expresión regular y obteniendo la información de Versión y Lanzamiento. ¿Qué es exactamente esa expresión regular tratando de calificar?
Johnrad
2
@Johnrad PSChildNamees el nombre de la hoja de la clave de registro. \p{L}es cualquier carácter de la categoría "letra" de Unicode. (?!S)es un aspecto negativo y ^es el comienzo de la cadena. Entonces tiene que comenzar con una letra diferente a S. Entonces, si considera solo ASCII, es lo mismo que $_.PSChildName -cmatch '^[A-RT-Za-z]'(tenga en cuenta el -cmatch). Por lo tanto, encuentra claves donde el nombre comienza con una letra distinta de S. No tengo idea de por qué te importaría no ser ASCII si estás filtrando nombres que comienzan con S... Definitivamente contigo porque es tan confuso.
jpmc26
1
Ahora estoy más confundido acerca de lo que Get-ItemProperty -name Version,Release -EA 0está haciendo. Sé que -EA 0es lo mismo -ErrorAction SilentlyContinue, pero ¿qué efecto tendría Get-ItemProperty -name Version,Releaseal canalizar todos los resultados? No parece quitar ninguna variable del objeto, ya que otras se usan en comandos posteriores en la tubería. ¿Se ejecuta, se produce un error cuando falta el nombre Versiono Releasede la clave y luego pasa los objetos donde tuvo éxito al siguiente comando en la tubería?
jpmc26
3
Get-ChildItem devuelve TODAS las subclaves del registro (las subcarpetas, si lo desea). Get-ItemProperty devuelve los valores (específicamente: "Versión" y "Release"): ignoramos los errores porque no nos interesan las carpetas que no tienen esos valores. Entonces, sí, básicamente encontramos CADA subcarpeta, y luego buscamos Versión o Release (cualquier carpeta sin una o ambas se ignora).
Jaykul
3
¡Increíble! Solo modifiqué la (?!S)cláusula para (?![SW])excluir aún más las entradas de "Windows *". Esto también se puede hacer (?=[vCF])ya que las únicas claves que realmente nos interesan son las raíces de la Versión y las claves "Completa" y "Cliente" para .NET 4.0+. ;)
Chiramisu
27
gci 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' |
sort pschildname -des                                  |
select -fi 1 -exp pschildname

Esta respuesta no devuelve 4.5 si está instalada. La respuesta a continuación de @Jaykul y el uso de recurse sí.

Jason Stangroome
fuente
55
gci 'HKLM: \ SOFTWARE \ Microsoft \ NET Framework Setup \ NDP' | ordenar pschildname -des | foreach-object {$ _. nombre; $ _. GetValue ("Versión");}
MattUebel
para mí, la respuesta ahora está en la parte superior, así que aquí hay un enlace :-): stackoverflow.com/a/3495491/1747983
Tilo el
1
Habiendo instalado .NET 4.7.1 en Windows 10, esto todavía devuelve v4.0.
Matt
24

Se agregó soporte v4.8 al script:

Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -recurse |
Get-ItemProperty -name Version,Release -EA 0 |
Where { $_.PSChildName -match '^(?![SW])\p{L}'} |
Select PSChildName, Version, Release, @{
  name="Product"
  expression={
      switch -regex ($_.Release) {
        "378389" { [Version]"4.5" }
        "378675|378758" { [Version]"4.5.1" }
        "379893" { [Version]"4.5.2" }
        "393295|393297" { [Version]"4.6" }
        "394254|394271" { [Version]"4.6.1" }
        "394802|394806" { [Version]"4.6.2" }
        "460798|460805" { [Version]"4.7" }
        "461308|461310" { [Version]"4.7.1" }
        "461808|461814" { [Version]"4.7.2" }
        "528040|528049" { [Version]"4.8" }
        {$_ -gt 528049} { [Version]"Undocumented version (> 4.8), please update script" }
      }
    }
}
AlexBar
fuente
21
[environment]::Version

Le da una instancia de VersionCLR que está utilizando la copia actual de PSH (como se documenta aquí ).

Ricardo
fuente
3
Tengo instalado .NET 4 pero PowerShell solo usará el tiempo de ejecución 2.0. Entonces eso no es realmente de ayuda aquí.
Joey
@Johannes: Vea el comentario sobre su Q, debe ser explícito sobre lo que quiere.
Richard
9
Para Powershell 2.0, también puede utilizar $PSVersionTablepara encontrar la versión de CLR en la que se ejecuta PowerShell.
Keith Hill
66
¿Qué hay de las versiones superiores? Tengo .NET 4.7.1 ahora, y el script siempre devuelve 4.0.30319 Rev. 42000.
Matt
@Matt necesitará traducir la parte menor de la versión ... y tenga en cuenta que dependiendo de lo que esté configurado en la configuración de Powershell, es posible que no esté utilizando la última versión menor / parche.
Richard
13

Sintaxis correcta:

[System.Runtime.InteropServices.RuntimeEnvironment]::GetSystemVersion()
#or
$PSVersionTable.CLRVersion

La GetSystemVersionfunción devuelve una cadena como esta:

v2.0.50727        #PowerShell v2.0 in Win 7 SP1

o así

v4.0.30319        #PowerShell v3.0 (Windows Management Framework 3.0) in Win 7 SP1

$PSVersionTablees un objeto de solo lectura. La propiedad CLRVersion es un número de versión estructurado como este:

Major  Minor  Build  Revision
-----  -----  -----  --------
4      0      30319  18444   
Desmond Lee
fuente
1
Intenté esto en win8, no devuelve nada. En Windows 7, devuelve 2 mientras 4.5.1 ya está instalado. No sé por qué esto no se puede usar en nuevas plataformas. En win sesrver 2008, funciona.
max
La primera opción funciona en mi entorno Windows 8 de 64 bits. La segunda opción funciona, pero creo que eso solo muestra la versión .NET en la que se ejecuta la instancia actual de PowerShell, que casi siempre es la última. (Editar: Tal vez ambos lo hagan).
Vimes
igual que aquí. en Windows 7, tengo .net 2.0 y 4.0 pero el comando solo muestra v2.0.50727. Usa el enfoque de Jaykul.
max
La versión de Clr no es igual a la versión de marco, 4+ marcos están basados ​​en 4 clr
janv8000
¿Qué hay de las versiones superiores? Tengo .NET 4.7.1 ahora, y el script siempre devuelve 4.0.30319 Rev. 42000.
Matt
11

Encontré esto al completar la pestaña en powershell para osx:

[System.Runtime.InteropServices.RuntimeInformation]::get_FrameworkDescription() .NET Core 4.6.25009.03

js2010
fuente
1
Sí, devuelve .NET Framework 4.7.2558.0 , pero ¿cómo se puede distinguir 4.7 de 4.7.1 (tengo 4.7.1 en mi máquina con Windows 10)?
Matt
1
[version]([Runtime.InteropServices.RuntimeInformation]::FrameworkDescription -replace '^.[^\d.]*','')
Rabash
2

Buena solución

Intente usar el módulo descargable DotNetVersionLister (basado en información de registro y alguna tabla de búsqueda de versión a versión de marketing).

Que se usaría así:

PS> Get-DotNetVersion -LocalHost -nosummary


ComputerName : localhost
>=4.x        : 4.5.2
v4\Client    : Installed
v4\Full      : Installed
v3.5         : Installed
v3.0         : Installed
v2.0.50727   : Installed
v1.1.4322    : Not installed (no key)
Ping         : True
Error        :

O de esta manera si solo quiere probarlo para algún marco .NET> = 4. * :

PS> (Get-DotNetVersion -LocalHost -nosummary).">=4.x"
4.5.2

Pero no funcionará (instalar / importar), por ejemplo, con PS v2.0 ( Win 7 , Win Server 2010 estándar) debido a la incompatibilidad ...

Motivación para las funciones "heredadas" a continuación

(Puede omitir leer esto y usar el código a continuación)

Tuvimos que trabajar con PS 2.0 en algunas máquinas y no pudimos instalar / importar el DotNetVersionLister anterior .
En otras máquinas, queríamos actualizar (desde PS 2.0 ) a PS 5.1 (que a su vez necesita .NET Framework> = 4.5 ) con la ayuda de dos compañías personalizadas Install-DotnetLatestCompanyy Install-PSLatestCompany.
Para guiar bien a los administradores a través del proceso de instalación / actualización, tendríamos que determinar la versión .NET en estas funciones en todas las máquinas y versiones PS existentes.
Por lo tanto, también utilizamos las siguientes funciones para determinarlas de manera más segura en todos los entornos ...

Funciones para entornos de PS heredados (por ejemplo, PS v2.0 )

Por lo tanto, el siguiente código y los siguientes ejemplos de uso (extraídos) son útiles aquí (basados ​​en otras respuestas aquí):

function Get-DotNetVersionByFs {
  <#
    .SYNOPSIS
      NOT RECOMMENDED - try using instead:
        Get-DotNetVersion 
          from DotNetVersionLister module (https://github.com/EliteLoser/DotNetVersionLister), 
          but it is not usable/importable in PowerShell 2.0 
        Get-DotNetVersionByReg
          reg(istry) based: (available herin as well) but it may return some wrong version or may not work reliably for versions > 4.5 
          (works in PSv2.0)
      Get-DotNetVersionByFs (this):  
        f(ile) s(ystem) based: determines the latest installed .NET version based on $Env:windir\Microsoft.NET\Framework content
        this is unreliable, e.g. if 4.0* is already installed some 4.5 update will overwrite content there without
        renaming the folder
        (works in PSv2.0)
    .EXAMPLE
      PS> Get-DotnetVersionByFs
      4.0.30319
    .EXAMPLE
      PS> Get-DotnetVersionByFs -All
      1.0.3705
      1.1.4322
      2.0.50727
      3.0
      3.5
      4.0.30319
    .NOTES
      from https://stackoverflow.com/a/52078523/1915920
  #>
    [cmdletbinding()]
  param(
    [Switch]$All  ## do not return only latest, but all installed
  )
  $list = ls $Env:windir\Microsoft.NET\Framework |
    ?{ $_.PSIsContainer -and $_.Name -match '^v\d.[\d\.]+' } |
    %{ $_.Name.TrimStart('v') }
  if ($All) { $list } else { $list | select -last 1 }
}


function Get-DotNetVersionByReg {
  <#
    .SYNOPSIS
      NOT RECOMMENDED - try using instead:
        Get-DotNetVersion
          From DotNetVersionLister module (https://github.com/EliteLoser/DotNetVersionLister), 
          but it is not usable/importable in PowerShell 2.0. 
          Determines the latest installed .NET version based on registry infos under 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP'
    .EXAMPLE
        PS> Get-DotnetVersionByReg
        4.5.51209
    .EXAMPLE
        PS> Get-DotnetVersionByReg -AllDetailed
        PSChildName                                          Version                                             Release
        -----------                                          -------                                             -------
        v2.0.50727                                           2.0.50727.5420
        v3.0                                                 3.0.30729.5420
        Windows Communication Foundation                     3.0.4506.5420
        Windows Presentation Foundation                      3.0.6920.5011
        v3.5                                                 3.5.30729.5420
        Client                                               4.0.0.0
        Client                                               4.5.51209                                           379893
        Full                                                 4.5.51209                                           379893
    .NOTES
      from https://stackoverflow.com/a/52078523/1915920
  #>
    [cmdletbinding()]
    param(
        [Switch]$AllDetailed  ## do not return only latest, but all installed with more details
    )
    $Lookup = @{
        378389 = [version]'4.5'
        378675 = [version]'4.5.1'
        378758 = [version]'4.5.1'
        379893 = [version]'4.5.2'
        393295 = [version]'4.6'
        393297 = [version]'4.6'
        394254 = [version]'4.6.1'
        394271 = [version]'4.6.1'
        394802 = [version]'4.6.2'
        394806 = [version]'4.6.2'
        460798 = [version]'4.7'
        460805 = [version]'4.7'
        461308 = [version]'4.7.1'
        461310 = [version]'4.7.1'
        461808 = [version]'4.7.2'
        461814 = [version]'4.7.2'
    }
    $list = Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse |
        Get-ItemProperty -name Version, Release -EA 0 |
        # For One True framework (latest .NET 4x), change match to PSChildName -eq "Full":
        Where-Object { $_.PSChildName -match '^(?!S)\p{L}'} |
        Select-Object `
           @{
               name = ".NET Framework" ; 
               expression = {$_.PSChildName}}, 
           @{  name = "Product" ; 
               expression = {$Lookup[$_.Release]}}, 
           Version, Release
    if ($AllDetailed) { $list | sort version } else { $list | sort version | select -last 1 | %{ $_.version } }
}

Ejemplo de uso:

PS> Get-DotNetVersionByFs
4.0.30319

PS> Get-DotNetVersionByFs -All
1.0.3705
1.1.4322
2.0.50727
3.0
3.5
4.0.30319

PS> Get-DotNetVersionByReg
4.5.51209

PS> Get-DotNetVersionByReg -AllDetailed

.NET Framework                   Product Version        Release
--------------                   ------- -------        -------
v2.0.50727                               2.0.50727.5420
v3.0                                     3.0.30729.5420
Windows Communication Foundation         3.0.4506.5420
Windows Presentation Foundation          3.0.6920.5011
v3.5                                     3.5.30729.5420
Client                                   4.0.0.0
Client                           4.5.2   4.5.51209      379893
Full                             4.5.2   4.5.51209      379893
Andreas Dietrich
fuente
Para no ver los tiempos use(Get-DotNetVersion -LocalHost -nosummary).">=4.x"
ΩmegaMan
@ ΩmegaMan: thx - actualizó su buena recomendación en la respuesta anterior :)
Andreas Dietrich
1

No es bonito. Definitivamente no es bonito:

ls $Env:windir\Microsoft.NET\Framework | ? { $_.PSIsContainer } | select -exp Name -l 1

Esto puede o no funcionar. Pero en lo que respecta a la última versión, esto debería ser bastante confiable, ya que hay carpetas esencialmente vacías para las versiones antiguas (1.0, 1.1) pero no las más nuevas, que solo aparecen una vez que se instala el marco apropiado.

Aún así, sospecho que debe haber una mejor manera.

Joey
fuente
Necesita filtrar un poco más, "V [.0-9] +" debería limitar la coincidencia a las carpetas .NET (tengo algunas otras carpetas allí). Y luego verifique que haya una instalación real ... WMI en los componentes instalados podría ser más fácil.
Richard
Hm, claro ... en esta máquina también hay algunas otras carpetas, solo tenía un montón de otros archivos en mi otra máquina. Sin embargo, toda esta respuesta fue más un caso de »funciona para mí«. Estoy seguro de que hay una forma confiable y prevista de obtener esa información.
Joey
66
psake (herramienta de automatización de compilación) adopta un enfoque similar y lo utiliza con éxito (o al menos nadie lo cambió debido a un problema). Pero es cierto que no necesitan la versión de marco completo ... Para mi computadora esto se acerca:ls $Env:windir\Microsoft.NET\Framework | ? { $_.PSIsContainer -and $_.Name -match '^v\d.[\d\.]+' } | % { $_.Name.TrimStart('v') }
stej
De todas las respuestas en las respuestas, la que proporciona stej es la más limpia y funciona como se esperaba. Si fuera la respuesta, lo habría votado.
Bratch
Lamentablemente, no es confiable. Tengo .NET 4.7.1 ahora, y el script siempre devuelve v4.0.30319.
Matt
0

Si ha instalado Visual Studio en su máquina, abra el símbolo del sistema del desarrollador de Visual Studio y escriba el siguiente comando: clrver

Enumerará todas las versiones instaladas de .NET Framework en esa máquina.

Abdul Rauf
fuente
Este comando obtiene la versión CLR, no la versión de .NET Framework, que es diferente.
user11909
0

Aquí está mi opinión sobre esta pregunta siguiendo la documentación de msft :

$gpParams = @{
    Path        = 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full'
    ErrorAction = 'SilentlyContinue'
}
$release = Get-ItemProperty @gpParams | Select-Object -ExpandProperty Release

".NET Framework$(
    switch ($release) {
        ({ $_ -ge 528040 }) { ' 4.8'; break }
        ({ $_ -ge 461808 }) { ' 4.7.2'; break }
        ({ $_ -ge 461308 }) { ' 4.7.1'; break }
        ({ $_ -ge 460798 }) { ' 4.7'; break }
        ({ $_ -ge 394802 }) { ' 4.6.2'; break }
        ({ $_ -ge 394254 }) { ' 4.6.1'; break }
        ({ $_ -ge 393295 }) { ' 4.6'; break }
        ({ $_ -ge 379893 }) { ' 4.5.2'; break }
        ({ $_ -ge 378675 }) { ' 4.5.1'; break }
        ({ $_ -ge 378389 }) { ' 4.5'; break }
        default { ': 4.5+ not installed.' }
    }
)"

Este ejemplo funciona con todas las versiones de PowerShell y funcionará a perpetuidad ya que 4.8 es la última versión de .NET Framework.

Maximiliano Burszley
fuente
-1

Aquí está la idea general:

Obtenga elementos secundarios en el directorio de .NET Framework que son contenedores cuyos nombres coinciden con el patrón v número número de punto . Ordénelos por nombre descendente, tome el primer objeto y devuelva su propiedad de nombre.

Aquí está el guión:

(Get-ChildItem -Path $Env:windir\Microsoft.NET\Framework | Where-Object {$_.PSIsContainer -eq $true } | Where-Object {$_.Name -match 'v\d\.\d'} | Sort-Object -Property Name -Descending | Select-Object -First 1).Name
hacedor
fuente
He 4.6.1 instalado, pero sus declaraciones de guión v4.0.30319
Rob
Eso no funciona en mi máquina (tengo 4.7.1 instalado). Imprime v4.0.30319
Matt
-1

Probaría este en PowerShell: ¡funcionó para mí!

(Get-ItemProperty "HKLM: Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full"). Versión

GB
fuente
Eso no te dice la verdad. El número de versión allí dirá, por ejemplo 4.7.03056 cuando la versión del producto es 4.7.2
Jaykul
-2

No estoy al tanto de mi sintaxis de PowerShell, pero creo que podría llamar a System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion () . Esto devolverá la versión como una cadena (algo así v2.0.50727, creo).

Andy
fuente
2
Para el tiempo de ejecución actualmente en ejecución, no necesariamente el último instalado.
Joey
Para el PowerShell, la sintaxis correcta es:, [System.Runtime.InteropServices.RuntimeEnvironment]::GetSystemVersion()pero solo devuelve v4.0.30319, aunque v4.6 está instalado en mi caso.
Matt
@matt 4.0.30319 es la versión CLR de .Net Framework 4.0 a .Net Framework 4.7.1. Entonces, su marco v4.6 realmente usa 4.0.30319 como su versión CLR. Tenga en cuenta que solo la parte de Revisión de la Versión es la diferencia entre todos los .Net Frameworks. Consulte también: Versiones y dependencias de .NET Framework - Microsoft Docs
walterlv
@walterlv - Gracias por el enlace. Sí, soy consciente de eso. Microsoft cometió un gran error al hacer eso, no es fácil conectarse de forma remota a un servidor y averiguar qué versión de .net está realmente instalada allí. Otro gran dolor de cabeza para administradores y desarrolladores.
Matt
Y esto también podría ayudar: Microsoft: cómo determinar las versiones y los niveles de Service Pack de .NET Framework . También muestra cuán complicado se volvió descubrir qué está exactamente instalado en su máquina ... :-(
Matt
-2

Esta es una derivación de la publicación anterior, pero esta obtiene la última versión de .NET Framework 4 en mis pruebas.

get-itemproperty -name version,release "hklm:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\FULL"

Lo que le permitirá invocar-comando a la máquina remota:

invoke-command -computername server01 -scriptblock {get-itemproperty -name version,release "hklm:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\FULL" | select pscomputername,version,release} 

Lo que configura esta posibilidad con ADModule y el prefijo de convención de nomenclatura:

get-adcomputer -Filter 'name -like "*prefix*"' | % {invoke-command -computername $_.name -scriptblock {get-itemproperty -name version,release "hklm:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\FULL" | select pscomputername,version,release} | ft
Bill Curtis
fuente