New module to track Windows versions after patching
Summary: Kel L shared a new module for monitoring detailed Windows Build Revisions on devices, which is not tracked by default. The module allows users to visualize and track updates via a dashboard. They attempted to publish the module but faced issues, so they provided a way to manually import it from shared code snippets.
Hi,
By default, LM doesn't seem to monitor the Build Revision of Windows devices. E.g. It knows something is running Server 2019, but it doesn't know it's running 17636.9121. The last four digits are what changes every month when you install updates. I wrote a simple module to grab that information from every Windows device. I also created a Dashboard that you can use to visually see how many devices are up to date and how many are old. I know I could have just put the Build Revision in its own property, but this way the whole thing is in one place.
I tried to publish it to the Exchange but apparently that process is broken or something So, I figured I'd just upload it here instead in case anyone is interested.
Property Screenshot

Dashboard Sample

Hmm. Apparently there's no way to upload a file to a post? You'll have to save the text below as a JSON file and then import it I guess. I don't know if all the stuff below is needed, it's just what it gave me when I did an Export.
Module
{
"searchKeywords": "",
"integrationMetadata": {
"publishedAtMS": 1786125969729,
"registryVersion": "1.0.0",
"name": "",
"checksum": "ce2a6998180cd94967b68b3a93fe0306",
"registryId": "e15c5d79-315b-4827-bd45-6a5687174a92",
"isPrivate": true,
"locator": "3A926C",
"lineageId": "tDiDDv3nR8eduyik90gmvg",
"status": "SECURITY_REVIEW"
},
"name": "Windows_Version_Full",
"description": "This module pulls the full Windows Version from a Server or Workstation running Windows 10/2016 or newer. It is stored in the property called auto.os.version.windowsfull.\n\nIt is designed to work with a Dashboard using Resource Explorer widgets filtered on the 3rd octet to visibly see how many devices are on the latest version and how many are behind.",
"appliesTo": "iswindows()",
"type": 5,
"technicalNotes": "",
"version": 1786127617,
"registryMetadata": {
"currentUuid": "tDiDDv3nR8eduyik90gmvg",
"originalUuid": "GfnjKuDIR5G9wKib37djPw",
"locatorId": "",
"registryVersion": "1.0.0",
"checksum": "ce2a6998180cd94967b68b3a93fe0306",
"namespace": "",
"registryId": "",
"isChangedFromOrigin": true,
"status": ""
},
"script": {
"type": "powershell",
"content": "$computer = \"##HOSTNAME##\"\r\n$Cred = $null\r\n$LMUser = \"##WMI.USER##\"\r\n$LMPass = \"##WMI.PASS##\"\r\n\r\nif ($LMUser -and $LMUser -ne \"\" -and $LMPass -and $LMPass -ne \"\") {\r\n try {\r\n $SecurePass = ConvertTo-SecureString $LMPass -AsPlainText -Force\r\n $Cred = New-Object System.Management.Automation.PSCredential ($LMUser, $SecurePass)\r\n } catch {\r\n Write-Host \"os.version.WindowsFull=Error creating credential: $($_.Exception.Message)\"\r\n exit\r\n }\r\n}\r\n\r\ntry {\r\n\r\n if ($Cred) {\r\n\t\t\t$version = Invoke-Command -ComputerName $computer -Credential $Cred -ScriptBlock {\r\n\t\t\t\t$w = Get-ItemProperty 'HKLM:\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion' -ErrorAction Stop\r\n\r\n\t\t\t\tif ($null -ne $w.CurrentMajorVersionNumber -and $null -ne $w.CurrentMinorVersionNumber) {\r\n\t\t\t\t\t$major = $w.CurrentMajorVersionNumber\r\n\t\t\t\t\t$minor = $w.CurrentMinorVersionNumber\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t$cv = [version]$w.CurrentVersion\r\n\t\t\t\t\t$major = $cv.Major\r\n\t\t\t\t\t$minor = $cv.Minor\r\n\t\t\t\t}\r\n\r\n\t\t\t\t$build = if ($w.CurrentBuildNumber) { $w.CurrentBuildNumber } else { $w.CurrentBuild }\r\n\t\t\t\t$ubr = $w.UBR\r\n\t\t\t\t\r\n\t\t\t\t\"{0}.{1}.{2}.{3}\" -f $major, $minor, $build, $ubr\r\n\t\t\t} -ErrorAction Stop\r\n\r\n } else {\r\n\r\n\t\t\t$version = Invoke-Command -ComputerName $computer -ScriptBlock {\r\n\t\t\t\t$w = Get-ItemProperty 'HKLM:\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion' -ErrorAction Stop\r\n\r\n\t\t\t\tif ($null -ne $w.CurrentMajorVersionNumber -and $null -ne $w.CurrentMinorVersionNumber) {\r\n\t\t\t\t\t$major = $w.CurrentMajorVersionNumber\r\n\t\t\t\t\t$minor = $w.CurrentMinorVersionNumber\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t$cv = [version]$w.CurrentVersion\r\n\t\t\t\t\t$major = $cv.Major\r\n\t\t\t\t\t$minor = $cv.Minor\r\n\t\t\t\t}\r\n\r\n\t\t\t\t$build = if ($w.CurrentBuildNumber) { $w.CurrentBuildNumber } else { $w.CurrentBuild }\r\n\t\t\t\t$ubr = $w.UBR\r\n\r\n\t\t\t\t\"{0}.{1}.{2}.{3}\" -f $major, $minor, $build, $ubr\r\n\t\t\t} -ErrorAction Stop\r\n }\r\n\r\nWrite-Host \"os.version.WindowsFull=$version\"\r\nexit 0\r\n}\r\ncatch {\r\n Write-Host \"Error: $($_.Exception.Message)\"\r\n exit 1\r\n}"
},
"group": ""
}
Dashboard
{
"santabaRelease": 243,
"defaultDashboardFilters": {
"defaultDashboardFilterDetails": []
},
"widgetTokens": [],
"name": "Windows Versions (Patching)",
"description": "",
"overwriteGroupFields": false,
"widgetsConfigVersion": 2,
"type": "dashboard",
"widgets": [
{
"position": {
"col": 1,
"sizex": 10,
"row": 1,
"sizey": 7
},
"config": {
"vizInfo": {
"alertFilters": {
"datapointsFilterMode": "INCLUDE",
"isIgnoreSdtAlerts": true,
"datapointFilters": []
},
"groupBy": [
{
"name": "auto.os.version.windowsfull",
"label": "",
"type": "RESOURCE_PROPERTY"
}
],
"filterBy": {
"severityFilters": {
"critical": true,
"warning": true,
"none": true,
"error": true
},
"filters": [
{
"name": "auto.os.version.windowsfull",
"label": "",
"type": "RESOURCE_PROPERTY",
"inclusionType": "INCLUDE",
"value": [
{
"label": "*14393*",
"value": "*14393*"
}
]
}
]
}
},
"displaySettings": {
"zoomLevel": 100,
"showFilter": false,
"sortType": "PROPERTY_VALUE_REVERSE",
"fontSize": "medium",
"visualizationLayout": "HIVE"
},
"isSupportCustomProperty": false,
"supportCustomProperty": false,
"name": "Server 2016",
"description": "",
"theme": "newBorderGray",
"interval": 15,
"type": "viz",
"timescale": "day",
"version": 2,
"widgetConfig": "{\"vizInfo\": {\n \"alertFilters\": {\n \"datapointsFilterMode\": \"INCLUDE\",\n \"isIgnoreSdtAlerts\": true,\n \"datapointFilters\": []\n },\n \"groupBy\": [{\n \"name\": \"auto.os.version.windowsfull\",\n \"label\": \"\",\n \"type\": \"RESOURCE_PROPERTY\"\n }],\n \"filterBy\": {\n \"severityFilters\": {\n \"critical\": true,\n \"warning\": true,\n \"none\": true,\n \"error\": true\n },\n \"filters\": [{\n \"name\": \"auto.os.version.windowsfull\",\n \"label\": \"\",\n \"type\": \"RESOURCE_PROPERTY\",\n \"inclusionType\": \"INCLUDE\",\n \"value\": [{\n \"label\": \"*14393*\",\n \"value\": \"*14393*\"\n }]\n }]\n }\n}}"
}
},
{
"position": {
"col": 1,
"sizex": 10,
"row": 8,
"sizey": 4
},
"config": {
"vizInfo": {
"alertFilters": {
"datapointsFilterMode": "INCLUDE",
"isIgnoreSdtAlerts": true,
"datapointFilters": []
},
"groupBy": [
{
"name": "auto.os.version.windowsfull",
"label": "",
"type": "RESOURCE_PROPERTY"
}
],
"filterBy": {
"severityFilters": {
"critical": true,
"warning": true,
"none": true,
"error": true
},
"filters": [
{
"name": "auto.os.version.windowsfull",
"label": "",
"type": "RESOURCE_PROPERTY",
"inclusionType": "INCLUDE",
"value": [
{
"label": "*17763*",
"value": "*17763*"
}
]
}
]
}
},
"displaySettings": {
"zoomLevel": 100,
"showFilter": false,
"sortType": "PROPERTY_VALUE_REVERSE",
"fontSize": "medium",
"visualizationLayout": "HIVE"
},
"isSupportCustomProperty": false,
"supportCustomProperty": false,
"name": "Server 2019",
"description": "",
"theme": "newBorderGray",
"interval": 15,
"type": "viz",
"timescale": "day",
"version": 2,
"widgetConfig": "{\"vizInfo\": {\n \"alertFilters\": {\n \"datapointsFilterMode\": \"INCLUDE\",\n \"isIgnoreSdtAlerts\": true,\n \"datapointFilters\": []\n },\n \"groupBy\": [{\n \"name\": \"auto.os.version.windowsfull\",\n \"label\": \"\",\n \"type\": \"RESOURCE_PROPERTY\"\n }],\n \"filterBy\": {\n \"severityFilters\": {\n \"critical\": true,\n \"warning\": true,\n \"none\": true,\n \"error\": true\n },\n \"filters\": [{\n \"name\": \"auto.os.version.windowsfull\",\n \"label\": \"\",\n \"type\": \"RESOURCE_PROPERTY\",\n \"inclusionType\": \"INCLUDE\",\n \"value\": [{\n \"label\": \"*17763*\",\n \"value\": \"*17763*\"\n }]\n }]\n }\n}}"
}
},
{
"position": {
"col": 1,
"sizex": 10,
"row": 12,
"sizey": 3
},
"config": {
"vizInfo": {
"alertFilters": {
"datapointsFilterMode": "INCLUDE",
"isIgnoreSdtAlerts": true,
"datapointFilters": []
},
"groupBy": [
{
"name": "auto.os.version.windowsfull",
"label": "",
"type": "RESOURCE_PROPERTY"
}
],
"filterBy": {
"severityFilters": {
"critical": true,
"warning": true,
"none": true,
"error": true
},
"filters": [
{
"name": "auto.os.version.windowsfull",
"label": "",
"type": "RESOURCE_PROPERTY",
"inclusionType": "INCLUDE",
"value": [
{
"label": "*20348*",
"value": "*20348*"
}
]
}
]
}
},
"displaySettings": {
"zoomLevel": 100,
"showFilter": false,
"sortType": "PROPERTY_VALUE_REVERSE",
"fontSize": "medium",
"visualizationLayout": "HIVE"
},
"isSupportCustomProperty": false,
"supportCustomProperty": false,
"name": "Server 2022",
"description": "",
"theme": "newBorderGray",
"interval": 15,
"type": "viz",
"timescale": "day",
"version": 2,
"widgetConfig": "{\"vizInfo\": {\n \"alertFilters\": {\n \"datapointsFilterMode\": \"INCLUDE\",\n \"isIgnoreSdtAlerts\": true,\n \"datapointFilters\": []\n },\n \"groupBy\": [{\n \"name\": \"auto.os.version.windowsfull\",\n \"label\": \"\",\n \"type\": \"RESOURCE_PROPERTY\"\n }],\n \"filterBy\": {\n \"severityFilters\": {\n \"critical\": true,\n \"warning\": true,\n \"none\": true,\n \"error\": true\n },\n \"filters\": [{\n \"name\": \"auto.os.version.windowsfull\",\n \"label\": \"\",\n \"type\": \"RESOURCE_PROPERTY\",\n \"inclusionType\": \"INCLUDE\",\n \"value\": [{\n \"label\": \"*20348*\",\n \"value\": \"*20348*\"\n }]\n }]\n }\n}}"
}
},
{
"position": {
"col": 1,
"sizex": 10,
"row": 15,
"sizey": 3
},
"config": {
"vizInfo": {
"alertFilters": {
"datapointsFilterMode": "INCLUDE",
"isIgnoreSdtAlerts": true,
"datapointFilters": []
},
"groupBy": [
{
"name": "auto.os.version.windowsfull",
"label": "",
"type": "RESOURCE_PROPERTY"
}
],
"filterBy": {
"severityFilters": {
"critical": true,
"warning": true,
"none": true,
"error": true
},
"filters": [
{
"name": "auto.os.version.windowsfull",
"label": "",
"type": "RESOURCE_PROPERTY",
"inclusionType": "INCLUDE",
"value": [
{
"label": "*26100*",
"value": "*26100*"
}
]
}
]
}
},
"displaySettings": {
"zoomLevel": 100,
"showFilter": false,
"sortType": "PROPERTY_VALUE_REVERSE",
"fontSize": "medium",
"visualizationLayout": "HIVE"
},
"isSupportCustomProperty": false,
"supportCustomProperty": false,
"name": "Server 2025",
"description": "",
"theme": "newBorderGray",
"interval": 15,
"type": "viz",
"timescale": "day",
"version": 2,
"widgetConfig": "{\"vizInfo\": {\n \"alertFilters\": {\n \"datapointsFilterMode\": \"INCLUDE\",\n \"isIgnoreSdtAlerts\": true,\n \"datapointFilters\": []\n },\n \"groupBy\": [{\n \"name\": \"auto.os.version.windowsfull\",\n \"label\": \"\",\n \"type\": \"RESOURCE_PROPERTY\"\n }],\n \"filterBy\": {\n \"severityFilters\": {\n \"critical\": true,\n \"warning\": true,\n \"none\": true,\n \"error\": true\n },\n \"filters\": [{\n \"name\": \"auto.os.version.windowsfull\",\n \"label\": \"\",\n \"type\": \"RESOURCE_PROPERTY\",\n \"inclusionType\": \"INCLUDE\",\n \"value\": [{\n \"label\": \"*26100*\",\n \"value\": \"*26100*\"\n }]\n }]\n }\n}}"
}
}
],
"version": 2
}