about_Logging_Windows

简短说明

PowerShell 将引擎、提供程序和 cmdlet 的内部操作记录到 Windows 事件日志。

长说明

PowerShell 记录有关 PowerShell 操作(例如启动和停止引擎与提供程序,以及执行 PowerShell 命令)的详细信息。

有关在 Windows PowerShell 5.1 中日志记录的信息,请参阅 about_Logging

PowerShell 支持配置两类日志记录:

  • 模块日志记录 - 记录指定模块成员的管道执行事件。 必须为会话和特定模块启用模块日志记录。 有关配置此日志记录的详细信息,请参阅 about_PowerShell_Config

    如果通过配置启用模块日志记录,可以通过设置模块的 LogPipelineExecutionDetails 属性的值,为会话中的特定模块启用和禁用日志记录。

    例如,若要为 PSReadLine 模块启用模块日志记录,请执行以下操作:

    $psrl = Get-Module PSReadLine
    $psrl.LogPipelineExecutionDetails = $true
    Get-Module PSReadline | Select-Object Name, LogPipelineExecutionDetails
    
    Name       LogPipelineExecutionDetails
    ----       ---------------------------
    PSReadLine                        True
    
  • 脚本块日志记录 - 记录命令、脚本块、函数和脚本的处理,无论是以交互方式调用还是通过自动化调用。

    启用脚本块日志记录后,PowerShell 会记录它处理的所有脚本块的内容。 启用后,任何新的 PowerShell 会话都会记录此信息。 有关详细信息,请参阅 “启用脚本块日志记录”。

在 Windows 上注册 PowerShell 事件提供程序

与 Linux 或 macOS 不同,Windows 要求先注册事件提供程序,然后才能将事件写入事件日志。 若要启用 PowerShell 事件提供程序,请从提升的 PowerShell 提示符运行以下命令。

$PSHOME\RegisterManifest.ps1

在 Windows 上查看 PowerShell 事件日志条目

可以使用 Windows 事件查看器查看 PowerShell 日志。 事件日志位于“应用程序和服务日志”组中,名称为 PowerShellCore。 关联的 ETW 提供程序 GUID 是 {f90714a8-5509-434a-bf6d-b1624c8a19a2}

启用脚本块日志记录后,PowerShell 会将以下事件记录到 PowerShellCore/Operational 日志中

字段
EventId 4104 / 0x1008
通道 Operational
Level Verbose
操作码 Create
任务 CommandStart
关键字 Runspace

在 Windows 上取消注册 PowerShell 事件提供程序

注册事件提供程序会在用于解码事件的二进制文件库中放置一个锁。 若要更新此库,必须取消注册提供程序以释放此锁。

若要取消注册 PowerShell 提供程序,请从提升的 PowerShell 提示符运行以下命令。

$PSHOME\RegisterManifest.ps1 -Unregister

更新 PowerShell 后,运行 $PSHOME\RegisterManifest.ps1 以注册更新的事件提供程序。

启用脚本块日志记录

启用脚本块日志记录后,PowerShell 会记录它处理的所有脚本块的内容。 启用后,任何新的 PowerShell 会话都会记录此信息。

注意

将脚本块日志记录用于诊断以外的任何目的时,建议启用受保护事件日志记录,如下所述。

可以通过组策略或注册表设置启用脚本块日志记录。

使用组策略

若要启用自动听录,请通过“管理模板”->“PowerShell Core”在组策略中启用“打开 PowerShell 脚本块日志记录”功能

使用注册表

运行以下函数:

function Enable-PSScriptBlockLogging {
    $basePath = @(
        'HKLM:\Software\Policies\Microsoft'
        'PowerShellCore\ScriptBlockLogging'
    ) -join '\'

    if (-not (Test-Path $basePath)) {
        $null = New-Item $basePath -Force
    }

    Set-ItemProperty $basePath -Name EnableScriptBlockLogging -Value "1"
}

使用 PowerShell 配置文件

可以在文件中设置 ScriptBlockLogging 用于控制 PowerShell 行为方式的选项 powershell.config.json 。 有关详细信息,请参阅 about_PowerSHell_Config

受保护事件日志记录

提高系统的日志记录级别会增加记录的内容包含敏感数据的可能性。 例如,启用脚本日志记录后,脚本使用的凭据或其他敏感数据可能会写入事件日志。 当记录敏感数据的计算机遭到入侵后,日志可为攻击者提供扩大其影响范围所需的信息。

为了保护这些信息,Windows 10 引入了受保护事件日志记录。 受保护事件日志记录允许参与的应用程序加密写入事件日志的敏感数据。 以后,可以在更安全的集中化日志收集器上解密和处理这些日志。

将使用 IETF 加密消息语法 (CMS) 标准保护事件日志内容。 CMS 使用公钥加密。 用于加密内容和解密内容的密钥是分开保存的。

公钥可以广泛共享,并非敏感数据。 用该公钥加密的任何内容只能通过私钥解密。 有关公钥加密的详细信息,请参阅维基百科- 公钥加密

若要启用受保护事件日志记录策略,请将公钥部署到包含要保护的事件日志数据的所有计算机。 相应的私钥用于在更安全的位置(例如中心事件日志收集器或 SIEM 聚合器)对事件日志进行后处理。 可以在 Azure 中设置 SIEM。 有关详细信息,请参阅通用 SIEM 集成

通过组策略启用受保护事件日志记录

若要启用受保护事件日志记录,请通过 Administrative Templates -> Windows Components -> Event Logging 在组策略中启用 Enable Protected Event Logging 功能。 此设置需要加密证书,可以通过以下几种形式之一提供该证书:

  • Base-64 编码的 X.509 证书的内容(例如,由证书管理器中的 Export 选项提供)。
  • 可以在本地计算机证书存储中找到的证书的指纹(可以由 PKI 基础结构部署)。
  • 证书的完整路径(可以是本地位置或远程共享)。
  • 包含一个或多个证书的目录的路径(可以是本地位置,也可以是远程共享)。
  • 可以在本地计算机证书存储中找到的证书的使用者名称(可以由 PKI 基础结构部署)。

生成的证书必须将 Document Encryption 作为增强型密钥用法 (1.3.6.1.4.1.311.80.1),并且启用 Data EnciphermentKey Encipherment 密钥用法。

警告

不应将私钥部署到计算机日志记录事件。 应将它保存在解密消息的安全位置。

解密受保护事件日志记录消息

假设你拥有私钥,以下脚本将检索并解密事件:

Get-WinEvent Microsoft-Windows-PowerShell/Operational |
    Where-Object Id -eq 4104 |
    Unprotect-CmsMessage

另请参阅