Freigeben über


about_Logging_Non-Windows

Kurze Beschreibung

PowerShell protokolliert interne Vorgänge des Moduls, der Anbieter und der Cmdlets.

Lange Beschreibung

PowerShell protokolliert Details zu PowerShell-Vorgängen, z. B. Starten und Beenden des Moduls und Starten und Beenden von Anbietern. Außerdem werden Details zu PowerShell-Befehlen protokolliert.

Informationen zur Protokollierung in Windows PowerShell 5.1 finden Sie unter about_Logging.

Der Speicherort von PowerShell-Protokollen hängt von der Zielplattform ab.

  • Unter Linux protokolliert PowerShell das systemd journal , das an einen Syslog-Server weitergeleitet werden kann. Weitere Informationen finden Sie auf den man Seiten für Ihre Linux-Verteilung.
  • Unter macOS wird das einheitliche Protokollierungssystem von Apple verwendet. Weitere Informationen finden Sie in der Entwicklerdokumentation von Apple zur Protokollierung.

PowerShell unterstützt das Konfigurieren von zwei Protokollierungskategorien:

  • Modulprotokollierung – Zeichnen Sie die Pipelineausführungsereignisse für Elemente der angegebenen Module auf. Die Modulprotokollierung muss sowohl für die Sitzung als auch für bestimmte Module aktiviert sein. Weitere Informationen zum Konfigurieren dieser Protokollierung finden Sie unter about_PowerShell_Config.

    Wenn die Modulprotokollierung über die Konfiguration aktiviert ist, können Sie die Protokollierung für bestimmte Module in einer Sitzung aktivieren und deaktivieren, indem Sie den Wert der LogPipelineExecutionDetails-Eigenschaft des Moduls festlegen.

    So aktivieren Sie beispielsweise die Modulprotokollierung für das PSReadLine-Modul :

    $psrl = Get-Module PSReadLine
    $psrl.LogPipelineExecutionDetails = $true
    Get-Module PSReadline | Select-Object Name, LogPipelineExecutionDetails
    
    Name       LogPipelineExecutionDetails
    ----       ---------------------------
    PSReadLine                        True
    
  • Skriptblockprotokollierung – Aufzeichnen der Verarbeitung von Befehlen, Skriptblöcken, Funktionen und Skripts, unabhängig davon, ob sie interaktiv oder durch Automatisierung aufgerufen werden.

    Wenn Sie die Skriptblockprotokollierung aktivieren, zeichnet PowerShell den Inhalt aller Skriptblöcke auf, die verarbeitet werden. Nach der Aktivierung protokolliert jede neue PowerShell-Sitzung diese Informationen.

    Hinweis

    Es wird empfohlen, die geschützte Ereignisprotokollierung zu aktivieren, wenn Sie die Skriptblockprotokollierung für andere Zwecke als Diagnosezwecke verwenden. Weitere Informationen finden Sie unter about_PowerShell_Config.

Konfigurieren der Protokollierung unter Linux oder macOS

Die Konfiguration für die Protokollierung unter Linux und macOS wird in der powershell.config.json Datei gespeichert. Die powershell.config.json Datei ist eine JSON-formatierte Datei, die sich im PowerShell-Verzeichnis $PSHOME befindet. Wenn diese Konfigurationsdatei nicht vorhanden ist, müssen Sie sie erstellen, um die Standardeinstellungen zu ändern. Jede Installation von PowerShell verwendet eine eigene Kopie dieser Datei.

Standardmäßig ermöglicht Informational PowerShell die Protokollierung für den Operational Kanal. Sie können die Konfiguration ändern, wenn Sie eine zusätzliche Protokollausgabe benötigen, z. B. ausführlich oder die Analyseprotokollausgabe aktivieren.

Der folgende Code ist eine Beispielkonfiguration:

{
    "ModuleLogging": {
        "EnableModuleLogging": false,
        "ModuleNames": [
            "PSReadLine",
            "PowerShellGet"
        ]
    },
    "ScriptBlockLogging": {
        "EnableScriptBlockInvocationLogging": true,
        "EnableScriptBlockLogging": true
    },
    "LogLevel": "verbose"
}

