Welche PowerShell-, WMF- und .NET-Fehlermeldung bedeutet was – und welche Komponente ist tatsächlich die Ursache?

PowerShell-Fehler wirken in der Praxis oft widersprüchlich: Eine identische Meldung tritt einmal beim lokalen Start einer Konsole auf, ein anderes Mal nur im geplanten Task, in einer Remoting-Session oder innerhalb eines CI-Agents. Dahinter stehen mehrere Schichten, die jeweils eigene Fehlerquellen und Meldungsformate mitbringen: die PowerShell-Engine (Parser, Binder, Pipeline), Windows Management Framework (WSMan/WinRM, WMI/CIM, Management-Infrastruktur), die Sicherheits- und Policy-Schicht (Execution Policy, AMSI, Constrained Language Mode, UAC) sowie die .NET-Runtime (Common Language Runtime, Assembly-Ladepfade, Fusion-Binding, native Abhängigkeiten). In Windows- und Serverumgebungen verschärfen Systemzustände wie beschädigte Komponentenstores, unvollständige Updates, fehlende Root-CAs, restriktive Gruppenrichtlinien oder inkonsistente Modul- und Runtime-Versionen die Diagnose, weil Symptome auf einer Ebene entstehen, die Ursache aber in einer anderen liegt. Wer Fehlermeldungen verlässlich interpretieren will, muss ihren exakten Wortlaut oder Code, den Kontext der Ausführung und die verantwortliche Komponente zusammenführen: Handelt es sich um einen terminating error oder einen non-terminating error, um eine Remoting-Transportstörung oder um ein Sicherheitsblock, um eine .NET-Exception, die aus einem Cmdlet heraus nach oben durchschlägt, oder um einen HRESULT, der aus COM, Win32 oder dem Loader stammt. Die zentrale Frage lautet damit nicht nur „Was heißt diese Meldung?“, sondern „Welche Laufzeit-, Framework- oder Infrastrukturkomponente produziert sie – und welche Systembedingung macht sie wahrscheinlich?“

Inhalt

Fehlerquellen und Zuständigkeiten: PowerShell-Engine, WMF/WinRM/WMI/CIM und .NET-Runtime im Zusammenspiel

Fehlermeldungen aus PowerShell-Umgebungen entstehen selten in einer einzelnen Schicht. Die sichtbare Meldung wird zwar von der aufrufenden Oberfläche (Konsole, Host, Remoting-Client, Scheduled Task) ausgegeben, ihre Ursache liegt jedoch häufig in einer darunterliegenden Laufzeit- oder Infrastrukturkomponente: PowerShell-Engine (Parser, Binder, Pipeline), Windows Management Framework (WMF) als Bereitstellungsschicht für Windows PowerShell, WinRM/WSMan als Transport für Remoting, WMI/CIM als Management-Provider sowie die .NET-Runtime (CLR) als Ausführungsumgebung für den Großteil des Codes. Für eine korrekte Zuordnung entscheidet weniger der Wortlaut als der Ursprung: Exception-Typ, FullyQualifiedErrorId, CategoryInfo, innere Exceptions und HRESULT- bzw. Win32-Codes.

Die gleiche Textzeile kann aus unterschiedlichen Pfaden stammen: Ein Remoting-Fehler kann als System.Management.Automation.Remoting.PSRemotingTransportException erscheinen, intern aber eine WSMan-Fehlernummer oder einen HTTP-Status kapseln; ein CIM-Fehler kann als Microsoft.Management.Infrastructure.CimException auftreten und wiederum ein DCOM- oder Provider-Problem transportieren. Deshalb muss stets geklärt werden, welche Komponente die Meldung erzeugt und welche Komponente nur „weiterreicht“.

Schichtenmodell: Wer erzeugt die Meldung, wer transportiert sie?

Die PowerShell-Engine erzeugt Fehler, wenn Parsing, Parameterbindung oder Pipelineausführung scheitern. Solche Fehler sind typischerweise script-level oder engine-level, auch wenn sie bei Cmdlets sichtbar werden. Cmdlet-Autoren können Fehler als Write-Error (nicht-terminierend) oder als Exception (terminierend) auslösen; daraus entstehen unterschiedliche ErrorRecords. Darüber liegen Host-spezifische Aspekte wie Ausgabecodierung, Interaktivität oder der Umgang mit $ErrorActionPreference, die das Erscheinungsbild beeinflussen, nicht aber die Ursache.

WMF (insbesondere für Windows PowerShell 5.1) liefert PowerShell selbst sowie Management- und Remoting-Komponenten. WinRM/WSMan ist dabei der Transport, der Authentifizierung, Verschlüsselung und Sessionverwaltung übernimmt. WMI und CIM sind Abstraktionen zur Abfrage von Managementdaten: klassisches WMI nutzt häufig DCOM/RPC, CIM in PowerShell bevorzugt WSMan, kann aber je nach Konfiguration und Cmdlet auch andere Pfade berühren. Die .NET-Runtime bildet schließlich die Basis: zahlreiche Fehler, die als PowerShell-Fehler erscheinen, sind in Wirklichkeit CLR-Exceptions, die nur in ErrorRecords verpackt wurden.

Ebene Typische Fehlerklasse / Kennzeichnung Primäre Zuständigkeit
PowerShell-Engine ParseException, ParameterBindingException, RuntimeException; CategoryInfo häufig ParserError, InvalidArgument Parser, Binder, Pipeline, Session State
Cmdlet / Modul CmdletInvocationException, WriteErrorException; FullyQualifiedErrorId cmdlet-spezifisch Implementierung im Modul (PowerShell-Skript oder .NET-Assembly)
Remoting (WSMan/WinRM) PSRemotingTransportException; WSMan-Fehlernummern, HTTP-Status, Auth-/SPN-Probleme WinRM-Dienst, WSMan-Stack, Netzwerk, Authentifizierung
Management (WMI/CIM) ManagementException (WMI), CimException (MI); Provider-Fehler WMI-Service/Provider oder MI-Stack, Namespace, Provider, Berechtigungen
.NET-Runtime TypeLoadException, FileLoadException, SecurityException, UnauthorizedAccessException; HRESULT in HResult CLR Loader, JIT, Sicherheits- und Binding-Logik

