禁用 Windows Powershell 事件日志记录

禁用 Windows Powershell 事件日志记录

我正在使用 PsExec 在远程计算机上运行 PowerShell 脚本,这样做的副作用是,“Windows PowerShell”事件日志(在“应用程序和服务日志”下的事件查看器中找到)正在将我们向“HostApplication”下的脚本发送的所有参数记录下来。这是一个问题,因为其中一些参数包含敏感密码。

我尝试将下面列出的首选项变量设置为 false,但它仍会在 PowerShell 引擎启动时创建日志。据我所知,这是因为 PowerShell 在检查这些首选项变量的值之前就创建了这些日志。

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

我们当前的解决方案使用这些首选项变量并在每个 PowerShell 脚本的开头放置以下行,以确保清除 PowerShell 引擎启动时创建的日志。

Clear-EventLog "Windows PowerShell";

这个解决方案不错,但我希望达到这样的程度:我们的密码永远不会保存在日志中,并且日志永远不需要清除。有没有办法禁用 PowerShell 日志记录,以便在 PowerShell 引擎生命周期的任何时间点都不会创建事件?

答案1

我认为本地组策略就是你所需要的,特别是第二个:


开启模块日志记录

如果你禁用此策略设置将禁用所有 Windows PowerShell 模块的执行事件日志记录。禁用模块的此策略设置相当于将模块的 LogPipelineExecutionDetails 属性设置为 False。


打开 PowerShell 阻止日志记录

此策略设置允许将所有 PowerShell 脚本输入记录到 Microsoft-Windows-PowerShell/Operational事件日志。如果启用此策略设置,Windows PowerShell 将记录命令、脚本块、函数和脚本的处理 - 无论是交互调用还是通过自动化调用。

如果你禁用此策略设置将禁用 PowerShell 脚本输入的日志记录。


  1. Win+R
  2. 类型gpedit.msc
  3. Computer Configuration -> Administrative Templates -> Windows Components -> Windows PowerShell

  1. 然后配置上面解释的设置

答案2

我遇到了同样的问题,并编写了这个函数来删除事件日志。

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
}

相关内容