Rob van der Woude's Scripting Pages

A new, experimental PowerShell class:

Computer

The idea has been popping up in my mind every now and then: a PowerShell class that would hold "all" available hardware information on a computer.
This is the first version, still highly experimental, betaish.
It will work for the local computer only; future versions will allow gathering info on remote computers as well.
This class has been tested on my own computers only, in PowerShell 5.1 and 7.2.

The information is gathered through WMI, no surprise there.
Gathering the information roughly takes 2 seconds on my fastest computer (or double that time in PowerShell ISE).
I tried a multi-threaded approach too, expecting a gain in performance, but that version took about 8 seconds to gather the requested information, so for now I will concentrate on the single-threaded version.

Usage

In a PowerShell session, run the script containing the class' source code once.

Next, to gather information, run the following command:

$mycomputer = [Computer]:New( )

Get a quick overview of the gathered information:

$mycomputer

Or view more details, e.g. for the first network adapter:

$mycomputer.NIC[0] | Format-List

The help text is always available, just type:

[Computer]::Help

Source Code

class Computer
{
	static [string]$Version = '1.00'
 
	static [string]$Copyrights = 'Rob van der Woude'
 
	static [string]$ProductPage = 'https://www.robvanderwoude.com/powershellcomputerclass.php'
 
	static [string]$Help = @"
 
Computer class, Version {0}
Make basic hardware infomation available in a class
 
Copyrights {1} {2}
{3}
 
 
How to use:
===========
 
Create an instance of the Computer class using the following command:
 
`$computer = [Computer]::New( )
 
After gathering hardware information for a couple of seconds, `$computer will have the information available through its properties and methods:
 
---------        ---------        -------------------------------    ----------
Property:        DataType:        Information on this computer's:    WMI class:
---------        ---------        -------------------------------    ----------
Name             System.String    computer name
IPAddress        System.String    local IP address
BIOS             System.Object    BIOS                               root/CIMV2/Win32_BIOS
CDROM            System.Object    CD-ROM drive(s)                    root/CIMV2/Win32_CDROMDrive
CPU              System.Object    processor(s)                       root/CIMV2/Win32_Processor
HDD              System.Object    harddisk(s)                        root/Microsoft/Windows/Storage/MSFT_PhysicalDisk
Keyboard         System.Object    keyboard(s)                        root/CIMV2/Win32_Keyboard
MainBoard        System.Object    main board                         root/CIMV2/Win32_BaseBoard
Memory           System.Object    memory                             root/CIMV2/Win32_PhysicalMemory
Monitor          System.Object    monitor(s)                         root/WMI/WmiMonitorID
Mouse            System.Object    mouse (or mice)                    root/CIMV2/Win32_PointingDevice
NIC              System.Object    physical network adapter(s)        root/CIMV2/Win32_NetworkAdapter
Printers         System.Object    physical local printer(s)          root/CIMV2/Win32_Printer
Slots            System.Object    system slots                       root/CIMV2/Win32_SystemSlot
Sound            System.Object    sound card(s)                      root/CIMV2/Win32_SoundDevice
USB              System.Object    USB controller(s)                  root/CIMV2/Win32_USBController
Video            System.Object    video card(s)                      root/CIMV2/Win32_VideoController
Windows          System.Object    Windows version                    root/CIMV2/Win32_OperatingSystem
WinSat           System.Object    WinSat system scores               root/CIMV2/Win32_WinSAT
 
---------        ---------        ----------                         ----------
Property:        DataType:        Number of:                         WMI class:
---------        ---------        ----------                         ----------
_AGP             System.Int32     AGP slots                          root/CIMV2/Win32_SystemSlot
_AGP2X           System.Int32     AGP2X slots                        root/CIMV2/Win32_SystemSlot
_AGP4X           System.Int32     AGP4X slots                        root/CIMV2/Win32_SystemSlot
_AGP8X           System.Int32     AGP8X slots                        root/CIMV2/Win32_SystemSlot
_Cardbus         System.Int32     Cardbus slots                      root/CIMV2/Win32_SystemSlot
_CDROMs          System.Int32     CD-ROM drives                      root/CIMV2/Win32_CDROMDrive
_COMPorts        System.Int32     serial ports                       root/CIMV2/Win32_SerialPort
_EISA            System.Int32     EISA slots                         root/CIMV2/Win32_SystemSlot
_HDDs            System.Int32     harddisk drives                    root/Microsoft/Windows/Storage/MSFT_PhysicalDisk
_ISA             System.Int32     ISA slots                          root/CIMV2/Win32_SystemSlot
_LPTPorts        System.Int32     parallel ports                     root/CIMV2/Win32_ParallelPort
_MemoryGB        System.Int32     GigaBytes of memory                root/CIMV2/Win32_PhysicalMemory
_MemoryModules   System.Int32     memory modules                     root/CIMV2/Win32_PhysicalMemory
_MemorySockets   System.Int32     memory sockets                     root/CIMV2/Win32_PhysicalMemoryArray
_Monitors        System.Int32     monitors                           root/WMI/WmiMonitorID
_PCI             System.Int32     PCI slots                          root/CIMV2/Win32_SystemSlot
_PCIE            System.Int32     PCI-E slots                        root/CIMV2/Win32_SystemSlot
_PCIX            System.Int32     PCI-X slots                        root/CIMV2/Win32_SystemSlot
_PCMCIA          System.Int32     PCMCIA slots                       root/CIMV2/Win32_SystemSlot
_USB2            System.Int32     USB controllers (except USB 3)     root/CIMV2/Win32_USBController
_USB3            System.Int32     USB 3 controllers                  root/CIMV2/Win32_USBController
_VESA            System.Int32     VESA slots                         root/CIMV2/Win32_SystemSlot
 
 
Static Members:
===============
 
-----------------------           ------------                       ------
Properties and Methods:           Description:                       Value:
-----------------------           ------------                       ------
[Computer]::Version               This class' version                {0}
[Computer]::Copyrights            Author's name                      {2}
[Computer]::ProductPage           This class' webpage                {3}
[Computer]::Help                  This help text
[Computer]::OpenProductPage( )    Open this class' webpage
[Computer]::New( )                Create new instance of this class
 
"@ -f [Computer]::Version, [char]0x00A9, [Computer]::Copyrights, [Computer]::ProductPage
 
