- Mit den CIM-Cmdlets von WMI und PowerShell können Sie lokale und Remote-Verwaltungsinformationen effizient abfragen und ändern.
- CimSessions mit WSMan oder DCOM ermöglichen einen sicheren und kompatiblen Zugriff auf moderne und ältere Netzwerkgeräte.
- Durch den Einsatz von erweiterten Funktionen, Modulen, Jobs und DSC wird PowerShell zu einer vollständigen Sprache für die Infrastrukturautomatisierung.
- PowerShell integriert lokale, Remote-, Azure- und Microsoft 365-Verwaltung in einer einzigen Umgebung und reduziert so wiederkehrende manuelle Aufgaben.

Wer Windows-Systeme administriert, kommt früher oder später mit PowerShell, WMI und fortgeschrittener Automatisierung in Berührung . Es reicht nicht, nur ein paar Befehle ausführen zu können: Bei der Verwaltung von Dutzenden oder Hunderten von Servern benötigt man einen soliden, strukturierten und sicheren Ansatz, um Informationen zu sammeln, Änderungen anzuwenden und Aufgaben zu wiederholen, ohne dabei den Überblick zu verlieren oder etwas zu beschädigen.
Im Folgenden zeigen wir Ihnen Schritt für Schritt, wie Sie WMI, CIM und PowerShell für die Remote-Kommunikation nutzen können, um alles von einfachen Abfragen bis hin zu komplexen Infrastrukturszenarien zu automatisieren. Wir werden außerdem sehen, wie all dies mit Modulen, Hintergrundaufgaben, Azure, Microsoft 365 und einigen erweiterten Funktionen zusammenwirkt, die den Arbeitsalltag von Systemadministratoren deutlich erleichtern.
PowerShell-Erweiterungen und ein Überblick über fortgeschrittene Automatisierung
Windows PowerShell hat sich seit seinen frühen Versionen stark weiterentwickelt , und ein großer Teil dieser Entwicklung erfolgte mit Windows Server 2012, wo die Remote-Kommunikation verbessert, die verfügbaren Cmdlets erweitert und Dinge wie Debugging, Hintergrundprozesse und eingeschränkte Endpunkte vereinfacht wurden, um die Sicherheit zu erhöhen.
Eine der Kernideen dieser Umgebung ist, dass Administratoren mithilfe erweiterter Funktionen, wiederverwendbarer Module und eines umfassenden Hilfesystems Cmdlet-ähnliche Verhaltensweisen ohne umfangreiche Programmierung erstellen können . Anstatt auf unterschiedliche grafische Tools angewiesen zu sein, können Sie somit ein zusammenhängendes Set von Skripten und Modulen erstellen, das Prozesse zur Verwaltung von Servern, Netzwerken, Active Directory, Azure oder Microsoft 365 automatisiert.
Im Bereich der fortgeschrittenen Automatisierung stechen auch Funktionen wie Jobs zur asynchronen Ausführung von Aufgaben, Workflows, konfigurationsbasierte Administration mit PowerShell DSC und Sicherheitsoptionen wie JEA (Just Enough Administration) oder PowerShell Web Access hervor, die eine detaillierte Kontrolle darüber ermöglichen, was jede Person tun kann und von wo aus.
Dieses gesamte Ökosystem passt besonders gut zu WMI und CIM, da die vom Betriebssystem bereitgestellten Verwaltungsinformationen (Hardware, Dienste, Prozesse , Netzwerkkonfiguration, installierte Software usw.) zu einer Reihe von Objekten werden, die Sie mit Hilfe von PowerShell-Befehlen, die für die Massenautomatisierung entwickelt wurden, abfragen, filtern und ändern können.
WMI und CIM: Schlüsselkonzepte und praktische Unterschiede
Windows Management Instrumentation ( WMI) ist eine PowerShell-unabhängige Technologie , die seit Jahren Bestandteil von Windows ist. Sie stellt ein Repository mit Verwaltungsinformationen über das Betriebssystem, die Hardware und viele Anwendungen bereit. Obwohl WMI nicht von PowerShell abhängig ist, nutzt PowerShell diese Technologie umfassend zur Automatisierung von Aufgaben.
Der natürliche Nachfolger von WMI im PowerShell-Ökosystem sind die CIM-Cmdlets (Common Information Model) , die mit PowerShell 3.0 eingeführt wurden. Diese Cmdlets sind im Modul CimCmdlets gruppiert und umfassen unter anderem Befehle wie Get-CimInstance, Get-CimClass, New-CimInstance, Invoke-CimMethod, Register-CimIndicationEvent, Set-CimInstance und Remove-CimInstance.
In älteren Versionen von Windows PowerShell, wie z. B. Windows 10 PowerShell 5.1 oder Windows 11 PowerShell, sind die klassischen WMI-Cmdlets (Get-WmiObject, Invoke-WmiMethod, Register-WmiEvent, Remove-WmiObject, Set-WmiInstance) noch vorhanden. Diese Cmdlets sind jedoch veraltet und in PowerShell 6 und späteren Versionen nicht mehr enthalten. Sie sind daher nur noch für die Wartung älterer Skripte oder die Überprüfung von altem Code relevant.
Wenn von „WMI-Abfragen mit CIM-Cmdlets“ die Rede ist, ist das kein Widerspruch: CIM-Cmdlets greifen weiterhin auf WMI-Informationen zu , verwenden dafür aber modernere Protokolle wie WSMan und eine konsistentere API. Für Neuentwicklungen sollten Sie sich daher auf CIM konzentrieren und WMI-Cmdlets nur dann in Betracht ziehen, wenn Sie ältere Skripte migrieren oder analysieren müssen.
Früher verwendeten viele Administratoren VBScript mit der WQL-Abfragesprache, um WMI abzufragen, beispielsweise durch eine Verbindung zum Namespace root\CIMV2 und Abfragen von Klassen wie Win32_BIOS. Dieselbe WQL-Abfrage kann heute mit Get-CimInstance wiederverwendet werden, indem der Parameter -Query übergeben wird. Dies vereinfacht den Übergang von VBScript zu PowerShell erheblich, ohne dass die Logik von Grund auf neu geschrieben werden muss.
Praktische Anwendung von Get-CimInstance und effiziente Abfragen
Für die tägliche Arbeit ist die einfachste Methode, WMI mit PowerShell abzufragen, die Verwendung von `Get-CimInstance` mit dem Parameter `-ClassName` anstelle vollständiger WQL-Abfragen. Um beispielsweise BIOS-Informationen abzurufen, können Sie `Get-CimInstance -ClassName Win32_BIOS` verwenden. Sie erhalten dann ein Objekt mit Eigenschaften wie Hersteller, Name, Seriennummer oder SMBIOSBIOSVersion.
Da in PowerShell alles ein Objekt ist, lässt sich sehr einfach filtern und nur das auswählen, was Sie benötigen . Wenn Sie nur an der Seriennummer interessiert sind, können Sie das Ergebnis an `Select-Object -Property SerialNumber` weiterleiten oder `Select-Object -ExpandProperty SerialNumber` verwenden, um anstelle eines Objekts mit einer Eigenschaft eine einfache Zeichenfolge auszugeben. Eine weitere gängige Möglichkeit ist die Verwendung der Punktnotation (`Get-CimInstance ...`).SerialNumber`), um direkt auf den Wert zuzugreifen.
Es ist wichtig zu wissen, dass WMI-Abfragen standardmäßig mehr Eigenschaften zurückgeben, als Sie tatsächlich benötigen . Auf einem lokalen Rechner ist das in der Regel unproblematisch, aber bei Abfragen vieler Remote-Rechner führt dies zu zusätzlicher Verarbeitungszeit und unnötigem Netzwerkverkehr. Hier kommt der Parameter `-Property` von `Get-CimInstance` ins Spiel, mit dem Sie die von der Quelle abgerufenen Eigenschaften einschränken können.
Durch die Angabe der Eigenschaft `-Property SerialNumber` beispielsweise reduzieren Sie die übertragene Datenmenge und beschleunigen so die Abfrage, insbesondere bei großen Datenmengen . Diese Herangehensweise, nur die benötigten Daten abzufragen, ist entscheidend für die Entwicklung von Inventarisierungs- oder Prüfskripten, die auf Dutzenden oder Hunderten von Rechnern ausgeführt werden.
Zusammenfassend bietet Get-CimInstance eine hervorragende Balance zwischen Einfachheit (eine Befehlszeile) und Flexibilität , egal ob Sie mit konkreten Klassen, älteren WQL-Abfragen oder spezifischen Eigenschaften arbeiten, die Sie für den Abruf optimieren möchten.
Fernkonsultationen mit CIM, Sitzungen und WSMan/DCOM-Protokollen
Wenn Sie von Ihrem lokalen Rechner auf entfernte Rechner zugreifen, spielen verschiedene Faktoren eine Rolle: Berechtigungen, Kommunikationsprotokoll und Leistung . Obwohl PowerShell oft als „gefährlich“ angesehen wird, gewährt sie Ihnen in Wahrheit keine zusätzlichen Berechtigungen: Sie verfügen über exakt dieselben Berechtigungen wie bei der grafischen Oberfläche oder anderen Tools – nicht mehr und nicht weniger.
Wenn Sie versuchen, `Get-CimInstance -ComputerName Server -ClassName Win32_BIOS` ohne ausreichende Berechtigungen auf dem betreffenden Computer auszuführen, erhalten Sie die Fehlermeldung „Zugriff verweigert“ . Dies liegt nicht an einem Fehler in PowerShell, sondern daran, dass der Benutzer, unter dem Sie die Sitzung ausführen, nicht über die Berechtigung verfügt, auf diese Informationen in WMI zuzugreifen. Sie können zwar eine Konsole als Domänenadministrator öffnen, dies bedeutet jedoch, dass jeder Befehl mit diesen Berechtigungen ausgeführt wird, was in vielen Umgebungen ein unnötiges Risiko darstellt.
Es wird empfohlen, das Prinzip der minimalen Berechtigungen anzuwenden und Berechtigungen nur bei Bedarf zu erhöhen . In Cmdlets, die den Parameter `-Credential` unterstützen, können Sie alternative Anmeldeinformationen nur für den jeweiligen Befehl angeben. `Get-CimInstance` akzeptiert `-Credential` jedoch nicht direkt. Hier bieten CimSessions eine elegante Lösung.
Eine CimSession ist eine dauerhafte Verbindung zu einem Remotecomputer, die Sie mit New-CimSession erstellen können, indem Sie den Computernamen und die Anmeldeinformationen übergeben (z. B. New-CimSession -ComputerName dc01 -Credential (Get-Credential)). Diese Sitzung wird in einer Variablen wie $CimSession gespeichert und anschließend mit Get-CimInstance wiederverwendet, indem Sie den Parameter -CimSession anstelle von -ComputerName verwenden. Dadurch können Sie mehrere Abfragen in einer einzigen Verbindung zusammenfassen.
Zusätzlich zu den erforderlichen Anmeldeinformationen verwendet Get-CimInstance standardmäßig das WSMan-Protokoll (basierend auf WinRM) . Das bedeutet, dass auf dem Remotecomputer mindestens die WSMan-Stack-Version 3.0 installiert sein muss, die typischerweise in PowerShell 3.0 und höher enthalten ist. Sie können die WSMan-Stack-Version eines Computers mit `Test-WSMan -ComputerName RemoteComputer` überprüfen und sicherstellen, dass der Wert für „Stack“ 3.0 oder höher ist, um diese Verbindungsmethode verwenden zu können.
CIM-Sitzungen mit DCOM und Abwärtskompatibilität
Die älteren WMI-Cmdlets, die auf Get-WmiObject basieren, verwenden das DCOM-Protokoll, das von älteren Windows-Versionen weiterhin unterstützt wird . Das Problem besteht darin, dass Firewalls auf moderneren Systemen DCOM häufig standardmäßig blockieren. Daher müssen Sie bestimmte Ports öffnen, um es direkt nutzen zu können, was gegen die Sicherheitsrichtlinien Ihres Unternehmens verstoßen kann.
Die CIM-Cmdlets bieten einen leistungsstarken Mittelweg: Sie können Sitzungsoptionen mit `New-CimSessionOption -Protocol Dcom` erstellen , diese in einer Variablen (z. B. `$DCOM`) speichern und anschließend mit `New-CimSession` kombinieren, um eine CimSession zu erzeugen, die DCOM anstelle von WSMan verwendet. Dadurch können Sie Verbindungen zu sehr alten Servern herstellen, sogar zu solchen, die vor Windows Server 2000 erstellt wurden und auf denen PowerShell nicht installiert ist.
Es ist üblicherweise praktisch, die Anmeldeinformationen eines Domänenadministrators oder eines Kontos mit erhöhten Rechten in einer Variablen zu speichern (z. B. `$Cred = Get-Credential` ), um sie nicht jedes Mal neu eingeben zu müssen. Mit einem Befehl wie `New-CimSession -ComputerName sql03 -SessionOption $DCOM -Credential $Cred` lässt sich dann eine CimSession über DCOM zu einem älteren Server starten, der zwar WMI, aber kein WSMan unterstützt.
Aus Sicht des Skriptautors besteht der größte Vorteil darin, dass die Ausgabe von `Get-CimInstance` unabhängig vom Protokoll ist : Man erhält dieselben Objekte und Eigenschaften, egal ob man WSMan oder DCOM verwendet. Dies vereinfacht die Logik erheblich, da die Erkennung des passenden Protokolls in einer Funktion gekapselt werden kann und der restliche Code stets transparent mit CimSessions arbeitet.
Tatsächlich ist es üblich, benutzerdefinierte Funktionen zu erstellen, die WSMan mit Test-WSMan testen und, falls dieser nicht verfügbar ist, automatisch auf DCOM mit New-CimSessionOption zurückgreifen. Dadurch lässt sich die Erstellung von CimSessions in heterogenen Umgebungen mit modernen und älteren Servern standardisieren, ohne die Verbindungslogik in allen Skripten duplizieren zu müssen.
Verwaltung, Auflistung und Bereinigung von CimSessions
Bei der intensiven Nutzung von CimSessions ist es wichtig, diese zu verwalten, um unnötige Verbindungen zu vermeiden. Mit Get-CimSession können Sie alle offenen Sitzungen auflisten , den Zielrechner ermitteln und das verwendete Protokoll (WSMAN oder DCOM) überprüfen. Dies ist sehr hilfreich bei der Diagnose von Verbindungs- oder Authentifizierungsproblemen.
Sie können diese bestehenden Sitzungen auch in einer Variablen abrufen, zum Beispiel $CimSession = Get-CimSession , und sie in einem einzigen Befehl verwenden: Get-CimInstance -CimSession $CimSession -ClassName Win32_BIOS, um mehrere Computer gleichzeitig abzufragen und WSMan- und DCOM-Sitzungen in einem einzigen Vorgang zu kombinieren.
Nachdem Sie die Informationen analysiert haben, empfiehlt es sich, die Sitzungen zu schließen, um unnötig geöffnete Ressourcen zu vermeiden. Das Cmdlet „Get-CimSession | Remove-CimSession“ entfernt alle aktiven CimSessions des aktuellen Profils gleichzeitig. Alternativ können Sie dem Cmdlet „Remove-CimSession“ auch einzelne Sitzungen übergeben, um nur einige davon zu schließen.
Diese Vorgehensweise ermöglicht kontrollierte Verbindungs- und Trennungszyklen , was besonders empfehlenswert ist, wenn Skripte innerhalb geplanter Aufgaben, Automatisierungs-Runbooks oder Continuous-Integration-Pipelines verwendet werden, da diese Sitzungen sonst hängen lassen können, wenn die Bereinigung nicht explizit geplant wird.
PowerShell als umfassende Automatisierungssprache
Neben WMI und CIM hat sich PowerShell zu einer universellen Automatisierungssprache entwickelt , die weit über typische Windows-Verwaltungsskripte hinausgeht. Es gibt Bücher und ganze Kurse, die sich ihren fortgeschrittenen Funktionen widmen und alles abdecken – von der Installation unter Linux und Windows über die Entwicklung verteilbarer Module via NuGet bis hin zu modernen Entwicklungsumgebungen wie Visual Studio Code.
Ein gängiger Ausgangspunkt ist das gründliche Verständnis der erweiterten PowerShell-Funktionen . Diese ermöglichen es, Parameter zu definieren, Validierungen durchzuführen, strukturierte Ausgaben zu generieren und auf die integrierte Hilfe nahezu auf dem Niveau eines nativen Cmdlets zuzugreifen. Die Organisation des Codes in Module erleichtert die Zusammenarbeit in Betriebsteams, da diese Module versioniert und in internen oder öffentlichen NuGet-basierten Repositories veröffentlicht werden können.
Die Arbeit mit benutzerdefinierten Objekten und Klassen ist ebenfalls entscheidend und ermöglicht deutlich komplexere Datenmodelle als herkömmliche lineare Skripte. So können Sie Geschäftslogik kapseln, Strukturen wiederverwenden und interne APIs für Ihr Managementteam entwerfen – alles mit Hilfe der PowerShell-Engine.
Im Bereich der fortgeschrittenen Automatisierung spielen Hintergrundprozesse und Workflows eine entscheidende Rolle . Sie ermöglichen die Verwaltung asynchroner Aufgaben, die Ausführung zeitaufwändiger Operationen ohne Blockierung der Konsole und die Orchestrierung komplexer Abläufe auf mehreren Rechnern. Diese Funktionen eignen sich ideal für Massenabfragen an WMI/CIM und für Szenarien der Fernadministration, bei denen häufig auf die Implementierung von Änderungen oder die Datenrückgabe durch Systeme gewartet werden muss.
Eine weitere Schlüsselkomponente ist PowerShell DSC (Desired State Configuration), mit der Sie die gewünschte Konfiguration einer Infrastruktur (Rollen, Funktionen, Dienste, Dateien, Sicherheitseinstellungen usw.) definieren und diese Zustände wiederholt anwenden können. In Kombination mit den über WMI/CIM erhaltenen Informationen lassen sich Abweichungen erkennen, proaktiv korrigieren und konsistente Umgebungen mit weniger manuellem Aufwand gewährleisten.
Lokale, Remote- und Cloud-Verwaltung mit PowerShell
Auf lokaler Ebene bietet PowerShell Cmdlets für die Verwaltung von Active Directory-Domänendiensten , die Konfiguration von Netzwerken und die Serveradministration. In Windows 10 und späteren Versionen ist die Integration noch umfassender und ermöglicht die Automatisierung von Prozessen wie der Erstellung von Websites, der Verwaltung von Active Directory-Objekten und der Konfiguration von Netzwerkadaptern.
Eine weniger bekannte, aber sehr nützliche Komponente sind PSProvider und PSDrives . Sie ermöglichen es, verschiedene Speicherorte (Dateisystem, Registrierung, Active Directory usw.) wie navigierbare Laufwerke zu behandeln. Dadurch können Sie beispielsweise Active Directory-Gruppen, Registrierungsschlüssel oder Ordnerstrukturen auf Remotecomputern mit derselben Syntax erstellen, die Sie auch zum Navigieren auf der Festplatte verwenden würden.
Für die Remote-Administration bietet PowerShell eine Reihe leistungsstarker Funktionen, um Verbindungen zu einem oder mehreren Computern herzustellen und Befehle in Ihrem Namen auszuführen . Sie können persistente PSSession-Sitzungen, fortgeschrittene Remoting-Techniken, 1:n-Szenarien (zur gleichzeitigen Verwaltung mehrerer Server) oder 1:1-Szenarien zum Debuggen spezifischer Fälle nutzen. All dies unter Berücksichtigung der Architektur und des Sicherheitsmodells des Remote-Zugriffs.
Die Cloud spielt heute eine grundlegende Rolle. Mit Azure PowerShell und Azure Cloud Shell können Sie virtuelle Maschinen, Speicher und Abonnements direkt über die Befehlszeile verwalten. Die Installation von Azure PowerShell-Modulen und deren Einarbeitung sind nahezu unerlässlich, wenn Sie Hybrid- oder vollständig in Azure gehostete Umgebungen verwalten.
Andererseits hat sich PowerShell auch als Standardwerkzeug für die Verwaltung von Microsoft 365 (Exchange Online, SharePoint Online, Teams, Benutzer und Lizenzen) etabliert. Von der Erstellung und Verwaltung von Konten bis hin zur Administration von Exchange Online-Ressourcen, einschließlich Gruppen, SharePoint-Websites und Microsoft Teams, lässt sich alles mit Skripten steuern, wodurch der manuelle Aufwand im Webportal drastisch reduziert wird.
Skripterstellung, Pipelines und bewährte Arbeitsmethoden
Um die Vorteile der erweiterten Automatisierung mit WMI und CIM optimal zu nutzen, ist es unerlässlich, das Pipeline-Modell von PowerShell zu beherrschen . Anders als in anderen Shells werden hier keine Klartextdaten, sondern vollständige Objekte übergeben. Dadurch lassen sich Informationen mit hoher Präzision auswählen, sortieren, messen, filtern, auflisten und transformieren.
Der Umgang mit Pipelines erfordert die korrekte Anwendung von Auswahl- und Filter-Cmdlets , das Verständnis der Enumeration komplexer Objekte und das Erlernen des verlustfreien Datenaustauschs zwischen Befehlen und Skripten. Unterstützt wird dies durch die strukturierte Verwendung von Variablen, Arrays und Hashtabellen, die als temporäre Datenstrukturen dienen, auf denen komplexere Logik aufgebaut wird.
Der nächste Schritt ist die Skripterstellung selbst: Befehle werden in wiederverwendbare Skripte mit Ablaufsteuerung (if, for, foreach) verpackt, Daten aus CSV-Dateien oder anderen Formaten importiert, Benutzereingaben verarbeitet, Fehler behandelt und Ereignisse protokolliert. All dies ermöglicht den Übergang von isolierten Befehlen zu robusteren, integrierten Werkzeugen.
Fehlerbehebung und Fehlerbehandlung sind in großen Automatisierungsumgebungen mit WMI/CIM besonders wichtig, da Netzwerkausfälle, falsch konfigurierte Berechtigungen oder fehlende Klassen Prozesse zum Absturz bringen können, wenn sie nicht ordnungsgemäß behandelt werden. Mit try/catch-Blöcken, konfigurierbaren Fehleraktionen und detaillierter Protokollierung können Sie solche Situationen vorhersehen und effektiver darauf reagieren.
Schließlich schließt sich der Kreis durch alles, was mit Funktionen und Modulen zu tun hat : Sie signieren Skripte, um deren Integrität zu gewährleisten, packen Funktionen in Module, verteilen diese Module in internen oder öffentlichen Repositories und schaffen so ein Ökosystem gemeinsam genutzter Tools innerhalb Ihres Unternehmens. Auf diese Weise wird jede Neuentwicklung im Bereich WMI, CIM oder Remoting in eine kohärente und leicht wartbare Suite integriert.
Die Kombination all dieser Komponenten – WMI/CIM, Remotesitzungen, Skripterstellung, asynchrone Aufträge, DSC, Azure und Microsoft 365 – schafft eine Umgebung, in der die fortschrittliche Automatisierung mit PowerShell zum Kern der Administration wird. Dank einer soliden Grundlage bewährter Verfahren, der intelligenten Nutzung von CimSessions (mit WSMan und DCOM) und eines modularen Skriptdesigns lassen sich heterogene Infrastrukturen konsistent, sicher und deutlich effizienter verwalten als mit grafischen Assistenten oder isolierten Tools.

