WMI can retrieve a lot more object instances than you might think. If you submit a parent class, Get-WmiObject returns all instances of all derived classes. That's why a simple line like the following can get you all hardware-related instances:
PS> Get-WmiObject -Class CIM_PhysicalElement | Group-Object -Property __Class Count Name Group ----- ---- ----- 1 Win32_OnBoardDevice {\\DEMO5\root\cimv2:Win32_OnBoardDevice.Tag=... 1 Win32_PhysicalMemoryArray {\\DEMO5\root\cimv2:Win32_PhysicalMemoryArra... 3 Win32_PortConnector {\\DEMO5\root\cimv2:Win32_PortConnector.Tag=... 1 Win32_BaseBoard {\\DEMO5\root\cimv2:Win32_BaseBoard.Tag="Bas... 1 Win32_SystemSlot {\\DEMO5\root\cimv2:Win32_SystemSlot.Tag="Sy... 2 Win32_PhysicalMemory {\\DEMO5\root\cimv2:Win32_PhysicalMemory.Tag... 1 Win32_SystemEnclosure {\\DEMO5\root\cimv2:Win32_SystemEnclosure.Ta... 4 Win32_PhysicalMedia {\\DEMO5\root\cimv2:Win32_PhysicalMedia.Tag=...
You can turn this into a lookup tool. Here's how:
PS> $col1 = @{Name='Key' Expression={ ($_.__Class.ToString() -split '_')[-1] }} PS> $info = Get-WmiObject -Class CIM_PhysicalElement | Select-Object *, $col1 |
Group-Object -Property Key -AsHashTable -AsString
Use it like this:
PS> $info Name Value ---- ----- SystemEnclosure {@{Tag=System Enclosure 0 Status= Name=Syst... OnBoardDevice {@{Status= Description=HD-Audio; __GENUS=2 ... PhysicalMemory {@{__GENUS=2 __CLASS=Win32_PhysicalMemory; _... PhysicalMedia {@{__GENUS=2 __CLASS=Win32_PhysicalMedia; __... SystemSlot {@{Status=Unknown; SlotDesignation=PCI Expres... BaseBoard {@{Status= Name=Base Board; PoweredOn=True... PortConnector {@{Status= Name=Port Connector; ExternalRefe... PhysicalMemoryArray {@{Status= Name=Physical Memory Array; Repla... PS> $info.baseboard (...) PS> $info.OnboardDevice (...) PS> $info.PhysicalMemory (...)