Deaktivieren Sie die Windows PowerShell-Ereignisprotokollierung

Deaktivieren Sie die Windows PowerShell-Ereignisprotokollierung

Ich verwende PsExec, um PowerShell-Skripts auf Remotecomputern auszuführen. Als Nebeneffekt davon protokolliert das Ereignisprotokoll „Windows PowerShell“ (zu finden in der Ereignisanzeige unter „Anwendungs- und Dienstprotokolle“) alle unsere Argumente für das Skript unter „HostApplication“. Dies ist ein Problem, da einige dieser Argumente vertrauliche Passwörter enthalten.

Ich habe versucht, die unten aufgeführten Präferenzvariablen auf „false“ zu setzen, aber es werden trotzdem Protokolle erstellt, wenn die PowerShell-Engine gestartet wird. Soweit ich gelesen habe, liegt das daran, dass PowerShell diese Protokolle erstellt, bevor es überhaupt den Wert dieser Präferenzvariablen überprüft.

$LogEngineLifeCycleEvent=$false;
$LogEngineHealthEvent=$false;
$LogProviderLifeCycleEvent=$false;
$LogProviderHealthEvent=$false;

Unsere aktuelle Lösung verwendet diese Präferenzvariablen in Kombination mit der folgenden Zeile am Anfang jedes unserer PowerShell-Skripts, um sicherzustellen, dass die beim Starten der PowerShell-Engine erstellten Protokolle gelöscht werden.

Clear-EventLog "Windows PowerShell";

Diese Lösung ist in Ordnung, aber ich möchte es so weit bringen, dass unsere Passwörter nie im Protokoll gespeichert werden und das Protokoll nie gelöscht werden muss. Gibt es eine Möglichkeit, die PowerShell-Protokollierung zu deaktivieren, sodass zu KEINEM Zeitpunkt im Lebenszyklus der PowerShell-Engine Ereignisse erstellt werden?

Antwort1

Ich denke folgendesLokale Gruppenrichtliniensind das, was Sie brauchen, insbesondere das zweite:


Modulprotokollierung aktivieren

Wenn dudeaktivierenMit dieser Richtlinieneinstellung wird die Protokollierung von Ausführungsereignissen für alle Windows PowerShell-Module deaktiviert. Das Deaktivieren dieser Richtlinieneinstellung für ein Modul entspricht dem Festlegen der Eigenschaft LogPipelineExecutionDetails des Moduls auf „False“.


Aktivieren Sie die PowerShell-Blockprotokollierung

Diese Richtlinieneinstellung aktiviert die Protokollierung aller PowerShell-Skripteingaben in Microsoft-Windows-PowerShell/OperationalEreignisprotokollWenn Sie diese Richtlinieneinstellung aktivieren, protokolliert Windows PowerShell die Verarbeitung von Befehlen, Skriptblöcken, Funktionen und Skripts – unabhängig davon, ob sie interaktiv oder automatisiert aufgerufen werden.

Wenn dudeaktivierenMit dieser Richtlinieneinstellung wird die Protokollierung von PowerShell-Skripteingaben deaktiviert.


  1. Drücken SieWin+R
  2. Typgpedit.msc
  3. Gehe zuComputer Configuration -> Administrative Templates -> Windows Components -> Windows PowerShell

  1. Konfigurieren Sie dann die oben erläuterten Einstellungen

Antwort2

Ich hatte das gleiche Problem und habe diese Funktion zum Löschen des Ereignisprotokolls geschrieben.

Function Remove-PowerShellEventLog {
    Write-ToLog -Message 'Remove the PowerShell event log'
    # Function constants
    $PowerShellKey = 'SYSTEM\CurrentControlSet\Services\EventLog\Windows PowerShell'
    $Admins = 'BUILTIN\Administrators'
    $ReadWriteSubTree = [Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree
    $TakeOwnership = [System.Security.AccessControl.RegistryRights]::TakeOwnership
    $ChangePermissions = [System.Security.AccessControl.RegistryRights]::ChangePermissions

    # Define a C# type using P/Invoke and add it
    # Code borrowed from https://www.remkoweijnen.nl/blog/2012/01/16/take-ownership-of-a-registry-key-in-powershell/
    $Definition = @"
    using System;
    using System.Runtime.InteropServices; 

    namespace Win32Api
    {

        public class NtDll
        {
            [DllImport("ntdll.dll", EntryPoint="RtlAdjustPrivilege")]
            public static extern int RtlAdjustPrivilege(ulong Privilege, bool Enable, bool CurrentThread, ref bool Enabled);
        }
    }
"@
    Add-Type -TypeDefinition $Definition -PassThru

    # Enable SeTakeOwnershipPrivilege
    $Res = [Win32Api.NtDll]::RtlAdjustPrivilege(9, $True, $False, [ref]$False)

    # Open the registry key with Take Ownership rights and change the owner to Administrators
    $Key = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey("$PowerShellKey\PowerShell", $ReadWriteSubTree, $TakeOwnership)
    $Acl = $Key.GetAccessControl()
    $Acl.SetOwner([System.Security.Principal.NTAccount]$Admins)
    $Key.SetAccessControl($Acl)

    # Re-open the key with Change Permissions rights and grant Administrators Full Control rights
    $Key = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey("$PowerShellKey\PowerShell", $ReadWriteSubTree, $ChangePermissions)
    $Acl = $Key.GetAccessControl()
    $Rule = New-Object System.Security.AccessControl.RegistryAccessRule ($Admins, 'FullControl', 'Allow')
    $Acl.SetAccessRule($Rule)
    $Key.SetAccessControl($Acl)

    # Remove the parent and subkeys
    Remove-Item -Path "HKLM:\$PowerShellKey" -Force -Recurse

    # Restart the Event Log service to enforce changes
    Restart-Service EventLog -Force
}

verwandte Informationen