PowerShell-Engine: Parsing, Binding und Pipeline als Fehlergeneratoren

Engine-seitige Fehler entstehen oft deterministisch aus dem Skripttext oder dem aktuellen Session State. Parserfehler wie System.Management.Automation.ParseException treten vor jeder Ausführung auf; sie hängen nicht von Zielsystemen ab, sondern von Syntax, Tokenisierung und AST-Aufbau. Parameterbindungsfehler wie System.Management.Automation.ParameterBindingException entstehen nach dem Parsing, wenn die Engine Argumente in Parameterwerte konvertiert, Default Parameter Sets auflöst und Validierungsattribute ausführt. Das erklärt, warum dieselbe Cmdletzeile einmal funktioniert und einmal nicht: Der Unterschied kann in Culture-Einstellungen (Zahl-/Datumsformat), in geladenen Typkonvertern, in einem anderen $PSDefaultParameterValues oder in einem abweichenden Modulstand liegen.

Während der Pipelineausführung entstehen Fehler als ErrorRecords. Nicht-terminierende Fehler können nachgelagerte Pipelineelemente erreichen oder durch -ErrorAction Stop in terminierende Fehler umgewandelt werden. Zusätzlich kapselt die Engine viele Ausnahmen in System.Management.Automation.CmdletInvocationException, wodurch der sichtbare Exception-Typ nicht der ursprüngliche ist. Der relevante Ursprung steht dann in $_.Exception.InnerException oder in $_.Exception.ErrorRecord. Diese Kapselung führt dazu, dass identische Meldungen in interaktiver Ausführung anders wirken als in Jobs, Scheduled Tasks oder Remoting, weil der Host Fehler anders formatiert und weil Termination-Semantik je nach Kontext variiert.

  • Syntax-/Parserfehler: System.Management.Automation.ParseException (typisch bei fehlenden Klammern, ungültigen Tokens); Quelle ist der Parser, nicht das Cmdlet.
  • Parameterbindung: System.Management.Automation.ParameterBindingException oder Cannot process argument transformation on parameter; Ursache sind Binder, Typkonvertierung, Validierungsattribute oder Parameter-Set-Auflösung.
  • Cmdlet-Kapselung: System.Management.Automation.CmdletInvocationException; die fachliche Ursache steht regelmäßig in $_.Exception.InnerException und ist häufig eine .NET-Exception oder ein Providerfehler.
  • Provider-/Pfadfehler: Meldungen wie Cannot find path sind oft ItemNotFoundException, können aber im Remoting-Kontext auf ein anderes Dateisystem (Remote Session, anderes Laufwerks-Mapping) verweisen.

WMF/WinRM/WSMan: Remoting-Transport, Authentifizierung und Kontextverschiebung

Bei PowerShell-Remoting liegt die sichtbare Fehlermeldung häufig in einer PowerShell-Exception, die WSMan-Details transportiert. Typisch sind Ausnahmen wie System.Management.Automation.Remoting.PSRemotingTransportException mit Meldungen der Form The WinRM client cannot process the request. Ursache sind dabei oft erreichbarkeits- und vertrauensbezogene Faktoren (Dienststatus, Listener, Firewall, DNS, SPN/Kerberos, Zertifikatsvertrauen bei HTTPS) statt „PowerShell-Probleme“. Besonders fehlerträchtig ist die Kontextverschiebung: In einer Remote Session gelten andere Umgebungsvariablen, ein anderes Profil, andere Laufwerkszuordnungen und häufig andere Berechtigungsgrenzen (Double-Hop, Delegation). Identische Datei- oder Registry-Fehlertexte können dadurch auf fehlende Delegation statt auf fehlende Objekte hinweisen.

Auch die Fehlerbehandlung unterscheidet sich. Remote Errors werden serialisiert und als „deserialized“ Objekte zurückgegeben; dabei können Typinformationen fehlen oder vereinfacht werden. Die ursprüngliche Exception-Kette kann gekürzt sein, während WSMan-Fehlernummern und Transporthinweise erhalten bleiben. Für die Zuständigkeitszuordnung zählt daher, ob CategoryInfo Remoting-spezifisch ist, ob die Exception eine TransportMessage enthält und ob die Meldung auf WSMan/WinRM verweist.

WMI/CIM: Provider, Namespace und Zugriffskontrolle als Ursache hinter „Management“-Fehlern

WMI- und CIM-Fehler wirken oft wie Datenfehler, sind aber häufig Struktur- oder Berechtigungsprobleme. Bei WMI treten klassisch System.Management.ManagementException und COM-basierte Fehler auf; bei CIM/MI erscheinen Microsoft.Management.Infrastructure.CimException. Der entscheidende Unterschied liegt im Transport und im Provider-Stack: CIM-Cmdlets wie Get-CimInstance nutzen standardmäßig WSMan, während ältere WMI-Ansätze (oder lokale Aufrufe) andere Sicherheitskontexte und Protokolle berühren. Dasselbe Abfrageziel kann lokal funktionieren, remote jedoch scheitern, wenn der Provider remote nicht zugelassen ist, wenn DCOM/WSMan blockiert wird oder wenn Namespace-Berechtigungen fehlen.

Providerfehler werden außerdem häufig als generische „Invalid class“-, „Not found“- oder „Access denied“-Texte gemeldet, obwohl der eigentliche Fehler eine beschädigte Repository-Struktur, eine inkonsistente MOF-Registrierung oder ein deaktivierter Dienst ist. Für die Zuordnung ist wichtig, ob die Meldung auf root\cimv2, eine konkrete Klasse oder einen Provider verweist und ob ein COM/HRESULT oder MI-Errorcode enthalten ist. Diese Codes stammen nicht aus PowerShell, sondern aus der Management-Infrastruktur.

.NET-Runtime: Loader, Assemblies, HRESULTs und Sicherheitsgrenzen unter PowerShell

