Find the Full Windows Build Number with PowerShell

Much to my surprise I discovered that the full build number for a Windows OS is not stored in WMI in the usual Win32_OperatingSystem class.

In Windows 10 at least, the full build number containing the “UBR”, or essentially the CU patch level of the build, is a useful piece of information.

Open Settings > System > About on a Windows 10 box, and you’ll find the OS Build value, in my case 15063.183


If I run the usual WMI query to get the build number I just get 15063:


Same if I query the environment:


To find the full number I have to query the registry in the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion branch.

So I put together a PowerShell script that can be used to get the Windows version for a local or remote computer (or group of computers) which includes the Edition, Version and full OS Build values.

Query the local system like this:


Or query remote computers:

Get-WindowsVersion -ComputerName PC001

Get-WindowsVersion -ComputerName @("PC001","PC002","SRV001","SRV002")



The script

[string[]]$ComputerName = $env:COMPUTERNAME
$Table = New-Object System.Data.DataTable
$Table.Columns.AddRange(@("ComputerName","Windows Edition","Version","OS Build"))
Foreach ($Computer in $ComputerName)
$Code = {
$ProductName = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' Name ProductName).ProductName
$Version = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' Name ReleaseID ErrorAction Stop).ReleaseID
$Version = "N/A"
$CurrentBuild = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' Name CurrentBuild).CurrentBuild
$UBR = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' Name UBR).UBR
$OSVersion = $CurrentBuild + "." + $UBR
$TempTable = New-Object System.Data.DataTable
$TempTable.Columns.AddRange(@("ComputerName","Windows Edition","Version","OS Build"))
Return $TempTable
If ($Computer -eq $env:COMPUTERNAME)
$Result = Invoke-Command ScriptBlock $Code
[void]$Table.Rows.Add($Result.Computername,$Result.'Windows Edition',$Result.Version,$Result.'OS Build')
$Result = Invoke-Command ComputerName $Computer ScriptBlock $Code ErrorAction Stop
[void]$Table.Rows.Add($Result.Computername,$Result.'Windows Edition',$Result.Version,$Result.'OS Build')
Return $Table

14 thoughts on “Find the Full Windows Build Number with PowerShell

  1. Wauw, beside your nice script, this must be the coolest .net class I’ve ever seen System.Data.DataTable Many Thanks for that, nice and easy way to create objects..I guess better than the hashtables everyone knows about to create PCCustomobjects…or which one is in your opinion more a favorite?

    1. Thanks, hashtables are perfectly cool too 🙂 I often query SQL data so I’m in the habit of using the datatable format, but it works quite well for general use too.

  2. What am I missing here? I can run the script and return the local computers value. But, I can’t seem to figure out how to return remote system values and groups of remote system values.

  3. function Get-WindowsVersion {

    ^ required on line one for the script to work properly with the command indicated.

    Maybe this was implied? I had to ask IRC to get this information. I hope this helps anyone else trying to use the script.

    1. You can also call this like: ‘.\Get Computer Build Number.ps1’ -ComputerName ‘Name’ | Export-csv ‘path’

      or: ‘.\Get Computer Build Number.ps1’ -ComputerName @(‘Name’, ‘Name1’) | Export-csv ‘path’

    2. Hey Paul. I’m trying the same thing you are, but cant seem to figure out what you mean above. Can you post the modified script for remote users?


  4. Excellent script that saved me a lot of work. Thank you Trevor for sharing.
    And thank you Paul R. for your notice

  5. OK, I can get the script to work on my local machine, but how do you make this script get the info for 500 machines? I have a txt file with the PC names, how can I make it read each name in the txt file and display the Windows Version?


    1. If your file is just computer names: Get-Content .\Yourfile.txt | .\NameOfTheScript.ps1
      If your file is a CSV, name column header “ComputerName” then: Import-Csv .\YourFile.csv | .\NameOfTheScript.ps1

      Either of those should work since the has “ValueFromPipelineByPropertyName = $true” which handles the CSV with proper column name and “ValueFromPipeline = $true” takes any string input from pipeline.

  6. I’m going to go ahead and put my ignorance on full display here, but since I am only barely familiar with Powershell, I absolutely cannot fill in the blanks between the script as originally written and the modifications offered or changing the way the script is initiated. Are lines being added? Is the script being run in the ISE version or just straight powershell? Does it matter? If lines are being added, where? The solutions for modifying the script above might work wonderfully for those who know how to integrate them, but following *any* of them at face value consistently produces error messages that indicate that the term used is not recognized. Or in the case of trying to run the script by typing “scriptname.ps1” returns with the term is not recognized as the name of a cmdlet, function, script file, or operable program. I am completely unable to get any of the modifications to actually work.

    Paul R gives us: function Get-WindowsVersion {
    Importantly, he adds that this be added in line 1, but when I do, this only breaks the script and I continue to see that Get-WindowsVersion is not recognized.

    Chase R gives us: Get-Content .\Yourfile.txt | .\NameOfTheScript.ps1. Subbing in my own files in place of the sample names offered, I get the message that Get-Content is not recognized. Running Get-Content by itself, works, but the result is simply to print out what I typed into my CSV file and the script, which is not at all the result I am looking for. How do I get the script to refer to the CSV file for computer names to address? Screen shots will probably work better than description alone.

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.