	static [void]OpenProductPage( )
	{
		Start-Process -FilePath $( [Computer]::ProductPage )
	}
 
	[string]$Name = $Env:ComputerName
 
	[string]$IPAddress = $( [System.Net.Dns]::Resolve( $Env:ComputerName ).AddressList.IPAddressToString )
 
	[object]$BIOS
 
	[object]$CDROM
 
	[object]$CPU
 
	[object]$HDD
 
	[object]$Keyboard
 
	[object]$MainBoard
 
	[object]$Memory
 
	[object]$Monitor
 
	[object]$Mouse
 
	[object]$NIC
 
	[object]$Printers
 
	[object]$Slots
 
	[object]$Sound
 
	[object]$USB
 
	[object]$Video
 
	[object]$Windows
 
	[object]$WinSat
 
	[int]$_AGP
 
	[int]$_AGP2X
 
	[int]$_AGP4X
 
	[int]$_AGP8X
 
	[int]$_Cardbus
 
	[int]$_CDROMs
 
	[int]$_COMPorts
 
	[int]$_EISA
 
	[int]$_HDDs
 
	[int]$_ISA
 
	[int]$_LPTPorts
 
	[int]$_MemoryGB
 
	[int]$_MemoryModules
 
	[int]$_MemorySockets
 
	[int]$_Monitors
 
	[int]$_PCI
 
	[int]$_PCIE
 
	[int]$_PCIX
 
	[int]$_PCMCIA
 
	[int]$_USB2
 
	[int]$_USB3
 
	[int]$_VESA
 