Die PowerShell-Engine läuft auf einer .NET-Runtime; unter Windows PowerShell 5.1 ist das die .NET Framework CLR, unter PowerShell 7+ die .NET (Core) Runtime. Zahlreiche Fehler sind deshalb CLR-Loader- und Bindingfehler, die als PowerShell-Fehler erscheinen. Klassisch sind System.IO.FileNotFoundException (Assembly oder native Abhängigkeit nicht gefunden), System.IO.FileLoadException (gefunden, aber nicht ladbar, etwa wegen Version, Signatur, Sperren), System.BadImageFormatException (Architektur/Format passt nicht) und System.TypeLoadException (Typ vorhanden erwartet, aber nicht auflösbar). In solchen Fällen ist die „zuständige“ Komponente der CLR Loader; PowerShell ist der Auslöser, nicht der Ursprung.

HRESULTs sind dabei das Bindeglied zwischen .NET, COM und Win32. Viele Exceptions tragen einen HResult, der tieferliegende Ursachen codiert, etwa Zugriffsprobleme oder COM-Aktivierungsfehler. Der sichtbare Text kann je nach Culture, Host oder Serialisierung variieren, der Code bleibt jedoch stabil. Gleichzeitig kann derselbe HRESULT in verschiedenen Kontexten entstehen: Ein E_ACCESSDENIED kann eine fehlende Dateiberechtigung, eine UAC-Token-Grenze, eine fehlende Remoting-Delegation oder eine restriktive DCOM-/WMI-Namespace-ACL bedeuten. Die Zuständigkeit ergibt sich erst aus Stacktrace, InnerException und dem betroffenen Ressourcenpfad.

  • Modul-/Assembly-Binding: Fehlerbilder mit System.IO.FileNotFoundException oder Textteilen wie Could not load file or assembly deuten auf CLR-Assemblyauflösung; typische Auslöser sind fehlende Abhängigkeiten im Modulpfad ($env:PSModulePath) oder falsche Runtime-Zielplattform (Windows PowerShell vs. PowerShell 7).
  • Native Abhängigkeiten: System.DllNotFoundException oder BadImageFormatException verweisen häufig auf fehlende VC++-Runtime, falsche Bitness (x86/x64/ARM64) oder nicht auffindbare DLLs im Suchpfad des Prozesses.
  • HRESULT-Weitergabe: COM-/Win32-nahe Fehler werden in .NET häufig als System.Runtime.InteropServices.COMException oder Win32Exception sichtbar; die technische Ursache steht im HRESULT bzw. im nativen Fehlercode, nicht in der PowerShell-Oberfläche.
  • Sicherheitsgrenzen: System.UnauthorizedAccessException und System.Security.SecurityException können identische Texte tragen, aber unterschiedliche Zuständigkeiten haben (Dateisystem-ACL, Token/UAC, Remoting-Kontext, AppLocker/WDAC-Blockade).

Das Zusammenspiel der Schichten entscheidet letztlich über die Diagnose: PowerShell formt ErrorRecords, WMF-Komponenten transportieren und kontextualisieren (Remoting, Management), und die .NET-Runtime liefert die konkrete technische Ausnahme samt Codes. Nur wenn die Meldung einer Schicht zugeordnet wird, lässt sich der „Fehler“ als Symptom eines Systemzustands erkennen: falsche Ausführungsumgebung, inkonsistente Abhängigkeiten, restriktive Sicherheitskonfiguration oder ein Infrastrukturdefekt.

PowerShell-Fehlermeldungen präzise zuordnen: Parser-/Binderfehler, Cmdlet-Fehler, Remoting, Module, Richtlinien und Berechtigungen

PowerShell erzeugt Fehlermeldungen aus mehreren Schichten: dem Parser (Syntax), dem Binder (Namens- und Typauflösung), der Engine (Pipeline und Invocation), dem Cmdlet-/Provider-Layer sowie optionalen Transport- und Sicherheitskomponenten (Remoting, WinRM, WSMan, Kerberos/NTLM). Der identische Wortlaut kann je nach Host (Konsole, ISE, VS Code, Scheduled Task, Dienstkonto) und je nach Runspace-Konfiguration (ExecutionPolicy-Scope, Constrained Language Mode, Profilskripte, Modulpfade) unterschiedliche Ursachen haben. Für eine belastbare Zuordnung muss klar sein, ob ein Fehler vor der Ausführung (Parsing/Binden), während der Pipeline-Ausführung (nicht terminierend/terminierend), oder außerhalb des Runspaces (Transport/Authentifizierung/Policy) entsteht.

Parser- und Binderfehler: Syntax, Tokens, Parameterbindung und Typkonvertierung

Parserfehler entstehen, bevor ein Command überhaupt aufgelöst wird. Typische Meldungen beginnen mit ParserError und treten auch dann auf, wenn ein Skript nie in die Ausführung gelangt (etwa beim Laden eines Profils). Binderfehler dagegen entstehen, wenn PowerShell einen Befehlsnamen, Parameter oder Argumenttypen nicht eindeutig zuordnen kann. Das ist keine reine „Cmdlet-Fehlfunktion“, sondern Ergebnis der Command-Discovery (Alias, Funktion, Cmdlet, Script, Anwendung) und der Parameterbindung (ByName/ByPosition, PipelineBinding, ArgumentTransformationAttributes).

  • Syntaxfehler (Parser): ParserError: Unexpected token '…' in expression or statement. — Tokenisierung/AST-Bildung scheitert, häufig durch nicht geschlossene Klammern/Strings oder falsch platzierte Scriptblocks.
  • Unvollständige Konstrukte (Parser): ParserError: Missing closing '}' in statement block or type definition. — Blockstruktur im AST bleibt offen; Ursache oft in verschachtelten if/try/class-Blöcken.
  • Befehl nicht gefunden (Binder/Discovery): The term 'X' is not recognized as the name of a cmdlet, function, script file, or operable program. — Discovery findet keinen passenden Command; in Remote-Sitzungen zusätzlich möglich bei fehlendem Modul auf dem Ziel oder abweichendem $env:PATH/$env:PSModulePath.
  • Mehrdeutige Parameter (Binder): ParameterBindingException: A parameter cannot be found that matches parameter name '…'. oder ParameterBindingException: Parameter set cannot be resolved using the specified named parameters. — Parametername existiert nicht oder Parameter-Sets kollidieren; Kontext ist das Cmdlet-Metadatenmodell (ParameterAttribute/ParameterSetName).
  • Typkonvertierung (Binder): Cannot convert value "…" to type "System.Int32". Error: "Input string was not in a correct format." — Conversion via ETS/.NET TypeConverter scheitert; identischer Text kann je nach Kulturinfo ([cultureinfo]::CurrentCulture) durch Dezimaltrennzeichen ausgelöst werden.

