It uses the CIM (Common Information Model) at first, as that is available since Powershell version 3 and is the recommended direction. Please see the following article on why "we" should use CIM instead of the WMI.
https://devblogs.microsoft.com/scripting/should-i-use-cim-or-wmi-with-windows-powershell/
# Specify the server name here
$server = "server1" # pull all the information $hardware = Get-CimInstance -ClassName Win32_ComputerSystem -ComputerName $server $OS = Get-CimInstance -ClassName Win32_OperatingSystem -ComputerName $server $CPU = Get-CimInstance -ClassName Win32_Processor -ComputerName $server $PhysicalMemory = Get-CimInstance -ClassName CIM_PhysicalMemory -ComputerName $server $Bios = Get-CimInstance -ClassName Win32_BIOS -ComputerName $server $total_memory = ($PhysicalMemory | measure-object -Property Capacity -sum).sum $total_memory_gb = $total_memory / 1024 / 1024 / 1024 # build custom array to get some key properties in a single row $server_summary = New-Object PSObject Add-Member -inputObject $server_summary -memberType NoteProperty -Name Manufacturer -value $hardware.Manufacturer Add-Member -inputObject $server_summary -memberType NoteProperty -Name Model -value $hardware.Model Add-Member -inputObject $server_summary -memberType NoteProperty -Name HypervisorPresent -value $hardware.HypervisorPresent Add-Member -inputObject $server_summary -memberType NoteProperty -Name Bios -value $Bios.Name Add-Member -inputObject $server_summary -memberType NoteProperty -Name OS -value $OS.Caption Add-Member -inputObject $server_summary -memberType NoteProperty -Name OSArchitecture -value $OS.OSArchitecture Add-Member -inputObject $server_summary -memberType NoteProperty -Name CPUs -value $CPU.count Add-Member -inputObject $server_summary -memberType NoteProperty -Name PhySicalMemory_GB -value $total_memory_gb Add-Member -inputObject $server_summary -memberType NoteProperty -Name OSVersionNumber -value $OS.Version Add-Member -inputObject $server_summary -memberType NoteProperty -Name ServicePackMajorVersion -value $OS.ServicePackMajorVersion Add-Member -inputObject $server_summary -memberType NoteProperty -Name ServicePackMinor -value $OS.ServicePackMinorVersion Add-Member -inputObject $server_summary -memberType NoteProperty -Name LastBootUpTime -value $OS.LastBootUpTime # Display the values # First, lets up the buffer size first so we can see the complete output on the screen $Host.UI.RawUI.BufferSize = New-Object Management.Automation.Host.Size (500, 3000) "summary" "=======" $server_summary | fl "" "Detailed Properties" "===================" "Hardware:" $hardware | ft -Property * "Bios:" $Bios | ft -Property * "Operating System:" $OS | ft -Property * "CPUs:" $CPU | ft -Property * "Physical Memory:" $PhysicalMemory | ft -property *
Caveat:
That worked on most servers but on some I ran into an error with the CIM.
So I tried the solution suggested by the error message, which is to run the winrm quickconfig on the remote computer. That threw message that the "WinRM service is already running on this machine", so maybe there is GPO, firewall or something else that is blocking it.
So I decided to go back to the good old faithful WMI for those servers. The powershell methods are still interchangeable between CIM and WMI so all it took was to do a global search/ replace for Get-CimInstance / Get-WmiObject.
# Specify the server name here
$server = "server1" # pull all the information $hardware = Get-WmiObject -ClassName Win32_ComputerSystem -ComputerName $server $OS = Get-WmiObject -ClassName Win32_OperatingSystem -ComputerName $server $CPU = Get-WmiObject -ClassName Win32_Processor -ComputerName $server $PhysicalMemory = Get-WmiObject -ClassName CIM_PhysicalMemory -ComputerName $server $Bios = Get-WmiObject -ClassName Win32_BIOS -ComputerName $server $total_memory = ($PhysicalMemory | measure-object -Property Capacity -sum).sum $total_memory_gb = $total_memory / 1024 / 1024 / 1024 # build custom array to get some key properties in a single row $server_summary = New-Object PSObject Add-Member -inputObject $server_summary -memberType NoteProperty -Name Manufacturer -value $hardware.Manufacturer Add-Member -inputObject $server_summary -memberType NoteProperty -Name Model -value $hardware.Model Add-Member -inputObject $server_summary -memberType NoteProperty -Name HypervisorPresent -value $hardware.HypervisorPresent Add-Member -inputObject $server_summary -memberType NoteProperty -Name Bios -value $Bios.Name Add-Member -inputObject $server_summary -memberType NoteProperty -Name OS -value $OS.Caption Add-Member -inputObject $server_summary -memberType NoteProperty -Name OSArchitecture -value $OS.OSArchitecture Add-Member -inputObject $server_summary -memberType NoteProperty -Name CPUs -value $CPU.count Add-Member -inputObject $server_summary -memberType NoteProperty -Name PhySicalMemory_GB -value $total_memory_gb Add-Member -inputObject $server_summary -memberType NoteProperty -Name OSVersionNumber -value $OS.Version Add-Member -inputObject $server_summary -memberType NoteProperty -Name ServicePackMajorVersion -value $OS.ServicePackMajorVersion Add-Member -inputObject $server_summary -memberType NoteProperty -Name ServicePackMinor -value $OS.ServicePackMinorVersion Add-Member -inputObject $server_summary -memberType NoteProperty -Name LastBootUpTime -value $OS.LastBootUpTime # Display the values # First, lets up the buffer size first so we can see the complete output on the screen $Host.UI.RawUI.BufferSize = New-Object Management.Automation.Host.Size (500, 3000) "summary" "=======" $server_summary | fl "" "Detailed Properties" "===================" "Hardware:" $hardware | ft -Property * "Bios:" $Bios | ft -Property * "Operating System:" $OS | ft -Property * "CPUs:" $CPU | ft -Property * "Physical Memory:" $PhysicalMemory | ft -property *
Simple enough? Nah... but I am sticking with the title!
Download both versions of this script from GitHub: