Default hardware inventory covers the basics, but sooner or later you need data it doesn't collect — a vendor's BIOS class, a Windows security status, or values your scripts write to WMI. In this post I'll add a class through client settings, pilot it, and follow the data from InventoryAgent.log on the client to dataldr.log on the site server and into Resource Explorer.
Errors this guide fixes
0x80041010InventoryAgent.log0x8004100EInventoryAgent.log
How it works#
Hardware inventory in Configuration Manager (still widely called SCCM or ConfigMgr) reads WMI on each client according to its inventory policy, which has two parts:
- Reporting classes — which WMI classes and properties to collect, managed in client settings under Hardware Inventory › Set Classes.
- Data classes —
Configuration.mofinInboxes\clifiles.src\hinv\on the top-level site server defines extra data classes (registry-based ones, for example) and the providers that read them. Clients receive it with policy and compile it automatically.
After an inventory cycle, data flows from the client (InventoryAgent.log) through the management point (MP_Hinv.log) to the site server's data loader (dataldr.log) and into the database, where each class gets a current view (v_GS_...) and a history view (v_HS_...).
| Method | Use it when | Where |
|---|---|---|
| Enable/disable | The class is already listed | Default or custom device settings |
| Add | The class exists in client WMI but isn't listed | Default Client Settings, top-level site only |
| Extend | The data isn't in WMI yet | Configuration.mof, then Add |
| Import/export | Moving definitions from lab to production | Schema imports: Default Client Settings only |
Note: If a device receives hardware inventory settings from several client settings objects, the class selections are merged — clearing a class in a higher-priority custom setting does not stop collection. To collect a class on only some devices, clear it in Default Client Settings and enable it in a custom setting deployed to them.
Prerequisites#
- A console connected to the top-level site (CAS or standalone primary) and permission to modify Default Client Settings.
- A reference device where the class exists, and WMI access to it.
- A pilot collection with its own custom device client settings.
Step-by-step#
1. Confirm the class on a reference device#
Check the namespace, the data and the key property. My example is Win32_DeviceGuard, which reports virtualization-based security and Credential Guard status:
$ns = 'root\Microsoft\Windows\DeviceGuard'
Get-CimInstance -Namespace $ns -ClassName Win32_DeviceGuard
# Key properties (if nothing is returned, you'll choose a key when adding the class)
(Get-CimClass -Namespace $ns -ClassName Win32_DeviceGuard).CimClassProperties |
Where-Object { $_.Qualifiers.Name -contains 'key' } | Select-Object NameAlready listed under Search for inventory classes in Set Classes? Just select it and skip to step 4.
2. Add the class in Default Client Settings#
- Go to Administration › Client Settings, open Default Client Settings and select Hardware Inventory › Set Classes.
- Choose Add, then Connect. Enter the reference computer and namespace (select Recursive only if you need classes below it) and credentials if the computer isn't local.
- Select the class and choose Edit. Set a Display name (shown in Resource Explorer), units, and a key property — without a key, only the latest of several instances is stored.
- If a non-key string can exceed 255 characters, increase its Length now; that's only possible on newly added classes.
- To pilot, clear the new class in Default Client Settings and enable it in your pilot custom settings.
The site then updates client policy; dataldr.log on the site server records the change.
3. Data that isn't in WMI: Configuration.mof#
For registry values and other non-WMI data, define a data class in Configuration.mof on the top-level site. Back it up first and edit only the Added extensions section at the end — site updates overwrite everything above it (the site keeps a copy of your customised file in data\hinvarchive\). Check syntax on a copy with mofcomp -check. Then watch dataldr.log pick up the change, refresh policy on a client so it compiles the class, and add it from that client as in step 2.
4. Push the policy and inventory a pilot device#
Refresh machine policy, wait a few minutes, then run the hardware inventory cycle; deleting the inventory action status first forces a full report instead of a delta:
# Machine policy retrieval, then evaluation
'{00000000-0000-0000-0000-000000000021}', '{00000000-0000-0000-0000-000000000022}' | ForEach-Object {
Invoke-CimMethod -Namespace root\ccm -ClassName SMS_Client -MethodName TriggerSchedule -Arguments @{ sScheduleID = $_ }
}
# Optional: force a full report
Get-CimInstance -Namespace root\ccm\invagt -ClassName InventoryActionStatus `
-Filter "InventoryActionID='{00000000-0000-0000-0000-000000000001}'" | Remove-CimInstance
# Hardware inventory cycle
Invoke-CimMethod -Namespace root\ccm -ClassName SMS_Client -MethodName TriggerSchedule `
-Arguments @{ sScheduleID = '{00000000-0000-0000-0000-000000000001}' }For a collection, use Client Notification › Download Computer Policy, then Collect Hardware Inventory.
Verify#
Follow the data end to end#
- Client — in
C:\Windows\CCM\Logs\InventoryAgent.log, find the hardware action, a collection query for your class and a successful send to the management point (trimmed):TextInventory: Action=Hardware, ReportType=Full, ... Collection: Namespace = \\.\root\Microsoft\Windows\DeviceGuard; Query = SELECT ... FROM Win32_DeviceGuard; Timeout = 600 secs. Inventory: Successfully sent report. Destination:mp:MP_HinvEndpoint, ... - Management point —
MP_Hinv.logshows the report received, converted and passed to the site server. - Site server —
dataldr.logprocesses that machine's file without errors. Files it can't process move to aBADMIFSfolder under thedataldr.boxinbox. - Console — right-click the device, choose Start › Resource Explorer and expand Hardware: your display name appears with data, and Workstation Status shows a fresh last hardware scan.
If the class doesn't arrive#
| Symptom | Likely cause | What to do |
|---|---|---|
No query for the class in InventoryAgent.log | No new policy yet, or no settings it receives enable the class | Refresh policy; check the device is in your custom settings' collection |
| The query is logged with a WMI error | Class or namespace missing (0x80041010 invalid class, 0x8004100E invalid namespace), or WMI unhealthy | Run the step 1 commands there; vendor classes often exist only on some models |
| Report sent, nothing in Resource Explorer | Processing problem at the MP or site server | Read MP_Hinv.log, then dataldr.log; check BADMIFS |
| Only one row per device | No key property defined | Set a key property in the class qualifiers |
Tips & gotchas#
- Collect only what you need. Every class and property enlarges the report each client sends and the site processes.
- Never inventory
Win32_Product. Querying it makes Windows Installer run a consistency check on every MSI product; the built-in installed software classes already cover software. - Review classes around site updates. An update can return some classes to their default state, so export your selection (Set Classes › Export) beforehand and compare afterwards.
- Static data doesn't need WMI. For asset tags and similar values, custom device properties set through the administration service (version 2107 and later) are simpler than a new class.
- Collections on inventory data behave differently with incremental updates — see collections that perform.