Cmdlet-Fehler: nicht terminierend vs. terminierend, ErrorRecord und Kategorien

Cmdlets berichten Fehler über ErrorRecord-Objekte. Nicht terminierende Fehler werden über Write-Error ausgegeben und lassen die Pipeline fortlaufen; terminierende Fehler (Exceptions oder ThrowTerminatingError) unterbrechen den aktuellen Ausführungspfad und lassen sich mit try/catch abfangen. Ob ein Fehler terminierend wirkt, hängt außerdem von -ErrorAction, $ErrorActionPreference und spezifischen Cmdlet-Implementierungen ab. Deshalb ist derselbe Fehlertext im Output nicht gleichbedeutend mit identischem Kontrollfluss.

Symptom/Wortlaut (Auszug) Zuordnung in PowerShell Typische technische Ursache
WriteError: Cannot find path '…' because it does not exist. Nicht terminierender Fehler eines Cmdlets (ErrorRecord, oft ObjectNotFound) Dateisystemzustand, Working Directory, Remote-Session mit anderem Laufwerksmapping
Access to the path '…' is denied. Meist .NET-Exception (UnauthorizedAccessException) im Cmdlet, als ErrorRecord dargestellt NTFS/Share-ACL, UAC-Token, fehlende Rechte im Dienstkonto, Zugriff auf geschützte Pfade
The pipeline has been stopped. PipelineStopException (Engine), häufig Folge von Select-Object/Out-String bei frühem Abbruch Upstream-Command schreibt weiter, Downstream signalisiert Stop; oft harmlos, aber diagnostisch relevant
You cannot call a method on a null-valued expression. Runtime/Engine: MethodInvocation auf $null Vorbedingung nicht erfüllt, Objektauflösung in vorherigem Pipeline-Segment lieferte $null

Für die eindeutige Zuordnung sind die Metadaten wichtiger als der sichtbare Text: $Error[0].FullyQualifiedErrorId, $Error[0].CategoryInfo und $Error[0].Exception.GetType().FullName verankern den Fehler in Engine, Cmdlet oder .NET-Layer. Remoting und Hintergrundjobs serialisieren ErrorRecords; dabei kann der Exception-Typ auf der Empfängerseite als „RemoteException“ erscheinen, während die Originaldetails im Property SerializedRemoteException bzw. in den ErrorDetails stecken.

Remoting-Fehler: WSMan/WinRM, Authentifizierung, Delegation und Sitzungszustand

PowerShell-Remoting über New-PSSession/Invoke-Command basiert (Windows PowerShell und PowerShell 7 unter Windows) typischerweise auf WSMan/WinRM. Fehlermeldungen wirken oft „netzwerkartig“, sind aber häufig Ausdruck lokaler Richtlinien, fehlender Listener, Authentifizierungsrestriktionen oder SPN/Delegationsproblemen. Der exakte Wortlaut enthält meist eine WSMan-Fehler-ID, die der Transportkomponente zugeordnet ist, nicht dem aufgerufenen Cmdlet.

  • WinRM nicht erreichbar/konfiguriert: WinRM cannot process the request. — WSMan-Client erhält keine gültige Antwort; Ursachen sind deaktivierter WinRM-Dienst, fehlender Listener (winrm enumerate winrm/config/listener) oder blockierte Firewallregel (Enable-PSRemoting -Force setzt Standardkonfiguration, scheitert aber ohne administrative Rechte).
  • TrustedHosts/HTTP ohne Kerberos: The WinRM client cannot process the request. If the authentication scheme is different from Kerberos, or if the client computer is not joined to a domain, then HTTPS transport must be used or the destination machine must be added to the TrustedHosts configuration setting. — Transportpolicy des WSMan-Clients; typischer Kontext: Workgroup, IP-Adresse statt Hostname, oder Cross-Domain ohne Vertrauensstellung.
  • Doppelte Hop-/Delegationsgrenze: Access is denied. oder The server has rejected the client credentials. bei Zugriff auf dritte Systeme aus einer Session — Kerberos-Delegation/CredSSP/Resource-Based Constrained Delegation; Ursache liegt in Authentifizierungsfluss, nicht im Zielcmdlet.
  • Session Capability/Endpoint: The syntax is not supported by this runspace. oder This command cannot be run due to the error: … — Einschränkungen durch JEA-Endpunkte, LanguageMode oder Endpoint-Konfiguration; sichtbar als Remoting-Fehler, technisch aber SessionConfiguration/AuthorizationManager.

Module, Autoloading und Abhängigkeiten: PSModulePath, Signaturen und Assembly-Ladevorgänge

