WMI
WMI can be used to query just about every aspect about a computer the WMI queries that I have included just touch the surface.
Win32_Bios
Get-WmiObject -Class Win32_Bios
SMBIOSBIOSVersion : JYGLKCPX.86A.0049.2019.0401.1038
Manufacturer : Intel Corp.
Name : JYGLKCPX.86A.0049.2019.0401.1038
SerialNumber : G6JY810909AA5
Version : INTEL - 1072009
This can be used to find a computers serial number the Manufacturer and the current bios version.
It is also a good way of identifiying virtual machines and avoiding climbing under the desk to find the serial number.
Win32_NetworkAdapterConfiguration
Get-WmiObject -Class Win32_NetworkAdapterConfiguration
DHCPEnabled : True
IPAddress : {192.168.1.2, fe80::2dd9:6465:b801:bfd3, fdc8:94bb:2cfa:f300:f579:9caf:1bc3:db16,
fdc8:94bb:2cfa:f300:f48d:265f:5dbc:cb9a...}
DefaultIPGateway : {192.168.1.1}
DNSDomain : home
ServiceName : VMSNPXYMP
Description : Hyper-V Virtual Ethernet Adapter #2
Index : 17
Win32_ComputerSystem
Get-WmiObject -Class Win32_ComputerSystem
Domain : WORKGROUP
Manufacturer : Intel Corporation
Model : NUC7CJYH
Name : W10NUC
PrimaryOwnerName : jblow@hotmail.com
TotalPhysicalMemory : 16838123520
Also (Get-WmiObject -Class win32_computersystem).username can be used to find the currently logged on user
Win32_LogicalDisk
Get-WmiObject -Class Win32_LogicalDisk
DeviceID : C:
DriveType : 3
ProviderName :
FreeSpace : 283601723392
Size : 499461910528
VolumeName :
DeviceID : P:
DriveType : 4
ProviderName : \\192.168.1.9\c$\apache\htdocs
FreeSpace : 42169647104
Size : 63846739968
VolumeName :
Win32_OperatingSystem
Get-WmiObject -Class Win32_OperatingSystem
SystemDirectory : C:\WINDOWS\system32
Organization :
BuildNumber : 18363
RegisteredUser : jblow@hotmail.com
SerialNumber :
Version : 10.0.18363
There is more information here if you use |fl *
Win32_Printer
Get-WmiObject -Class Win32_Printer
Location : http://192.168.1.8:3911/
Name : NPI1B975A (HP LaserJet Pro M12w)
PrinterState : 128
PrinterStatus : 1
ShareName :
SystemName : W10NUC
Location :
Name : Microsoft XPS Document Writer
PrinterState : 0
PrinterStatus : 3
ShareName :
SystemName : W10NUC
Location :
Name : Microsoft Print to PDF
PrinterState : 0
PrinterStatus : 3
ShareName :
SystemName : W10NUC
Location :
Name : Fax
PrinterState : 0
PrinterStatus : 3
ShareName :
SystemName : W10NUC
Win32_Processor
Get-WmiObject -Class Win32_Processor
Caption : Intel64 Family 6 Model 60 Stepping 3
DeviceID : CPU0
Manufacturer : GenuineIntel
MaxClockSpeed : 3001
Name : Intel(R) Core(TM) i5-4430 CPU @ 3.00GHz
SocketDesignation : SOCKET 0
win32_Product
Get-WmiObject -Class win32_Product
IdentifyingNumber : {90160000-008C-0000-1000-0000000FF1CE}
Name : Office 16 Click-to-Run Extensibility Component
Vendor : Microsoft Corporation
Version : 16.0.12730.20250
Caption : Office 16 Click-to-Run Extensibility Component
IdentifyingNumber : {90160000-008C-0409-1000-0000000FF1CE}
Name : Office 16 Click-to-Run Localization Component
Vendor : Microsoft Corporation
Version : 16.0.12730.20250
Caption : Office 16 Click-to-Run Localization Component
This command finds most of the software installed on a machine. It does take a while to run.
Win32_TimeZone
Get-WmiObject -Class Win32_TimeZone
Bias SettingID Caption
---- --------- -------
600 (UTC+10:00) Brisbane
Win32_UTCTime
Get-WmiObject -Class Win32_UTCTime
__GENUS : 2
__CLASS : Win32_UTCTime
__SUPERCLASS : Win32_CurrentTime
__DYNASTY : Win32_CurrentTime
__RELPATH : Win32_UTCTime=@
__PROPERTY_COUNT : 10
__DERIVATION : {Win32_CurrentTime}
__SERVER : W10NUC
__NAMESPACE : root\cimv2
__PATH : \\W10NUC\root\cimv2:Win32_UTCTime=@
Day : 25
DayOfWeek : 1
Hour : 1
Milliseconds :
Minute : 33
Month : 5
Quarter : 2
Second : 37
WeekInMonth : 5
Year : 2020
PSComputerName : W10NUC
win32_OptionalFeature
This gives information on windows features useful when you have to query 2008 servers where Get-WindowsFeature will not work.
GET-WmiObject -Class win32_optionalfeature
__GENUS : 2
__CLASS : Win32_OptionalFeature
__SUPERCLASS : CIM_LogicalElement
__DYNASTY : CIM_ManagedSystemElement
__RELPATH : Win32_OptionalFeature.Name="Microsoft-Hyper-V-Management-Clients"
__PROPERTY_COUNT : 6
__DERIVATION : {CIM_LogicalElement, CIM_ManagedSystemElement}
__SERVER : W10NUC
__NAMESPACE : root\cimv2
__PATH : \\W10NUC\root\cimv2:Win32_OptionalFeature.Name="Microsoft-Hyper-V-Management-Clients"
Caption : Hyper-V GUI Management Tools
Description :
InstallDate :
InstallState : 1
Name : Microsoft-Hyper-V-Management-Clients
Status :
PSComputerName : W10NUC
__GENUS : 2
__CLASS : Win32_OptionalFeature
__SUPERCLASS : CIM_LogicalElement
__DYNASTY : CIM_ManagedSystemElement
__RELPATH : Win32_OptionalFeature.Name="Windows-Defender-ApplicationGuard"
__PROPERTY_COUNT : 6
__DERIVATION : {CIM_LogicalElement, CIM_ManagedSystemElement}
__SERVER : W10NUC
__NAMESPACE : root\cimv2
__PATH : \\W10NUC\root\cimv2:Win32_OptionalFeature.Name="Windows-Defender-ApplicationGuard"
Caption : Windows Defender Application Guard
Description :
InstallDate :
InstallState : 2
Name : Windows-Defender-ApplicationGuard
Status :
PSComputerName : W10NUC
Uninstalling an Application using PowerShell and WMI
$MyApp = Get-WmiObject -Class Win32_Product | Where-Object{$_.Name -eq "Free Tools"}
$MyApp.Uninstall()
CIM
Cim is newer than wmi and has a slightly different syntax
To query BIOS as an example you would use:
Get-CimInstance -ClassName win32_bios
All of the commands for CIM are:
gcm -Noun cim*
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Get-CimAssociatedInstance 1.0.0.0 CimCmdlets
Cmdlet Get-CimClass 1.0.0.0 CimCmdlets
Cmdlet Get-CimInstance 1.0.0.0 CimCmdlets
Cmdlet Get-CimSession 1.0.0.0 CimCmdlets
Cmdlet Invoke-CimMethod 1.0.0.0 CimCmdlets
Cmdlet New-CimInstance 1.0.0.0 CimCmdlets
Cmdlet New-CimSession 1.0.0.0 CimCmdlets
Cmdlet New-CimSessionOption 1.0.0.0 CimCmdlets
Cmdlet Register-CimIndicationEvent 1.0.0.0 CimCmdlets
Cmdlet Remove-CimInstance 1.0.0.0 CimCmdlets
Cmdlet Remove-CimSession 1.0.0.0 CimCmdlets
Cmdlet Set-CimInstance 1.0.0.0 CimCmdlets
Filtering
filtering in wmi uses the WQL language
Here are the comparison operators for WQL = , > , < , <>, like ' '
Equals, greater than, less than, not equal to and like in single quotes
The % sign is the wild card not an * like powershell uses
An example looks like this:
gwmi win32_service -Filter "state <> 'running' and startmode = 'auto'"
You can also use SQL format with the -Query switch
Get-CimInstance -Query "SELECT * FROM Win32_service WHERE Startmode = 'auto' AND name LIKE '%update%' AND state <> 'Running'"
