private/Get-WindowsVersion.ps1
function Get-WindowsVersion { <# .DESCRIPTION Tries a few different methods to get the exact current Windows version because some of them can be inaccurate/outdated (particularly for Insider Builds). #> [OutputType('System.Version')] $Versions = [System.Collections.Generic.Dictionary[string, Version]]::new() $CmdOutput = Invoke-PackageCommand -Path $env:SystemRoot -Executable "${env:SystemRoot}\System32\cmd.exe" -Arguments '/D /C VER' -RuntimeLimit ([TimeSpan]::FromMinutes(1)) if (-not $CmdOutput.Err) { $CmdOutputRegex = [regex]::match($CmdOutput.Info.StandardOutput, '[\d\.]+') if ($CmdOutputRegex.Success) { [version]$cmdVersion = $CmdOutputRegex.Value $Versions.Add('cmd', $cmdVersion) } } $registryData = Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' -Name CurrentMajorVersionNumber, CurrentMinorVersionNumber, CurrentBuildNumber, UBR -ErrorAction SilentlyContinue if ($?) { $registryVersion = [Version]::new( $registryData.CurrentMajorVersionNumber, $registryData.CurrentMinorVersionNumber, $registryData.CurrentBuildNumber, $registryData.UBR ) $Versions.Add('registry', $registryVersion) } $fileData = Get-Item -LiteralPath "${env:SystemRoot}\System32\ntoskrnl.exe" -ErrorAction SilentlyContinue $fileVersion = [Version]::new() if ($fileData -and [Version]::TryParse($fileData.VersionInfo.ProductVersion, [ref]$fileVersion)) { $Versions.Add('file', $fileVersion) } [Version]$EnvVersion = [Environment]::OSVersion.Version $Versions.Add('env', $EnvVersion) [Version]$WmiData = (Get-CimInstance -ClassName CIM_OperatingSystem -Property Version -Verbose:$false).Version $WmiVersion = [Version]::new() if ([Version]::TryParse($WmiData, [ref]$WmiVersion)) { $Versions.Add('wmi', $WmiVersion) } $HighestFound = $Versions.GetEnumerator() | Sort-Object -Property Value | Select-Object -Last 1 return $HighestFound.Value } |