about_Logging

简短说明

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

长说明

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

注意

Windows PowerShell 5.1(及更早版本)包括 Windows 事件日志的 EventLog cmdlet。 在这些版本中,要显示 EventLog cmdlet 类型的列表:Get-Command -Noun EventLog。 有关详细信息,请参阅适用于你的 Windows PowerShell 版本的 cmdlet 文档和 about_EventLogs

有关 PowerShell 7 中的日志记录的信息,请参阅以下文章:

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

可以使用 Windows 事件查看器查看 PowerShell 日志。 事件日志位于“应用程序和服务日志”组中,名称为 Microsoft-Windows-PowerShell。 关联的 ETW 提供程序 GUID{A0C1853B-5C40-4B15-8766-3CF1C58F985A}

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

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

启用脚本块日志记录

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

注意

若要确保敏感数据受到保护,请使用脚本块日志记录进行除诊断目的以外的任何内容时启用受保护的事件日志记录。

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

使用组策略

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

使用注册表

运行以下函数:

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

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

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

受保护事件日志记录

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

为了保护这些信息,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

另请参阅