Skip to content

Enhanced Inventory Data Reference (Windows)

Enhanced Inventory Data Reference (Windows)

This page lists everything the Windows Enhanced Inventory script (Intune_Windows_Inventory.ps1) collects from a device and sends to your Log Analytics workspace. Use it to answer security and privacy reviews, to decide which collection categories to turn on, and to understand what each dashboard in BI for Intune is built from.

The reference matches script version 19 (August 10, 2026) in the Windows-Enhanced-Inventory repository. For deployment steps, see Set up Enhanced Inventory.

The script runs as SYSTEM from an Intune remediation, once per day. Each run:

  1. Reads the Intune enrollment ID and computer name from the device.
  2. Collects each category you’ve turned on (device, application, driver).
  3. Converts each category to JSON, compresses it with GZip, and Base64-encodes the result.
  4. Splits the encoded text into chunks of up to 64,512 characters and writes each chunk to a numbered string column (up to 10 columns per table).
  5. Sends one record per category to your Data Collection Endpoint through the Logs Ingestion API, authenticating with the app registration from Step 1 of the setup guide.

BI for Intune decodes the chunks when it refreshes. If a category exceeds 10 chunks, the script logs an error and that category isn’t sent for that run.

All settings are variables near the top of the script. $true collects the category; $false skips it.

SettingDefaultWhat it controls
$CollectDeviceInventory$trueThe entire PowerStacksDeviceInventory_CL record: hardware, monitors, disks, chassis, battery, OS install date, and the two sub-categories below.
$CollectMicrosoft365$trueMicrosoft 365 Apps version, update channel, and release data. Sub-setting of device inventory; ignored when device inventory is off.
$CollectWarranty$falseWarranty lookup against the Dell, HP, Lenovo, or Getac API. Sub-setting of device inventory. Also requires vendor API credentials.
$RemoveBuiltInMonitors$falseWhen $true, excludes the laptop’s internal display from the monitor list.
$CollectAppInventory$trueThe entire PowerStacksAppInventory_CL record: installed Win32 applications.
$CollectUWPInventory$falseAdds Microsoft Store (UWP) packages to the application list. Sub-setting of application inventory.
$CollectDriverInventory$trueThe entire PowerStacksDriverInventory_CL record: installed and optional drivers.
$MatchDrivers$trueWhen $true, matches installed driver packages to Windows Update package names and queries Windows Update for optional driver updates. When $false, reports installed PnP drivers only and skips the Windows Update query.
$WarrantyMaxCacheAgeDays352Days a cached warranty result stays valid before the script calls the vendor API again.
$WarrantyForceRefresh$falseWhen $true, ignores the cache and calls the vendor API on every run.
$InventoryDateFormat"MM-dd HH:mm"Format of the timestamp in the remediation status message. Doesn’t affect the data sent.
$Transcribe$falseWhen $true, writes a full PowerShell transcript to C:\Windows\Logs.

The remaining settings ($LogAPIMode, $TenantId, $ClientId, $ClientSecret, $DceURI, $DcrImmutableId, the optional $BrokerUrl and $BrokerClientId, the $Submission* retry values, and the $Warranty*ClientID and $Warranty*ClientSecret credentials) control how the script authenticates and where it sends data. They don’t change what is collected.

Every record in all three tables has these columns.

ColumnSource on the deviceNotes
TimeGeneratedAdded by Azure MonitorIngestion time.
ComputerName_sGet-ComputerInfo (CsName)The device’s computer name.
ManagedDeviceID_gRegistry: HKLM\SOFTWARE\Microsoft\Enrollments\<id>\MS DM Server, value EntDMIDThe Intune managed device ID. BI for Intune uses it to join inventory to the Intune device record. Empty if the device isn’t enrolled.

The payload columns differ per table and are listed in each section below.

Collected when $CollectDeviceInventory is $true. One record per device per run.

ColumnNotes
Microsoft365_btrue when $CollectMicrosoft365 is on.
Warranty_btrue when warranty data was collected for this run, otherwise false.
DeviceDetails1_s through DeviceDetails10_sChunks of the compressed, Base64-encoded device JSON described below.

These fields are always collected when device inventory is on.

