WMI vs. CIM

Die Ausarbeitungen zu den WMI und CIM Fähigkeiten der PowerShell finden sich hier im Basics-Abschnitt meiner Ausarbeitung.

Hinweis

In den Seminaren folgen die Übungen rund um diese Techniken an späterer Stelle. Ich orientiere mich hier an meinen Erfahrungen mit den PowerShell Seminaren und den zur Verfügung gestellten Zeitrahmen.

Cmdlets:

  • Get-WmiObject und

  • Get-CimInstance

die klassische WMI (Windows Management Interface) und die „neuere“ Variante CIM (Common Information Model) bieten Zugriff auf Hunderte von Klassen mit Zugriff auf Systeminformationen und -Techniken

Get-WmiObject -Class Win32_Bios -Computername DC01

(also gleich mit eingebautem „Fernzugriff“; Übung: die anderen Cmdlets mit -ComputerName ?)

Auflistung aller WMI-Klassen mit

Get-WmiObject -List

Bei CIM nutzt man

Get-CimClass

Übungen zu den „Super-Cmdlets“ der PowerShell zur Systemanalyse:

Aufrufe und Tests zu diversen Klassen für WMI und CIM

Hinweis: bei Get-CimInstance existiert ein Parameter -Query mit SQL-Abfragen wie „SELECT * from Win32_Process WHERE name Like ‚p%‘“

Vergleich WMI vs. CIM: Blog Technet - Scripting Guy

Introduction to CIM-Cmdlets: Blog Technet: Intro to CIM

WMI und CIM Beispiele / Übungen

Suche nach WMI / CIM class name

Get-WmiObject -Class *Share* -List
Get-CimClass -ClassName *Share*

Tiefere Suche - WMI / CIM class name

Get-WmiObject -Class Win32_Share
(Get-CimClass -ClassName Win32_Share).CimClassMethods

auch mit Select-String

Get-WmiObject -List | Select-String Print

sinnvolle Class suchen: rund um Disk mit mehr als 5 Properties und nichts mit Perf

$Keyword = ‘disk’
Get-WmiObject -Class “Win32_*$Keyword*” -List |
Where-Object { $_.Properties.Count -gt 5 -and $_.Name -notlike ‘*_Perf*’ }

tatsächliche Ergebnisse dann mit

Get-WmiObject -Class Win32_DiskPartition

besonders nützliche Classes mit Hilfe Developer-Infos finden:

Select-Xml $env:windir\System32\WindowsPowerShell\v1.0\types.ps1xml -XPath /Types/Type/Name |
ForEach-Object { $_.Node.InnerXML } | Where-Object { $_ -like ‘*#root*’ } |
ForEach-Object { $_.Split(‘[\/]’)[-1] } | Sort-Object -Unique

einfach eine Klasse herauspicken

Get-WmiObject -Class Win32_BIOS

WMI Hilfen mit eigener Funktion finden lassen:

function Get-WmiHelpLocation
 1 function Get-WmiHelpLocation
 2 {
 3 param ($WmiClassName="Win32_BIOS")
 4 $Connected = [Activator]::CreateInstance([Type]::GetTypeFromCLSID([Guid]'{DCB00C01-570F-4A9B-8D69-199FDBA5723B}')).IsConnectedToInternet
 5 if ($Connected)
 6 {
 7 $uri = "http://www.bing.com/search?q={0}+site:msdn.microsoft.com" -f $WmiClassName
 8 # in  altem Skriptbeispiel stand bei Where-Object href -like noch http - dann $uri leer!
 9 $url = (Invoke-WebRequest -Uri $uri -UseBasicParsing).Links | Where-Object href -like "https://msdn.microsoft.com*" | 
10     Select-Object -ExpandProperty href -First 1
11 Start-Process $url
12 $url
13 }
14 else
15 {
16     Write-Warning "No Internet Connection Available."
17 }
18 }

Lizenz Status:

Get-WmiObject SoftwareLicensingService

Alle Namespaces auflisten:

Get-WmiObject -Query “Select * from __Namespace” -Namespace Root | Select-Object -ExpandProperty Name

Infos zu bestimmten Namespace:

Get-WmiObject -Namespace root\SecurityCenter2 -List
Get-WmiObject -Namespace root\SecurityCenter2 -Class AntivirusProduct

Aktuellen Energiemodus evaluieren:

$PowerPlan = (Get-WmiObject -Namespace root\cimv2\power -Class Win32_PowerPlan -Filter ‘isActive=True’).ElementName
“Current power plan: $PowerPlan”

Service Start Modi - Anmerkung: Get-Service kann keinen StartMode!

Get-WmiObject Win32_Service | Select-Object Name, StartMode

Ein spezieller Service-Startmodus:

([wmi]'Win32_Service.Name="Spooler"').StartMode

Eingeloggte User:

$ComputerName = ‘localhost’
Get-WmiObject Win32_ComputerSystem -ComputerName $ComputerName | Select-Object -ExpandProperty UserName

Netzwerkanalyse:

function Get-NetworkConfig
 1 function Get-NetworkConfig {
 2 Get-WmiObject Win32_NetworkAdapter -Filter "NetConnectionStatus=2" |
 3 ForEach-Object {
 4    $result = 1 | Select-Object Name, IP, MAC
 5    $result.Name = $_.Name
 6    $result.MAC = $_.MacAddress
 7    $config = $_.GetRelated("Win32_NetworkAdapterConfiguration")
 8    $result.IP = $config | Select-Object -ExpandProperty IPAddress
 9    $result
10    }
11 }
12 # Aufruf:
13 Get-NetworkConfig

Lokale Gruppen:

Get-WmiObject Win32_Group -Filter "domain='$env:computername'" | Select-Object Name,SID

Uptime OS:

$os = Get-WmiObject -Class Win32_OperatingSystem
$boottime = [System.Management.ManagementDateTimeConverter]::ToDateTime($os.LastBootupTime)
$timedifference = New-TimeSpan -Start $boottime
$days = $timedifference.TotalDays
'Das System läuft seit {0:0.000} Tagen.' -f $days

Freier Speicher auf Disks

Get-WmiObject Win32_LogicalDisk |
    ForEach-Object { ‘Disk {0} hat {1,20:0.00} MB Platz frei’ -f $_.Caption, ($_.FreeSpace / 1MB)
    }

Mehr Beispielcode über Unterlagen (PDFs) verfügbar.