Im Folgenden finden Sie eine Liste der Eigenschaften zum Konfigurieren der PowerShell-Protokollierung. Wenn die Eigenschaft nicht in der Konfiguration aufgeführt ist, verwendet PowerShell den Standardwert.

  • LogIdentity
    • Werte: <string name>, powershell
    • Beschreibung: Der Name, der bei der Protokollierung verwendet werden soll. Die Standardidentität lautet powershell. Dieser Wert kann verwendet werden, um den Unterschied zwischen zwei Instanzen einer PowerShell-Installation zu ermitteln, z. B. einer Release- und Betaversion. Dieser Wert wird auch verwendet, um die Protokollausgabe an eine separate Datei umzuleiten.
  • LogChannels
    • Werte: Operational, Analytic
    • Beschreibung: Die zu aktivierenden Kanäle. Trennen Sie die Werte durch ein Komma, wenn Sie mehrere angeben. Der Standardwert ist Operational.
  • LogLevel
    • Werte: Always, , Critical, WarningError, Informational, , VerboseDebug
    • Beschreibung: Geben Sie einen einzelnen Wert an. Die Werte werden in der zunehmenden Reihenfolge der Ausführlichkeit aufgeführt. Der von Ihnen ausgewählte Wert aktiviert sich selbst und alle Werte davor. Der Standardwert ist Informational.
  • LogKeywords
    • Werte: Runspace, , Pipeline, Protocol, HostTransport, Cmdlets, , Serializer, SessionManagedPlugin
    • Beschreibung: Schlüsselwörter bieten die Möglichkeit, die Protokollierung auf bestimmte Komponenten in PowerShell zu beschränken. Standardmäßig sind alle Schlüsselwörter aktiviert und ändern diesen Wert nur für spezielle Problembehandlungen.
  • PowerShellPolicies
    • Beschreibung: Die PowerShellPolicies-Einstellung enthält die Optionen "ModuleLogging", "ProtectedEventLogging" und "ScriptBlockLogging" . Weitere Informationen finden Sie unter "Allgemeine Konfigurationseinstellungen".

Anzeigen von PowerShell-Protokolldaten im Journal unter Linux

PowerShell meldet sich mit dem aufgezeichneten Daemon für Linux-Distributionen wie Ubuntu und Red Hat Enterprise Linux (RHEL) beim systemd Journal an.

Der journalierte Daemon speichert Protokollnachrichten in einem Binärformat. Verwenden Sie das journalctl Hilfsprogramm, um das Journalprotokoll für PowerShell-Einträge abzufragen.

journalctl --grep powershell

Der aufgezeichnete Daemon kann Protokollnachrichten an einen Systemprotokollprotokollserver (Syslog) weiterleiten. Aktivieren Sie die ForwardToSysLog Option in der /etc/systemd/journald.conf journalierten Konfigurationsdatei, wenn Sie die Syslog-Protokollierung auf Ihrem Linux-System verwenden möchten. Dies ist die Standardkonfiguration für viele Linux-Distributionen.

Anzeigen von PowerShell-Protokolldaten in Syslog unter Linux

Verwenden Sie den Paket-Manager für Ihre Linux-Verteilung, um einen Syslog-Server wie z. B. rsyslog zu installieren, wenn Sie die Syslog-Protokollierung auf Ihrem Linux-System verwenden möchten. Einige Linux-Distributionen wie Ubuntu vorinstalliert rsyslog.

Das Syslog-Protokoll speichert Protokollmeldungen in einem standardisierten Textformat. Sie können ein beliebiges Hilfsprogramm für die Textverarbeitung verwenden, um Syslog-Inhalte abzufragen oder anzuzeigen.

Standardmäßig schreibt Syslog Protokolleinträge an den folgenden Speicherort:

  • Auf Debian-basierten Distributionen, einschließlich Ubuntu: /var/log/syslog
  • Auf RHEL-basierten Verteilungen: /var/log/messages

Im folgenden Beispiel wird der cat Befehl zum Abfragen von PowerShell-Syslog-Einträgen auf Ubuntu verwendet.

cat /var/log/syslog | grep -i powershell

Syslog-Nachrichtenformat

Syslog-Nachrichten weisen das folgende Format auf:

TIMESTAMP MACHINENAME powershell[PID]: (COMMITID:TID:CID)
  [EVENTID:TASK.OPCODE.LEVEL] MESSAGE
  • TIMESTAMP – Ein Datum/eine Uhrzeit, zu der der Protokolleintrag erstellt wurde.
  • MACHINENAME – Der Name des Systems, in dem das Protokoll erstellt wurde.
  • PID – Die Prozess-ID des Prozesses, der den Protokolleintrag geschrieben hat.
  • COMMITID : Die Git-Commit-ID oder das Tag, das zum Erstellen des Builds verwendet wird.
  • TID – Die Thread-ID des Threads, der den Protokolleintrag geschrieben hat.
  • CID – Der Hexkanalbezeichner des Protokolleintrags.
    • 0x10 = Betriebsbereit
    • 0x11 = Analyse
  • EVENTID – Der Ereignisbezeichner des Protokolleintrags.
  • TASK – Der Vorgangsbezeichner für den Ereigniseintrag
  • OPCODE – Der Opcode für den Ereigniseintrag
  • LEVEL – Die Protokollebene für den Ereigniseintrag
  • MESSAGE – Die Nachricht, die dem Ereigniseintrag zugeordnet ist

EVENTID, TASK, OPCODE und LEVEL sind die gleichen Werte wie beim Anmelden im Windows-Ereignisprotokoll.

Schreiben einer PowerShell-Protokollnachricht in eine separate Datei

Es ist auch möglich, die PowerShell-Protokolleinträge an eine separate Datei umzuleiten. Wenn die PowerShell-Protokolleinträge zu einer separaten Datei umgeleitet werden, werden sie nicht mehr mit der Standard syslog-Datei protokolliert.

