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:
1function Get-WmiHelpLocation
2{
3param ($WmiClassName="Win32_BIOS")
4$Connected = [Activator]::CreateInstance([Type]::GetTypeFromCLSID([Guid]'{DCB00C01-570F-4A9B-8D69-199FDBA5723B}')).IsConnectedToInternet
5if ($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
11Start-Process $url
12$url
13}
14else
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:
1function Get-NetworkConfig {
2Get-WmiObject Win32_NetworkAdapter -Filter "NetConnectionStatus=2" |
3ForEach-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:
13Get-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.