Fehler im Modulkontext werden oft fälschlich als „Cmdlet nicht vorhanden“ interpretiert. PowerShell lädt Module automatisch, wenn ein Command aufgelöst wird, sofern Autoloading aktiv ist. Damit sind Modulpfade, Side-by-Side-Installationen und Abhängigkeiten (NestedModules, RequiredAssemblies, RequiredModules) unmittelbare Fehlerursachen. In restriktiven Umgebungen kommen Signatur- und Katalogprüfungen hinzu, die wie Laufzeitfehler wirken, technisch aber aus dem Policy- bzw. Security-Layer stammen.

  • Modul nicht gefunden: Import-Module : The specified module 'X' was not loaded because no valid module file was found in any module directory. — Discovery scheitert entlang $env:PSModulePath; in 32/64-Bit-Kontexten und in Remoting-Sessions kann der Pfad abweichen.
  • Abhängige Assembly fehlt: Could not load file or assembly 'X, Version=…' or one of its dependencies. The system cannot find the file specified. — .NET-Assembly-Load innerhalb des Moduls; Ursache sind fehlende DLLs, falsche Architektur (x86/x64/ARM64) oder Load-Context-Konflikte bei gemischten PowerShell-/Runtime-Versionen.
  • Modul geladen, Typ nicht verfügbar: Unable to find type [X]. — TypeResolver findet die Klasse nicht; häufig, weil das Modul zwar importiert, aber die Assembly nicht geladen wurde oder der Typ in einem anderen Namespace liegt.
  • Signatur/Publisher blockiert: File … cannot be loaded because running scripts is disabled on this system. oder … is not digitally signed. You cannot run this script on the current system. — ExecutionPolicy/Authenticode-Entscheid, oft getriggert durch Zone.Identifier (Mark-of-the-Web) bei Dateien aus dem Internet.

Richtlinien und Berechtigungen: ExecutionPolicy, Language Mode, UAC und Dateisystem/Registry

Richtlinienmeldungen werden häufig als „PowerShell blockiert“ zusammengefasst, obwohl mehrere Mechanismen wirken: ExecutionPolicy (Client-seitige Skriptausführungsregeln), Application Control (z. B. WDAC/AppLocker), sowie Constrained Language Mode über Device Guard/UMCI. Daneben erzeugen Berechtigungsprobleme klassische Ausnahmen aus .NET und Win32, die von Cmdlets lediglich weitergereicht werden. Der Ausführungskontext entscheidet: Ein erhöht gestarteter Host besitzt ein anderes Zugriffstoken als ein nicht erhöhter, ein Scheduled Task kann ohne Benutzerprofil laufen, und Remoting verwendet ein separates Logon-Szenario.

  • ExecutionPolicy-Blockade: … cannot be loaded because running scripts is disabled on this system. — ausgelöst beim Laden von .ps1/.psm1/.psd1; Diagnose über Get-ExecutionPolicy -List und Scope-Priorität (MachinePolicy/UserPolicy > Process > CurrentUser > LocalMachine).
  • UAC/Token-Rechte: Requested registry access is not allowed. — meist .NET SecurityException/UnauthorizedAccessException beim Zugriff auf geschützte Schlüssel; Kontextwechsel zwischen administrativem Mitgliedschaftstoken und erhöhtem Token ist entscheidend.
  • Constrained Language Mode: Method invocation is supported only on core types in this language mode. — PowerShell-Sprachmodus beschränkt .NET-Aufrufe; Ursache ist typischerweise eine Application-Control-Policy, nicht ein Skriptfehler.
  • Datei „in Benutzung“: The process cannot access the file '…' because it is being used by another process. — Win32-Sharing-Violation, häufig bei Logfiles, MSI-Operations oder AV-Scanner; erscheint in PowerShell als IOException-Text, kann aber aus unterschiedlichen Cmdlets stammen (Remove-Item, Set-Content, Move-Item).

.NET-Exceptions und Codes in PowerShell-Kontexten: typische Exception-Typen, HRESULT/Win32-Codes, Loader- und Abhängigkeitsfehler

PowerShell läuft auf einer .NET-Runtime und setzt für nahezu alle nichttrivialen Operationen auf Managed Code: Cmdlets instanziieren .NET-Typen, Parameterbindung nutzt Reflection, Pipeline-Objekte sind .NET-Instanzen, und viele Fehler entstehen als .NET-Exceptions, bevor PowerShell sie in ein ErrorRecord-Objekt überführt. Dabei bleibt der ursprüngliche .NET-Typ häufig erhalten (z. B. System.UnauthorizedAccessException), wird aber je nach Fehlerquelle als terminierender oder nicht terminierender Fehler ausgegeben. Zusätzlich tauchen native Fehlerdomänen auf: HRESULT-Werte aus COM/WinRT, Win32-Fehlercodes aus dem Kernel oder dem Service Control Manager sowie Loader-Statuscodes aus dem PE- und Assembly-Ladeprozess.

Wie .NET-Exceptions in PowerShell sichtbar werden

In PowerShell werden Ausnahmen in der Regel als System.Management.Automation.RuntimeException oder spezifischer als CmdletInvocationException „umhüllt“. Das umschließende Objekt enthält unter $_ bzw. $PSItem die Felder Exception, FullyQualifiedErrorId, CategoryInfo und ErrorDetails. Die eigentliche Ursache steckt oft in $_.Exception.InnerException oder tiefer in einer Kette von InnerExceptions, insbesondere bei Reflection- und Loader-Problemen.

Dass identische Fehltexte unterschiedliche Ursachen haben, liegt am Kontext: Ein Cmdlet kann dieselbe .NET-Exception auslösen wie ein Skriptblock, aber ein anderes Fehlerverhalten zeigen (terminierend vs. nicht terminierend). Ebenso kann Remoting die Exception serialisieren; der Empfänger sieht dann häufig eine System.Management.Automation.RemoteException mit Text der Originalausnahme, während Stacktraces, Typinformationen oder HResults gekürzt oder als SerializedRemoteException abstrahiert werden.

PowerShell-Artefakt Bezug zur .NET-Exception Typische Auswirkung
$_.Exception Wrapper-Exception oder Originaltyp Enthält Message und ggf. HResult
$_.Exception.InnerException Ursache der Ursache (Loader, IO, Security) Entscheidend für Root-Cause-Analyse
$_.FullyQualifiedErrorId PowerShell-spezifische Klassifikation Stabiler als Message für Automatisierung
$_.CategoryInfo.Category PowerShell-Fehlerkategorie Einordnung (z. B. SecurityError, ObjectNotFound)
$_.ErrorDetails Erweiterte PowerShell-Meldung Kann lokalisiert und kontextabhängig sein

Typische .NET-Exception-Typen im PowerShell-Alltag und ihre technische Bedeutung