FieldSource on the deviceNotes
DeviceManufacturerGet-ComputerInfo (CsManufacturer)
DeviceModelGet-ComputerInfo (CsModel); for Lenovo and IBM, Win32_ComputerSystemProduct.VersionLenovo reports the friendly model name in Version.
MemoryGet-ComputerInfo (CsTotalPhysicalMemory)Bytes.
CPUManufacturerWin32_Processor.Manufacturer
CPUNameWin32_Processor.Name
CPUMaxClockSpeedWin32_Processor.MaxClockSpeedMHz.
CPUPhysicalWin32_ComputerSystem.NumberOfProcessorsPhysical processor count.
CPUCoresWin32_Processor.NumberOfCores
CPULogicalWin32_Processor.NumberOfLogicalProcessors
LastBootTimeGet-ComputerInfo (OsLastBootUpTime)UTC.
OSInstallDateGet-ComputerInfo (OsInstallDate)UTC.
BatteryDesignedCapacityWMI ROOT\WMI\BatteryStaticData.DesignedCapacitymWh. Empty on devices without a battery.
BatteryFullChargedCapacityWMI ROOT\WMI\BatteryFullChargedCapacity.FullChargedCapacitymWh. Compared with designed capacity to show battery health.
MonitorsArray, see Monitor Fields
PhysicalDisksArray, see Physical Disk Fields
ChassisArray, see Chassis Fields
Microsoft365Object, see Microsoft 365 FieldsPresent only when $CollectMicrosoft365 is $true.
WarrantyObject, see Warranty FieldsPresent only when $CollectWarranty is $true.

One entry per display reported by WMI class ROOT\WMI\WMIMonitorID. When $RemoveBuiltInMonitors is $true, displays that also appear in Win32_DesktopMonitor (the built-in laptop panel) are excluded.

FieldSourceNotes
ManufacturerWMIMonitorID.ManufacturerNameThree-letter EDID manufacturer code, for example DEL.
ModelWMIMonitorID.UserFriendlyName
SerialNumberWMIMonitorID.SerialNumberIDThe monitor’s serial number from EDID.
WeekOfManufactureWMIMonitorID.WeekOfManufacture
YearOfManufactureWMIMonitorID.YearOfManufacture

One entry per physical disk from Get-PhysicalDisk with a bus type of NVMe, SATA, SAS, ATAPI, or RAID. USB and other removable bus types are excluded.

FieldSourceNotes
NumberGet-PhysicalDisk (DeviceId)
BusTypeGet-PhysicalDisk (BusType)
FirmwareVersionGet-PhysicalDisk (FirmwareVersion)
HealthStatusGet-PhysicalDisk (HealthStatus)Healthy, Warning, or Unhealthy.
ManufacturerGet-PhysicalDisk (Manufacturer)
ModelGet-PhysicalDisk (Model)
NameGet-PhysicalDisk (FriendlyName)
SerialNumberGet-PhysicalDisk (SerialNumber)The disk’s serial number.
SizeGet-PhysicalDisk (Size)Bytes.
TypeGet-PhysicalDisk (MediaType)SSD, HDD, or Unspecified.
SMARTPredictFailureWMI ROOT\WMI\MSStorageDriver_FailurePredictStatus.PredictFailuretrue when the drive’s SMART status predicts failure.
SMARTReasonMSStorageDriver_FailurePredictStatus.Reason
WearGet-StorageReliabilityCounter (Wear)Percent.
ReadErrorsUncorrectedGet-StorageReliabilityCounter
ReadErrorsTotalGet-StorageReliabilityCounter
WriteErrorsUncorrectedGet-StorageReliabilityCounter
WriteErrorsTotalGet-StorageReliabilityCounter
TemperatureGet-StorageReliabilityCounterCelsius.
TemperatureMaxGet-StorageReliabilityCounterCelsius.

One entry per chassis type code reported by Win32_SystemEnclosure.

FieldSourceNotes
ChassisTypeCodeWin32_SystemEnclosure.ChassisTypesSMBIOS chassis type, for example 10 (Notebook) or 3 (Desktop).
ChassisTagWin32_SystemEnclosure.SMBIOSAssetTagThe asset tag set in firmware, if any.

Collected when $CollectMicrosoft365 is $true and Microsoft 365 Apps (Click-to-Run) is installed. If Office isn’t installed with Click-to-Run, the object is empty.

