Friday, February 2, 2018

PowerShell oneliner to list all the installed .NET versions on a remote computer

Not so long ago I described how to retrieve the installed .NET version in a single line of PowerShell code through a registry query. This time I want to show you how the same can be achieved on a remote system by modifying a bit our approach. The big difference is that for a remote instance you have to access the HKEY_LOCAL_MACHINE base key through the RegistryKey.OpenRemoteBaseKey method.

The key path is the same as the one we saw on the locally run oneliner:
HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP


The regular expression is moved at the beginning of the oneliner, so that I can cycle through every item and open one subkey at the time.
"v1.1.4322","v2.0.50727","v3.0","v3.5","v4\Full"|%{([Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $Computer)).OpenSubKey("SOFTWARE\Microsoft\NET Framework Setup\NDP\$_").GetValue('version')}
As you can see with a bit of PowerShell gymnastics, you can get pretty concise lines of code that do powerful things.
Stay tuned for more PowerShell.

4 comments:

  1. You cannot call a method on a null-valued expression.
    At line:1 char:52
    + ... "v4\Full"|%{([Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalM ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

    2.0.50727.4927
    3.0.30729.4926
    3.5.30729.4926
    4.7.02556

    ReplyDelete
    Replies
    1. I get the same (Win10). It's cause the 1.1 key doesn't exist.

      Delete
    2. I get the same (Win10). It's cause v1.1.4322 doesn't exist. I assume it will for legacy OS's.

      Delete
  2. "v1.1.4322","v2.0.50727","v3.0","v3.5","v4\Full"|%{([Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $Computer)).OpenSubKey("SOFTWARE\Microsoft\NET Framework Setup\NDP\$_").GetValue('version')}

    This doesn't qualify as a oneliner in my book. Too lengthy and complex, and you're better off *not* trying to code-golf anything to do with the registry. Nor do you account for errors that will inevitably crop up when one or more of your versions isn't present.

    "v1.1.4322","v2.0.50727","v3.0","v3.5","v4\Full" |
    ForEach-Object {
    $RegKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $Computer)
    $RegKey.OpenSubKey("SOFTWARE\Microsoft\NET Framework Setup\NDP\$_").GetValue('version')
    }

    ReplyDelete

Related Posts Plugin for WordPress, Blogger...