Viele Fehler lassen sich stabil über den Exception-Typ einordnen, weil er direkt die verantwortliche Subsystemschicht reflektiert: IO-Stack (System.IO), Security/ACL (System.UnauthorizedAccessException), Reflection/Loader (System.Reflection, System.Runtime.Loader) oder Netzwerk/Remoting (System.Net). Der sichtbare Text ist dagegen oft nur eine Oberfläche; entscheidend sind zusätzliche Eigenschaften wie HResult, FusionLog (falls aktiviert) oder LoaderExceptions bei ReflectionTypeLoadException.

  • Zugriff/ACL: System.UnauthorizedAccessException („Zugriff verweigert.“) entsteht bei fehlenden NTFS-/Registry-Rechten, UAC-Token-Einschränkungen oder Policy-bedingten Blockaden; in PowerShell häufig zusammen mit CategoryInfo : PermissionDenied und einem HResult, der auf 0x80070005 (E_ACCESSDENIED) bzw. Win32 5 verweist.
  • Datei/Verzeichnis: System.IO.FileNotFoundException („Die Datei … wurde nicht gefunden.“) und System.IO.DirectoryNotFoundException signalisieren fehlende Pfade, aber auch falsche Working-Directory-Annahmen im Hostprozess; relevante Diagnose liefern $_.Exception.FileName und bei Loaderfehlern eher System.IO.FileLoadException („Die Datei oder Assembly … konnte nicht geladen werden.“).
  • Typ-/Assembly-Laden: System.TypeLoadException („Der Typ … konnte nicht geladen werden.“) und System.MissingMethodException („Methode nicht gefunden: …“) deuten auf Versionskonflikte hin, etwa wenn ein Modul gegen eine andere Assembly-Version gebaut wurde; häufig tritt dies nach Updates auf, wenn mehrere Kopien derselben DLL im Suchpfad liegen.
  • Reflection-Sammelfehler: System.Reflection.ReflectionTypeLoadException („Mindestens ein Typ in der Assembly konnte nicht geladen werden.“) sammelt mehrere Loaderfehler; die eigentlichen Ursachen stehen in $_.Exception.LoaderExceptions und sind oft Mischungen aus FileNotFoundException, FileLoadException und BadImageFormatException.
  • Plattform/Bitness: System.BadImageFormatException („… ist keine gültige Win32-Anwendung.“) entsteht bei 32/64-Bit-Mismatch, falschem Ziel-Framework oder nativen Abhängigkeiten, die nicht zur Prozessarchitektur passen; im PowerShell-Kontext besonders relevant, wenn powershell.exe (Windows PowerShell, ggf. 32-bit) und pwsh.exe (PowerShell 7+, 64-bit) parallel existieren.
  • Netzwerk/TLS: System.Net.WebException sowie System.Security.Authentication.AuthenticationException treten bei Proxys, Zertifikatsproblemen oder TLS-Aushandlung auf; in PowerShell erscheinen sie oft hinter Cmdlets wie Invoke-RestMethod oder beim Moduldownload, wobei zusätzliche Informationen in $_.Exception.Status und $_.Exception.InnerException stecken.

HRESULT- und Win32-Codes: Mapping, Lesbarkeit und typische Codes

Viele .NET-Exceptions tragen einen HResult-Wert, der die Fehlerdomäne präzisiert. Häufig handelt es sich um einen „verpackten“ Win32-Code: 0x80070000 | Win32Code. Beispiel: Win32 5 (Access is denied) entspricht oft HRESULT 0x80070005. COM-Fehler erscheinen typischerweise als System.Runtime.InteropServices.COMException mit HRESULT, bei WinRT zusätzlich als System.Exception-Varianten aus der Windows Runtime Projection.

Code Domäne Typische Meldung im PowerShell/.NET-Kontext Einordnung
0x80070005 / Win32 5 HRESULT/Win32 „Zugriff verweigert.“ ACL/UAC/Policy, häufig bei Registry, Services, WMI/COM
0x80070002 / Win32 2 HRESULT/Win32 „Das System kann die angegebene Datei nicht finden.“ Pfad-/Dateifehler, auch bei fehlenden nativen DLLs im Loader
0x80131500 .NET Generischer CLR-Fehlercode (häufig bei Reflection/Loader-Ketten) Hinweis auf tieferliegende InnerException aus Loader/IO
0x80131040 .NET Assembly Binding „Die Assembly … stimmt nicht mit der Assemblyverweisangabe überein.“ Strong-Name/Version-Mismatch, Binding Redirects bzw. Load-Kontext-Konflikte
0x80004005 COM/E_FAIL „Unbekannter Fehler (Ausnahme von HRESULT: 0x80004005)“ Unspezifischer COM-Fehler, erfordert Analyse der aufrufenden Komponente

Die gleiche HRESULT-Zahl kann je nach aufrufender Schicht unterschiedliche Ursachen haben. 0x80070005 kann etwa aus dem Dateisystem kommen, aus DCOM-Konfiguration, aus dem Zertifikatspeicher oder aus einem API-Aufruf, der intern Rechteprüfung für einen anderen Ressourcenpfad durchführt. Deshalb ist die Kombination aus Exception-Typ, HResult und Kontext (welche API, welches Cmdlet, welcher Prozess-Token) entscheidend.

Loader- und Abhängigkeitsfehler: Assembly Load Context, Native DLLs, Modulgrenzen