FieldSourceNotes
InstalledVersionRegistry: HKLM\SOFTWARE\Microsoft\Office\ClickToRun\Configuration, value VersionToReport
UpdateChannelRegistry: HKLM\SOFTWARE\Policies\Microsoft\Office\16.0\Common\OfficeUpdate, value UpdateBranch; otherwise the channel GUID in CDNBaseUrlMonthly, Monthly Enterprise, Semi-Annual, Beta, or their Preview variants.
LatestReleaseTypeMicrosoft release data APIWhether the installed build is a feature or security release.
LatestReleaseVersionMicrosoft release data APINewest build available on the device’s channel.
EndOfSupportDateMicrosoft release data APIWhen the installed build leaves support.
ReleaseDateMicrosoft release data APIWhen the installed build was released.
ReleaseIDMicrosoft release data APIFor example 2409.

The release data comes from two public, unauthenticated Microsoft endpoints listed under Network Endpoints. The script sends only HTTP GET requests to them and doesn’t send any device data.

Collected when $CollectWarranty is $true and credentials are supplied for the device’s manufacturer. The script sends the device’s serial number from Win32_BIOS.SerialNumber to the manufacturer’s warranty API and stores the response.

FieldSourceNotes
ServiceProviderScriptDell, HP, Lenovo, or Getac.
ServiceModelVendor APIThe vendor’s product description.
ServiceTagWin32_BIOS.SerialNumberThe serial number sent to the vendor.
ServiceLevelDescriptionVendor APIEntitlement names, one per line.
WarrantyStartDateVendor APIUTC. Earliest entitlement start.
WarrantyEndDateVendor APIUTC. Latest entitlement end.

Manufacturers are matched on the Win32_BIOS.Manufacturer value: Dell, HP, Lenovo or IBM, and Insyde (Getac). Other manufacturers are skipped. The result is cached on the device at C:\Windows\Warranty_<serial>.json for $WarrantyMaxCacheAgeDays days so the vendor API is called at most a few times per year per device. For HP, the raw API response is also written to C:\Windows\Temp\HPWarranty_Raw_<serial>.json for troubleshooting.

Collected when $CollectAppInventory is $true. One record per device per run. The payload is in InstalledApps1_s through InstalledApps10_s.

Win32 applications are read from the Windows uninstall registry keys, the same source Settings > Apps uses:

  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
  • HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
  • HKU\<SID of the signed-in user>\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
  • HKU\<SID of the signed-in user>\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall

The signed-in user is taken from Win32_ComputerSystem.UserName, or from the owner of explorer.exe if no one is signed in interactively. If no user can be resolved, only machine-scope applications are collected. Entries without a DisplayName are ignored.

Microsoft Store (UWP) packages are added only when $CollectUWPInventory is $true. They come from Get-AppxPackage -AllUsers, filtered to packages with an install state of Installed, with the publisher read from each package manifest.

When the same application name appears more than once (for example, a 32-bit and a 64-bit entry), only the entry with the highest version is kept.

One entry per application.

FieldSourceWin32UWPNotes
AppNameDisplayName / package NameYesYes
AppVersionDisplayVersion / package VersionYesYes
AppPublisherPublisher / manifest PublisherDisplayNameYesYes
AppTypeScriptWin32UWP
AppInstallDateInstallDateYesNoFormatted dd-MM-yyyy. Empty when the installer didn’t record a date.
AppUninstallStringUninstallStringYesNoThe command Windows runs to uninstall the application.
AppUninstallRegPathRegistry key pathYesNoThe full path of the uninstall key the entry was read from. For per-user applications this path contains the user’s SID.

Collected when $CollectDriverInventory is $true. One record per device per run. The payload is in ListedDrivers1_s through ListedDrivers10_s.

Installed drivers come from Win32_PnPSignedDriver. Drivers whose manufacturer or provider is Microsoft, and entries without a device name, are excluded. This keeps the list to third-party hardware drivers.

When $MatchDrivers is $true, the script also:

  • Reads installed driver packages from Get-Package -ProviderName msu and matches them to the PnP list by version, so an installed driver can be tied to the Windows Update package that delivered it (WUName).
  • Queries the Windows Update Agent (Microsoft.Update.Session) for updates matching IsInstalled=0 AND Type='Driver'. These appear with a status of Optional. The query goes to whatever update source the device is configured for (Windows Update or WSUS).