Die folgenden Schritte konfigurieren PowerShell-Protokolleinträge auf Ubuntu so, dass sie in eine Protokolldatei mit dem Namen powershell.logschreiben.

  1. Erstellen Sie eine Konfigurationsdatei (conf) für die PowerShell-Protokollkonfiguration im /etc/rsyslog.d Verzeichnis mithilfe eines Textdatei-Editors wie z nano. B. . Stellen Sie dem Dateinamen eine Zahl voran, die kleiner als der Standardwert ist. Beispiel: 40-powershell.conf Dabei ist 50-default.confder Standardwert .

    sudo nano /etc/rsyslog.d/40-powershell.conf
    
  2. Fügen Sie der Datei die folgenden Informationen hinzu 40-powershell.conf :

    :syslogtag, contains, "powershell[" /var/log/powershell.log
    & stop
    
  3. Stellen Sie sicher, dass /etc/rsyslog.conf eine Include-Anweisung für die neue Datei enthalten ist. Es kann eine generische Anweisung haben, die sie enthält, z. B.:

    $IncludeConfig /etc/rsyslog.d/*.conf
    

    Wenn dies nicht der Fehler ist, müssen Sie manuell eine Include-Anweisung hinzufügen.

  4. Überprüfen Sie, ob die Attribute und Berechtigungen entsprechend festgelegt sind.

    ls -l /etc/rsyslog.d/40-powershell.conf
    
    -rw-r--r-- 1 root root   67 Nov 28 12:51 40-powershell.conf
    

    Wenn Ihre 40-powershell.conf Datei über unterschiedliche Besitzrechte oder Berechtigungen verfügt, führen Sie die folgenden Schritte aus:

    1. Legen Sie den Besitz auf stamm fest.

      sudo chown root:root /etc/rsyslog.d/40-powershell.conf
      
    2. Zugriffsberechtigungen festlegen: Stamm hat Lese-/Schreibzugriff, Benutzer haben Lesezugriff.

      sudo chmod 644 /etc/rsyslog.d/40-powershell.conf
      
  5. Starten Sie den rsyslog-Dienst neu.

    sudo systemctl restart rsyslog.service
    
  6. Führen Sie zum Generieren von PowerShell-Informationen zum Protokollieren aus pwsh .

    pwsh
    

    Hinweis

    Die /var/log/powershell.log Datei wird erst erstellt, wenn der rsyslog-Dienst neu gestartet wird und PowerShell Informationen zum Protokollieren generiert.

  7. Fragen Sie die powershell.log Datei ab, um zu überprüfen, ob PowerShell-Informationen in der neuen Datei protokolliert werden.

    cat /var/log/powershell.log
    

Anzeigen von PowerShell-Protokolldaten unter macOS

PowerShell protokolliert das einheitliche Protokollierungssystem von Apple, ein Feature von macOS, das die Sammlung und Speicherung von System- und Anwendungsprotokollen an einem zentralen Ort ermöglicht.

Das einheitliche Protokollierungssystem von Apple speichert Protokollnachrichten im Binärformat. Sie müssen das log Tool verwenden, um das einheitliche Protokollierungssystem für PowerShell-Protokollereignisse abzufragen. Die PowerShell-Protokollereignisse werden in der Konsolenanwendung unter macOS nicht angezeigt. Die Konsolen-App wurde für die ältere syslogbasierte Protokollierung entwickelt, die das einheitliche Protokollierungssystem voraussetzt.

Anzeigen von PowerShell-Protokolldaten über die Befehlszeile unter macOS

Um PowerShell-Protokolldaten über eine Befehlszeile unter macOS anzuzeigen, verwenden Sie den log Befehl in der Terminal - oder anderen Shellhostanwendung. Diese Befehle können über PowerShell, Z Shell oder Bash ausgeführt werden.

Im folgenden Beispiel wird der log Befehl verwendet, um die Protokolldaten in Ihrem System anzuzeigen, da er in Echtzeit auftritt. Der Prozessparameter filtert die Protokolldaten nur für den pwsh Prozess. Wenn mehrere Instanzen pwsh ausgeführt werden, akzeptiert der Prozessparameter auch eine Prozess-ID als Wert. Der Levelparameter zeigt Nachrichten auf der angegebenen Ebene und darunter an.

log stream --predicate "subsystem == 'com.microsoft.powershell'" --level info

Der log show Befehl kann zum Exportieren von Protokollelementen verwendet werden. Der log show Befehl bietet Optionen zum Exportieren der letzten N Elemente, Elemente seit einer bestimmten Zeit oder Elemente innerhalb eines bestimmten Zeitraums.

Der folgende Befehl exportiert z. B. Elemente seit 9am on April 5, 2022:

log show --start "2022-04-05 09:00:00" --predicate "subsystem == 'com.microsoft.powershell'"

Weitere Informationen können Sie ausführen log show --help , um die Hilfe für den log show Befehl anzuzeigen.

Sie können die Protokolldaten auch im JSON-Format ausgeben, sodass Sie die Ereignisdaten in PowerShell-Objekte konvertieren können. Im folgenden Beispiel werden die Ereignisse im JSON-Format ausgegeben. Das ConvertFrom-Json Cmdlet wird verwendet, um die JSON-Daten in PowerShell-Objekte zu konvertieren, die in der $logRecord Variablen gespeichert werden.

log show --predicate "subsystem == 'com.microsoft.powershell'" --style json |
    ConvertFrom-Json | Set-Variable logRecord

Möglicherweise sollten Sie auch erwägen, die Protokolle an einem sichereren Ort wie dem SIEM-Aggregator (Security Information and Event Management) zu speichern. Mit Microsoft Defender für Cloud-Apps können Sie SIEM in Azure einrichten. Weitere Informationen finden Sie unter generische SIEM-Integration.

Modi und Ebenen von PowerShell-Protokolldaten unter macOS

Standardmäßig protokolliert das PowerShell-Subsystem Nachrichten auf Informationsebene im Speicher (Modus) und Standardnachrichten auf Datenträger (Persistenz) unter macOS. Dieses Verhalten kann geändert werden, um einen anderen Modus und eine andere Protokollierungsebene mithilfe des log config Befehls zu aktivieren.

Im folgenden Beispiel wird die Protokollierung und Persistenz auf Informationsebene für das PowerShell-Subsystem aktiviert:

sudo log config --subsystem com.microsoft.powershell --mode level:info,persist:info

Verwenden Sie den Reset-Parameter , um die Protokolleinstellungen auf die Standardwerte für das PowerShell-Subsystem zurückzusetzen:

sudo log config --subsystem com.microsoft.powershell --reset

Siehe auch