Abhängigkeitsfehler entstehen im PowerShell-Kontext auf mindestens drei Ebenen: (1) PowerShell-Modulauflösung (Import-Module, Modulmanifest, RequiredModules), (2) Managed Assembly Load (CLR-Loader, Assembly Load Context), (3) native Abhängigkeiten (Windows Loader, LoadLibrary). In Windows PowerShell (auf .NET Framework) und PowerShell 7+ (auf .NET) unterscheiden sich die Lade- und Isolationsmechanismen; zugleich verschiebt sich die Fehleroberfläche: Ein fehlendes natives DLL-Dependency kann als FileNotFoundException auf eine Managed DLL erscheinen, obwohl die Datei vorhanden ist, weil erst eine transitive native Abhängigkeit scheitert.

  • Manifest-/Modulabhängigkeiten: Fehler wie „Das angegebene Modul ‚X‘ wurde nicht geladen, da kein gültiges Moduldatei gefunden wurde“ entstehen auf PowerShell-Ebene; Prüfung über Get-Module -ListAvailable
    $env:PSModulePath -split ';' und Auflösung des Modulwurzelpfads (Version-Unterordner, .psd1, RootModule).
  • Managed Assembly nicht gefunden: System.IO.FileNotFoundException beim Laden einer Assembly trotz existierender Datei deutet häufig auf eine fehlende transitive Abhängigkeit oder falschen Load-Kontext; Diagnose über Add-Type -Path C:\Pfad\Lib.dll (liefert oft präzisere Loaderdetails) und Auflösen der InnerExceptions.
  • Assembly vorhanden, aber blockiert oder inkompatibel: System.IO.FileLoadException tritt u. a. bei Signatur-/Policy-Sperren, gesperrten Dateien oder Binding-Konflikten auf; relevante Indikatoren sind $_.Exception.HResult und bei Windows-Downloads ein vorhandenes Zone-Tag (MOTW), entfernbar über Unblock-File -Path C:\Pfad\Lib.dll.
  • Native Abhängigkeit fehlt: System.DllNotFoundException („Unable to load DLL ‚X‘: …“) oder BadImageFormatException bei P/Invoke zeigt Probleme im nativen Suchpfad, fehlende VC++-Runtime oder Architektur-Mismatch; Kontextprüfung über [Environment]::Is64BitProcess
    $env:PATH und die Bitness des Hosts (pwsh.exe vs. powershell.exe).
  • Typinitialisierung und Side Effects: System.TypeInitializationException („Der Typeninitialisierer … hat eine Ausnahme verursacht.“) verdeckt häufig IO/Registry/Interop-Fehler im statischen Konstruktor; die Ursache steht fast immer in $_.Exception.InnerException, nicht in der äußeren Meldung.

Bei Versionskonflikten ist die Fehlinterpretation besonders verbreitet: „Methode nicht gefunden“ kann eine echte API-Inkompatibilität sein, aber ebenso ein Indiz dafür, dass eine andere Assembly-Version aus einem unerwarteten Pfad geladen wurde. In PowerShell treten solche Situationen häufig auf, wenn Module eigene bin-Verzeichnisse mitbringen und mehrere Module denselben Abhängigkeitsnamen enthalten. Dann entscheidet der Load-Kontext beziehungsweise die Reihenfolge der ersten Bindung, welche DLL im Prozess „gewinnt“.

Diagnose im PowerShell-Kontext: reproduzierbar, komponentenbezogen, ohne Fehlinterpretationen

Eine belastbare Analyse folgt der Kette: PowerShell-Wrapper → .NET-Exception-Typ → InnerException → Code (HResult/Win32) → verantwortliche Komponente (Modulauflösung, CLR-Loader, Windows Loader, COM). Die Meldung allein ist selten stabil, da sie lokalisiert sein kann und sich je nach Host (Konsole, ISE, VS Code, Task Scheduler, Dienstkonto, Remoting) ändert. Aussagen zur Ursache sollten sich daher auf Typ, Code und Kontextparameter stützen: Prozessarchitektur, Token/Rechte, Suchpfade und geladene Module/Assemblies.

  • ErrorRecord zerlegen: $e = $_
    $e.Exception.GetType().FullName
    $e.Exception.HResult
    $e.Exception.InnerException zur Trennung von PowerShell-Hülle und .NET-Ursache.
  • Loader-Sammelfehler auswerten: $e.Exception.LoaderExceptions | ForEach-Object { $_.GetType().FullName + ': ' + $_.Message } bei System.Reflection.ReflectionTypeLoadException, um jede einzelne fehlende Abhängigkeit sichtbar zu machen.
  • Kontextparameter festhalten: $PSVersionTable
    [Environment]::Version
    [Environment]::Is64BitProcess
    whoami /groups zur Einordnung, ob ein Fehler durch Runtime-/Host-Unterschiede, Bitness oder Berechtigungen getrieben ist.

Wie hilfreich war dieser Beitrag?

Klicke auf die Sterne um zu bewerten!

Es tut uns leid, dass der Beitrag für dich nicht hilfreich war!

Lasse uns diesen Beitrag verbessern!

Wie können wir diesen Beitrag verbessern?

Meroth IT-Service ist Ihr lokaler IT-Dienstleister in Frankfurt am Main für kleine Unternehmen, Selbstständige und Privatkunden


Kostenfreie Ersteinschätzung Ihres Anliegens?

❱ Nehmen Sie gerne Kontakt auf ❰

Werbung