When $MatchDrivers is $false, only the PnP list is reported and the Windows Update query is skipped. Turn it off if driver collection takes too long on some devices.

One entry per driver.

FieldSource (installed)Source (optional)Notes
WUNameMatched Get-Package nameWindows Update TitleEmpty when no package matched.
DriverNameWin32_PnPSignedDriver.DeviceNameWindows Update DriverModel
DriverVersionDriverVersionNot available
DriverReleaseDateDriverDateDriverVerDateUTC.
DriverClassDeviceClassDriverClassFor example NET, DISPLAY.
DriverIDDeviceIDNot availablePnP device instance ID.
DriverHardwareIDHardwareIDDriverHardwareID
DriverManufacturerManufacturerDriverManufacturer
DriverInfNameInfNameNot available
DriverLocationLocationNot availableBus location, for example PCI bus 0, device 2.
DriverDescriptionDescriptionWindows Update Description
DriverProviderDriverProviderNameDriverProvider
DriverPublishedOnNot availableLastDeploymentChangeTimeUTC. When Windows Update published the optional driver.
DriverStatusInstalledOptional

The script makes outbound HTTPS connections only to the endpoints below. Which ones it contacts depends on the settings you turn on.

EndpointWhenPurpose
login.microsoftonline.comAlwaysAcquires the ingestion token with the app registration’s client ID and secret.
Your Data Collection Endpoint (*.ingest.monitor.azure.com)AlwaysSends the inventory records.
Your Entra Token Broker URLOnly when $BrokerUrl is setSecretless token exchange. Replaces the client secret, not the DCE call.
mrodevicemgr.officeapps.live.com$CollectMicrosoft365Microsoft 365 Apps release data. Anonymous GET, no device data sent.
clients.config.office.net$CollectMicrosoft365Microsoft 365 Apps channel release list. Anonymous GET, no device data sent.
Windows Update or your WSUS server$CollectDriverInventory and $MatchDriversOptional driver search through the Windows Update Agent.
apigtwb2c.us.dell.com$CollectWarranty, Dell devicesWarranty lookup. Sends the device serial number.
warranty.api.hp.com$CollectWarranty, HP devicesWarranty lookup. Sends the device serial number.
supportapi.lenovo.com$CollectWarranty, Lenovo devicesWarranty lookup. Sends the device serial number.
api.getac.us$CollectWarranty, Getac devicesWarranty lookup. Sends the device serial number.
PathWhenContents
C:\Windows\Logs\Enhanced_Intune_Inventory_<timestamp>.logAlwaysCMTrace-format run log. Includes the computer name, signed-in user, counts, and upload results. Older copies are deleted at the start of each run.
C:\Windows\Logs\Inventory_Script_<timestamp>.log$Transcribe is $trueFull PowerShell transcript. Older copies are deleted at the start of each run.
C:\Windows\Warranty_<serial>.json$CollectWarrantyCached warranty result.
C:\Windows\Temp\HPWarranty_Raw_<serial>.json$CollectWarranty, HP devicesRaw HP API response for troubleshooting.

To inspect exactly what a device sent, decode the chunk columns in the Log Analytics Logs blade. This example decodes the most recent device inventory record for one computer:

PowerStacksDeviceInventory_CL
| where ComputerName_s == "PC-NAME"
| top 1 by TimeGenerated desc
| extend Encoded = strcat(DeviceDetails1_s, DeviceDetails2_s, DeviceDetails3_s, DeviceDetails4_s, DeviceDetails5_s,
DeviceDetails6_s, DeviceDetails7_s, DeviceDetails8_s, DeviceDetails9_s, DeviceDetails10_s)
| extend Inventory = parse_json(gzip_decompress_from_base64_string(Encoded))
| project TimeGenerated, ComputerName_s, ManagedDeviceID_g, Inventory

Replace the table and column names to decode application inventory (PowerStacksAppInventory_CL, InstalledApps1_s through InstalledApps10_s) or driver inventory (PowerStacksDriverInventory_CL, ListedDrivers1_s through ListedDrivers10_s).

The macOS script collects a smaller set: device hardware and installed applications. It doesn’t collect drivers, Microsoft 365 release data, or warranty data. See the macOS data reference.