Hardware Inventory Issue: Top Level group not found.
If you've spent any time with Configuration Manager Hardware Inventory, you know that it can be a little bit finicky and prone to failure if not configured correctly. I'm going to describe a fix that I implemented for a customer recently where the Inventory data loader (located at <ConfigMgr Installation Directory\Logs\dataldr.log) reports the following error:
CMachineSource::InsertMachine - Top Level group not found. All MIFs require a group that is the same name as the architecture.
And the MIF files from clients will be moved to <ConfigMgr Installation Directory>\inboxes\auth\dataldr.box\BADMIFS\NonExistentRow
Steve Rachui has a great and very in-depth blog article located here:
https://blogs.msdn.com/b/steverac/archive/2010/11/22/the-case-of-the-mif-and-wmi-repository.aspx
In every case I have discovered, the only way to recover from this specific error is to re-install the SCCM client agent. The primary reason for this behavior is because the initial inventory MIF is supposed to create a row in GS_WORKSTATION_STATUS, and if you misconfigure hardware inventory, it could prevent the hardware inventory from adding this row, which will prevent all future inventory data coming from that client, and even triggering a "Full Hardware Inventory Sync" will not create the row.
Starting with Configuration Manager 2012 SP1, we added the /forceinstall parameter to ccmsetup.exe. Basically, what this parameter does is tell the existing ConfigMgr client agent to uninstall first and then install the client. This is very important, because simply installing the client over the top of the already installed ConfigMgr client will not actually fix the issue. Steve does a great job identifying why the client behaves that way, and he also suggests uninstalling/reinstalling the client.
Here is the process that I've created to successfully uninstall and reinstall the client agent, and I have verified on several hundred clients that this works. The best part is that you can deploy this through ConfigMgr packages and maintain the deployment history!
- Configure a new Package in SCCM. Software Library > Application Management > Packages
- Right click Packages and click Create Package
- Name the package "Reinstall ConfigMgr Client" and leave "This package contains source files" unchecked. Click Next
- Leave the 'Standard Program' radio box selected and click Next
- Name the program "Reinstall ConfigMgr Client" and change 'Run: to Hidden' and 'Program can run: to Whether or not a user is logged on' and click Next
- A good recommendation practice is to change the Program Requirements 'Estimated disk space' to 150MB just in case the client has run out of space on the OS drive
For reference here is the command line that I've used to successfully performed this task:
%WinDir%\ccmsetup\ccmsetup.exe /forceinstall /mp:<Management Point FQDN> SMSSITECODE=XYZ SMSMP=<Management Point FQDN> FSP=<Fallback Status Point FQDN> DNSSUFFIX=<Domain DNS Suffix> SMSCONFIGSOURCE=P
Once you have created this package, you should double check that "Source content" is still unchecked. Right click the 'Reinstall ConfigMgr Client' package and click the 'Data Source' tab. At the top uncheck the 'This package contains source files'. I'm not sure why this checkbox misbehaves, but I've seen it not respect what you've chosen in the Create Package wizard.
Deploy this package to the clients that need their hardware inventory remediated. If you're going to do this on hundreds of clients, I would recommend phasing the deployment to 10% chunks of total clients to be remediated so as to prevent backlogging.
From this point, the initial hardware inventory will trigger automatically.