	Computer( )
	{
		$this.BIOS           = $( Get-CimInstance -ClassName Win32_BIOS )
		$this.CDROM          = $( Get-CimInstance -ClassName Win32_CDROMDrive | Where-Object { $_.Name -notmatch 'virtual' } )
		$this.CPU            = $( Get-CimInstance -ClassName Win32_Processor )
		$this.HDD            = $( Get-CimInstance -ClassName MSFT_PhysicalDisk -Namespace root/Microsoft/Windows/Storage )
		$this.Keyboard       = $( Get-CimInstance -ClassName Win32_Keyboard )
		$this.MainBoard      = $( Get-CimInstance -ClassName Win32_BaseBoard )
		$this.Memory         = $( Get-CimInstance -ClassName Win32_PhysicalMemory )
		$this.Monitor        = $( Get-CimInstance -ClassName WmiMonitorID -Namespace root/WMI )
		$this.Mouse          = $( Get-CimInstance -Classname Win32_PointingDevice )
		$this.NIC            = $( Get-CimInstance -ClassName Win32_NetworkAdapter | Where-Object { $_.Speed -gt 0 } ) # physical adapters only
		$this.Printers       = $( Get-CimInstance -ClassName Win32_Printer        | Where-Object { $_.PrintProcessor -ne 'winprint' -and $_.Local } ) # physical local printers only
		$this.Slots          = $( Get-CimInstance -ClassName Win32_SystemSlot )
		$this.Sound          = $( Get-CimInstance -ClassName Win32_SoundDevice    | Where-Object { $_.Manufacturer -ne 'Microsoft' } ) # physical soundcards only
		$this.USB            = $( Get-CimInstance -ClassName Win32_USBController )
		$this.Video          = $( Get-CimInstance -ClassName Win32_VideoController )
		$this.Windows        = $( Get-CimInstance -ClassName Win32_OperatingSystem )
		$this.WinSat         = $( Get-CimInstance -ClassName Win32_WinSAT -Filter "TimeTaken='MostRecentAssessment'" )
		$this._AGP           = $( $this.Slots   | Where-Object { $_.ConnectorType -eq 73 } | Measure-Object ).Count
		$this._AGP2X         = $( $this.Slots   | Where-Object { $_.ConnectorType -eq 81 } | Measure-Object ).Count
		$this._AGP4X         = $( $this.Slots   | Where-Object { $_.ConnectorType -eq 82 } | Measure-Object ).Count
		$this._AGP8X         = $( $this.Slots   | Where-Object { $_.ConnectorType -eq 99 } | Measure-Object ).Count
		$this._Cardbus       = $( $this.Slots   | Where-Object { $_.ConnectorType -eq 52 } | Measure-Object ).Count
		$this._CDROMs        = $( $this.CDROM   | Measure-Object ).Count
		$this._COMPorts      = $( Get-CimInstance -ClassName Win32_SerialPort | Measure-Object ).Count
		$this._EISA          = $( $this.Slots   | Where-Object { $_.ConnectorType -eq 45 } | Measure-Object ).Count
		$this._HDDs          = $( $this.HDD     | Measure-Object ).Count
		$this._ISA           = $( $this.Slots   | Where-Object { $_.ConnectorType -eq 44 } | Measure-Object ).Count
		$this._LPTPorts      = $( Get-CimInstance -ClassName Win32_ParallelPort | Measure-Object ).Count
		$_Memory = 0
		$this.Memory.Capacity | ForEach-Object { $_Memory += $_ }
		$this._MemoryGB      = $( $_Memory / 1GB )
		$this._MemoryModules = $( $this.Memory  | Measure-Object ).Count
		$this._MemorySockets = $( Get-CimInstance -ClassName Win32_PhysicalMemoryArray ).MemoryDevices
		$this._Monitors      = $( $this.Monitor | Measure-Object ).Count
		$this._PCMCIA        = $( $this.Slots   | Where-Object { $_.ConnectorType -gt 46 -and $_.ConnectorType -lt 51 } | Measure-Object ).Count
		$this._PCI           = $( $this.Slots   | Where-Object { $_.ConnectorType -eq 43 -or $_.ConnectorType -eq 80 } | Measure-Object ).Count
		$this._PCIE          = $( $this.Slots   | Where-Object { $_.ConnectorType -eq 100 } | Measure-Object ).Count
		$this._PCIX          = $( $this.Slots   | Where-Object { $_.ConnectorType -eq 88 } | Measure-Object ).Count
		$this._USB3          = $( $this.USB     | Where-Object { $_.Name -match 'USB ?3' } | Measure-Object ).Count # not very reliable, as this relies on the description
		$this._USB2          = $( $this.USB     | Measure-Object ).Count - $this._USB3 # total number of USB controllers - number of USB 3 controllers
		$this._VESA          = $( $this.Slots   | Where-Object { $_.ConnectorType -eq 46 } | Measure-Object ).Count
	}
}
 

page last uploaded: 2021-12-20, 19:42