Lenovo Legion 5 Gaming Laptop | 16" WQXGA 16:10 Display | 240Hz | Intel Core i9-14900HX | 16GB RAM | 1TB SSD | NVIDIA GeForce RTX 4060 TGP 140W | G-sync | QWERTZ | grau | AI Chip LA1ℹ︎
Kein Angebot verfügbar.
Apple MacBook Air (13", Apple M4 Chip mit 10‑Core CPU und 8‑Core GPU, 16GB Gemeinsamer Arbeitsspeicher, 256 GB) - Polarsternℹ︎
€ 888,00
Auf Lager
Preise inkl. MwSt., zzgl. Versandkosten
€ 888,00
Preise inkl. MwSt., zzgl. Versandkosten
€ 942,00
Preise inkl. MwSt., zzgl. Versandkosten
UGREEN Nexode USB C Ladegerät 100W 5-Port GaN Netzteil Mehrfach PD Charger Multiports unterstützt PPS 45W kompatibel mit MacBook Pro/Air, HP Laptop, iPad Serien, iPhone 17, 16 Pro, Galaxy S25ℹ︎
Ersparnis 36%
UVP**: € 54,99
€ 34,98
Auf Lager
Preise inkl. MwSt., zzgl. Versandkosten
tado° smartes Heizkörperthermostat 3er-Pack – Wifi Zusatzprodukt als Thermostat für Heizung und digitale Einzelraumsteuerung per App – einfache Installation – Heizkosten sparenℹ︎
Ersparnis 30%
UVP**: € 239,99
€ 167,42
Auf Lager
Preise inkl. MwSt., zzgl. Versandkosten
UGREEN Revodok Pro 106 10Gbps USB C Hub HDMI 4K@60Hz USB C Adapter mit USB 3.2 PD 100W Kompatibel mit iPhone 17/16 Serie, iPad Pro/Air, Mac mini M4/M4 Pro, Steam Deck usw.ℹ︎
Ersparnis 20%
UVP**: € 19,99
€ 15,99
Auf Lager
Preise inkl. MwSt., zzgl. Versandkosten
SanDisk WD Blue SN5000 SSD 4TB M.2 PCIe Gen4 NVMe Internes Solid-State-Moduleℹ︎
€ 399,00
Preise inkl. MwSt., zzgl. Versandkosten
€ 411,96
Gewöhnlich versandfertig in 2 bis 3 Tagen
Preise inkl. MwSt., zzgl. Versandkosten
€ 419,19
Preise inkl. MwSt., zzgl. Versandkosten
Crucial X10 Pro 1TB Portable SSD Festplatte mit USB-A Adapter, bis zu 2100MB/s Lesen und 2000MB/s Schreiben, Externe SSD, PC und Mac, USB-C 3.2 - CT1000X10PROSSD902ℹ︎
Ersparnis 5%
UVP**: € 115,89
€ 109,56
Auf Lager
Preise inkl. MwSt., zzgl. Versandkosten
NETGEAR GS308E Managed Switch 8 Port Gigabit Ethernet LAN Switch Plus (Plug-and-Play Netzwerk Switch Managed, IGMP Snooping, QoS, VLAN, lüfterlos, Robustes Metallgehäuse) Schwarzℹ︎
Ersparnis 12%
UVP**: € 33,99
€ 29,90
Auf Lager
Preise inkl. MwSt., zzgl. Versandkosten
€ 29,90
Preise inkl. MwSt., zzgl. Versandkosten
€ 30,90
Preise inkl. MwSt., zzgl. Versandkosten
HP N9K06AE 304 Tintenpatrone Druckerpatrone, Schwarz, Standardℹ︎
€ 18,78
Auf Lager
Preise inkl. MwSt., zzgl. Versandkosten
€ 31,90
Preise inkl. MwSt., zzgl. Versandkosten
€ 32,99
Preise inkl. MwSt., zzgl. Versandkosten
HP 301 Schwarz Original Druckerpatroneℹ︎
Ersparnis 12%
UVP**: € 25,99
€ 23,00
Auf Lager
Preise inkl. MwSt., zzgl. Versandkosten
€ 23,99
Preise inkl. MwSt., zzgl. Versandkosten
€ 36,95
Preise inkl. MwSt., zzgl. Versandkosten
FRITZ!Box 5690 Pro (Wi-Fi 7 Premium DSL- und Glasfaser-Router mit Triband (2,4 GHz, 5 GHz, 6 GHz) bis zu 18,5 GBit/s, für Glasfaser & DSL-Anschlüsse, WLAN Mesh, DECT-Basis, internationale Version)ℹ︎
€ 353,38
Auf Lager
Preise inkl. MwSt., zzgl. Versandkosten
Crucial T700 SSD mit Kühlkörper 1TB M.2 PCIe Gen5 NVMe Internes Solid-State-Moduleℹ︎
€ 139,00
Preise inkl. MwSt., zzgl. Versandkosten
€ 167,07
Preise inkl. MwSt., zzgl. Versandkosten
€ 168,38
Auf Lager
Preise inkl. MwSt., zzgl. Versandkosten
HP Laptop mit 17,3" FHD Display, AMD Ryzen 3 7320U, 8 GB DDR5 RAM, 512 GB SSD, AMD Radeon-Grafik, Windows 11, QWERTZ, Schwarz inkl. 25 GB Dropbox-Speicher für 12 Monateℹ︎
Kein Angebot verfügbar.
UGREEN Nexode USB C Ladegerät 65W GaN Netzteil 3-Port PD Charger 60W PPS kompatibel mit MacBook Pro/Air, iPhone 17 Pro Max/16/15, iPads, Galaxy S24 Ultra/S23/S22(Schwarz)ℹ︎
Ersparnis 4%
UVP**: € 34,99
€ 33,43
Auf Lager
Preise inkl. MwSt., zzgl. Versandkosten
FRITZ!Box 5690 Pro (Wi-Fi 7 Premium DSL- und Glasfaser-Router mit Triband (2,4 GHz, 5 GHz, 6 GHz) bis zu 18,5 GBit/s, für Glasfaser & DSL-Anschlüsse, WLAN Mesh, DECT-Basis, deutschsprachige Version)ℹ︎
Ersparnis 22%
UVP**: € 369,00
€ 289,00
Auf Lager
Preise inkl. MwSt., zzgl. Versandkosten
Anker 140W USB-C Ladegerät, Laptop Ladegerät, 4-Port Multi-Geräte Schnellladeleistung, Fortschrittliches GaN Netzteil, Touch Control, Kompatibel mit MacBook, iPhone 17/16/15, Samsung, Pixel und mehrℹ︎
€ 89,99
Auf Lager
Preise inkl. MwSt., zzgl. Versandkosten
ℹ︎ Werbung / Affiliate-Links: Wenn Sie auf einen dieser Links klicken und einkaufen, erhalte ich eine Provision. Für Sie verändert sich der Preis dadurch nicht. Zuletzt aktualisiert am 31. Dezember 2025 um 3:53. Die hier gezeigten Preise können sich zwischenzeitlich auf der Seite des Verkäufers geändert haben. Alle Angaben ohne Gewähr.
(**) UVP: Unverbindliche Preisempfehlung

Preise inkl. MwSt., zzgl. Versandkosten
Nach oben scrollen