从本地和远程计算机上的事件日志和事件跟踪日志文件中获取事件。

语法

Get-WinEvent [-LogName] <string[]> [-ComputerName <string>] [-Credential <PSCredential>] [-FilterXPath <string>] [-Force <switch>] [-MaxEvents <int64>] [-Oldest] [<CommonParameters>]

Get-WinEvent [-Path] <string[]> [-ComputerName <string>] [-Credential <PSCredential>] [-FilterXPath <string>] [-Force <switch>] [-MaxEvents <int64>] [-Oldest] [<CommonParameters>]

Get-WinEvent [-ProviderName] <string[]> [-ComputerName <string>] [-Credential <PSCredential>] [-FilterXPath <string>] [-Force <switch>] [-MaxEvents <int64>] [-Oldest] [<CommonParameters>]

Get-WinEvent -FilterHashTable <Hashtable[]> [-ComputerName <string>] [-Credential <PSCredential>] [-Force <switch>] [-MaxEvents <int64>] [-Oldest] [<CommonParameters>]

Get-WinEvent [-ListLog] <string[]> [-ComputerName <string>] [-Credential <PSCredential>] [<CommonParameters>]

Get-WinEvent [-ListProvider] <string[]> [-ComputerName <string>] [-Credential <PSCredential>] [<CommonParameters>]

Get-WinEvent -FilterXml <XmlDocument> [-ComputerName <string>] [-Credential <PSCredential>] [-Force <switch>] [-MaxEvents <int64>] [-Oldest] [<CommonParameters>]

说明

Get-WinEvent cmdlet 从包括传统日志(例如系统日志和应用程序日志)在内的事件日志和 Windows Vista 中引入的新 Windows 事件日志技术生成的事件日志中获取事件。它还获取 Windows 事件跟踪 (ETW) 生成的日志文件中的事件。

如果没有参数,则 Get-WinEvent 命令获取计算机上的所有事件日志中的所有事件。若要中断此命令,请按 Ctrl+C。

Get-WinEvent 还列出事件日志和事件日志提供程序。可以从选定日志中或者从选定事件提供程序生成的日志中获取事件。并且可以将来自多个源的事件组合在一个命令中。Get-WinEvent 允许使用 XPath 查询、结构化 XML 查询和简化的哈希表查询来筛选事件。

注意:Get-WinEvent 要求 Windows Vista、Windows Server 2008 R2 或更高版本的 Windows,并且要求 Microsoft .NET Framework 3.5 或更高版本。

参数

-ComputerName <string>

从指定计算机上的事件日志中获取事件。键入计算机的 NetBIOS 名称、Internet 协议 (IP) 地址或完全限定的域名。默认值为本地计算机。

此参数一次仅接受一个计算机名称。要在多台计算机上查找事件日志或事件,请使用 ForEach 语句。有关此参数的详细信息,请参阅示例。

若要从远程计算机获取事件和事件日志,则事件日志服务的防火墙端口必须配置为允许远程访问。

此参数不依赖于 Windows PowerShell 远程处理。即使您的计算机未配置为运行远程命令,您也可以使用 ComputerName 参数。

是否为必需?

false

位置?

named

默认值

是否接受管道输入?

false

是否接受通配符?

false

-Credential <PSCredential>

指定有权执行此操作的用户帐户。默认值为当前用户。

键入用户名,例如 User01 或 Domain01\User01。或者,输入 PSCredential 对象,例如由 Get-Credential cmdlet 生成的对象。如果键入用户名,则将提示您输入密码。如果只键入参数名,则将提示您输入用户名和密码。

是否为必需?

false

位置?

named

默认值

Current user

是否接受管道输入?

false

是否接受通配符?

false

-FilterHashTable <Hashtable[]>

使用哈希表格式的查询来从一个或多个事件日志中选择事件。该查询包含具有一个或多个键-值对的哈希表。

哈希表查询具有下列规则:

-- 键和值不区分大小写。

-- 通配符仅在与 LogName 和 ProviderName 键关联的值中有效。

-- 每个键只能在每个哈希表中列出一次。

-- Path 值接受 .etl、.evt 和 .evtx 日志文件的路径。

-- LogName、Path 和 ProviderName 键可用在同一查询中。

-- UserID 键可接受有效的安全标识符 (SID) 或可用于构建有效的 System.Security.Principal.NTAccount 对象的域帐户名。

-- Data 值接受未命名字段中的事件数据。这针对传统事件日志中的事件。

-- * 键表示命名事件数据字段。

当 Get-WinEvent 无法解释键-值对时,它将该键解释为事件中事件数据的区分大小写的名称。

有效的键-值对如下所示:

-- LogName=<String[]>

-- ProviderName=<String[]>

-- Path=<String[]>

-- Keywords=<Long[]>

-- ID=<Int32[]>

-- Level=<Int32[]>

-- StartTime=<DateTime>

-- EndTime=<DataTime>

-- UserID=<SID>

-- Data=<String[]>

-- *=<String[]>

是否为必需?

true

位置?

named

默认值

是否接受管道输入?

true (ByValue)

是否接受通配符?

false

-FilterXml <XmlDocument>

使用结构化 XML 查询来从一个或多个事件日志中选择事件。

若要生成有效的 XML 查询,请使用事件查看器中的“创建自定义视图”和“筛选当前日志”功能。使用对话框中的项目来创建查询,然后单击 XML 选项卡,以 XML 格式查看该查询。您可以将 XML 选项卡中的 XML 复制到 FilterXml 参数的值中。有关事件查看器功能的详细信息,请参阅事件查看器帮助。

通常,使用 XML 查询来创建包含多个 XPath 语句的复杂查询。XML 格式还允许您使用将事件排除在查询外的“Suppress”XML 元素。有关事件日志查询的 XML 架构的详细信息,请参阅 MSDN (Microsoft Developer Network) 库中的下列主题。

--“Query Schema(查询架构)”:https://go.microsoft.com/fwlink/?LinkId=143685

--“Event Selection(事件选择)”中的“XML Event Queries(XML 事件查询)”:https://go.microsoft.com/fwlink/?LinkID=143608

是否为必需?

true

位置?

named

默认值

是否接受管道输入?

true (ByValue)

是否接受通配符?

false

-FilterXPath <string>

使用 XPath 查询来从一个或多个日志中选择事件。

有关 XPath 语言的详细信息,请参阅 MSDN Library 中“Event Selection(事件选择)”和“XPath Reference(XPath 参考)”中的“Selection Filters(选择筛选器)”。

是否为必需?

false

位置?

named

默认值

是否接受管道输入?

false

是否接受通配符?

false

-Force <switch>

获取调试日志和分析日志以及其他事件日志。如果 name 参数的值包含通配符,则需要使用 Force 参数才能获取调试日志或分析日志。

默认情况下,除非指定调试日志或分析日志的全名,否则 Get-WinEvent 不包括这些日志。

是否为必需?

false

位置?

named

默认值

Debugging and analytic logs are not returned in response to queries that use wildcard characters.

是否接受管道输入?

false

是否接受通配符?

false

-ListLog <string[]>

获取指定的事件日志。以逗号分隔的列表形式输入事件日志名称。允许使用通配符。若要获取所有日志,请输入值 *。

是否为必需?

true

位置?

1

默认值

是否接受管道输入?

false

是否接受通配符?

true

-ListProvider <string[]>

获取指定的事件日志提供程序。事件日志提供程序是将事件写入事件日志中的程序或服务。

以逗号分隔的列表形式输入提供程序名称。允许使用通配符。若要获取计算机上所有事件日志的提供程序,请输入值 *。

是否为必需?

true

位置?

1

默认值

是否接受管道输入?

false

是否接受通配符?

true

-LogName <string[]>

从指定的事件日志中获取事件。以逗号分隔的列表形式输入事件日志名称。允许使用通配符。还可以将日志名称通过管道传送到 Get-WinEvent。

是否为必需?

true

位置?

1

默认值

是否接受管道输入?

true (ByValue)

是否接受通配符?

true

-MaxEvents <int64>

指定 Get-WinEvent 返回的事件的最大数目。输入一个整数。默认设置为返回日志或文件中的所有事件。

是否为必需?

false

位置?

named

默认值

All events

是否接受管道输入?

false

是否接受通配符?

false

-Oldest

按从旧到新的顺序返回事件。默认情况下,事件按从新到旧的顺序返回。

当从 .etl 和 .evt 文件以及从调试日志和分析日志中获取事件时,此参数是必需的。在这些文件中,事件按从旧到新的顺序记录,并且只能按从旧到新的顺序返回。

是否为必需?

false

位置?

named

默认值

是否接受管道输入?

false

是否接受通配符?

false

-Path <string[]>

从指定的事件日志文件中获取事件。在逗号分隔列表中输入日志文件的路径,或使用通配符来创建文件路径模式。

Get-WinEvent 支持文件扩展名为 .evt、.evtx 和 .etl 的文件。可以在同一命令中包含来自不同文件和文件类型的事件。

是否为必需?

true

位置?

1

默认值

是否接受管道输入?

false

是否接受通配符?

true

-ProviderName <string[]>

获取指定的事件日志提供程序编写的事件。以逗号分隔的列表形式输入提供程序名称,或使用通配符来创建提供程序名称模式。

事件日志提供程序是将事件写入事件日志中的程序或服务。它不是 Windows PowerShell 提供程序。

是否为必需?

true

位置?

1

默认值

是否接受管道输入?

false

是否接受通配符?

true

<CommonParameters>

此 cmdlet 支持通用参数:-Verbose、-Debug、-ErrorAction、-ErrorVariable、-OutBuffer 和 -OutVariable。有关详细信息,请参阅 about_Commonparameters.

输入和输出

输入类型是指可通过管道传递给 cmdlet 的对象的类型。返回类型是指 Cmdlet 所返回对象的类型。

输入

System.String、System.Xml.XmlDocument、System.Collections.Hashtable。

可以将 LogName(字符串)、FilterXML 查询或 FilterHashTable 查询通过管道传送到 Get-WinEvent。

输出

System.Diagnostics.Eventing.Reader.EventLogConfiguration、System.Diagnostics.Eventing.Reader.EventLogRecord、System.Diagnostics.Eventing.Reader.ProviderMetadata

如果使用 ListLog 参数,则 Get-WinEvent 返回 System.Diagnostics.Eventing.Reader.EventLogConfiguration 对象。如果使用 ListProvider 参数,则 Get-WinEvent 返回 System.Diagnostics.Eventing.Reader.ProviderMetadata 对象。使用所有其他参数,Get-WinEvent 返回 System.Diagnostics.Eventing.Reader.EventLogRecord 对象。

说明

Get-WinEvent 用于替代运行 Windows Vista 及更高版本的 Windows 的计算机上的 Get-EventLog cmdlet。Get-EventLog 只获取传统事件日志中的事件。Windows PowerShell 2.0 为 Windows Vista 以前的系统保留了 Get-EventLog。

示例 1

C:\PS>get-winevent -listlog  *

说明
-----------
此命令获取本地计算机上的所有日志。
    
日志按 Get-WinEvent 获取它们的顺序列出。通常首先检索传统日志,然后检索新的 Windows 事件日志。
    
因为通常有一百多个事件日志,所以此参数需要日志名称或名称模式。若要获取所有日志,请使用 *。






示例 2

C:\PS>get-winevent -listlog Setup | format-list -property *

    
    FileSize                       : 69632
    IsLogFull                      : False
    LastAccessTime                 : 2/14/2008 12:55:12 AM
    LastWriteTime                  : 7/9/2008 3:12:05 AM
    OldestRecordNumber             : 1
    RecordCount                    : 3
    LogName                        : Setup
    LogType                        : Operational
    LogIsolation                   : Application
    IsEnabled                      : True
    IsClassicLog                   : False
    SecurityDescriptor             : O:BAG:SYD:(A;;0xf0007;;;SY)(A;
                                     (A;;0x1;;;S-1-5-32-573)
    LogFilePath                    : %SystemRoot%\System32\Winevt\L
    MaximumSizeInBytes             : 1052672
    LogMode                        : Circular
    OwningProviderName             : Microsoft-Windows-Eventlog
    ProviderNames                  : {Microsoft-Windows-WUSA, Micro
    ProviderLevel                  :
    ProviderKeywords               :
    ProviderBufferSize             : 64
    ProviderMinimumNumberOfBuffers : 0
    ProviderMaximumNumberOfBuffers : 64
    ProviderLatency                : 1000
    ProviderControlGuid            :

说明
-----------
这些命令获取表示本地计算机上的传统系统日志的对象。该对象包括有关日志的有用信息,其中包括日志大小、事件日志提供程序、文件路径以及是否已启用日志。






示例 3

C:\PS>get-winevent -listlog * -computername Server01| where {$_.recordcount}

说明
-----------
此命令只获取 Server01 计算机上含有事件的事件日志。许多日志可能是空的。
    
此命令使用 Get-WinEvent 在您使用 ListLog 参数时返回的 EventLogConfiguration 对象的 RecordCount 属性。






示例 4

C:\PS>$s = "Server01", "Server02", "Server03"

C:\PS> foreach ($server in $s) 
     {$server; get-winevent -listlog "Windows PowerShell" -computername $server}

说明
-----------
此示例中的命令获取表示 Server01、Server02 和 Server03 计算机上的 Windows PowerShell 事件日志的对象。因为 ComputerName 参数只接受一个值,所以第二个命令使用 Foreach 关键字。
    
第一个命令将计算机名称保存在 $s 变量中。
    
第二个命令使用 Foreach 语句。对于 $s 变量中的每台计算机,它执行脚本块中(大括号内)的命令。首先,此命令打印计算机的名称。然后,它运行 Get-WinEvent 命令来获取表示 Windows PowerShell 日志的对象。






示例 5

C:\PS>get-winevent -listprovider *

说明
-----------
此命令获取本地计算机上的事件日志提供程序及其写入数据的日志(如果有)。






示例 6

C:\PS>(get-winevent -listlog Application).providernames

说明
-----------
此命令获取向本地计算机上的应用程序日志写入数据的所有提供程序。






示例 7

C:\PS>>get-winevent -listprovider *policy*

说明
-----------
此命令获取其名称包含单词“policy”的事件日志提供程序。






示例 8

C:\PS>(get-winevent -listprovider microsoft-windows-grouppolicy).events | format-table id, description -auto

说明
-----------
此命令列出 Microsoft-Windows-GroupPolicy 事件提供程序生成的事件 ID 以及事件说明。
    
它使用在您使用 ListProvider 参数时 Get-WinEvent 返回的对象的 Events 属性以及 Events 属性中对象的 ID 和 Description 属性。






示例 9

C:\PS>$events = get-winevent -logname "Windows PowerShell"

C:\PS> $events.count
195
    
C:\PS> $events | group-object id -noelement | sort-object count -desc
Count Name
----- ----
  147 600
   22 400
   21 601
    3 403
    2 103
    
 C:\PS> $events | group-object leveldisplayname -noelement
Count Name
----- ----
    2 Warning
  193 Information

说明
-----------
此示例演示如何使用 Get-WinEvent 返回的事件对象的属性来了解事件日志中的事件。
    
第一个命令使用 Get-WinEvent cmdlet 来获取 Windows PowerShell 事件日志中的所有事件。然后,它将所有事件保存在 $events 变量中。日志名称用引号引起,因为它包含空格。
    
第二个命令使用对象集合的 Count 属性来查找事件日志中的项数。
    
第三个命令显示日志中出现的每个事件,首先显示出现频率最高的事件。在此示例中,事件 ID 600 是出现频率最高的事件。
    
第四个命令按项目的 LevelDisplayName 属性的值将项目分组来显示日志中错误、警告和信息事件的数量。






示例 10

C:\PS>get-winevent -logname *disk*, Microsoft-Windows-Kernel-WHEA

说明
-----------
此命令获取计算机上的所有事件日志中以及 Microsoft-Windows-Kernel-WHEA 事件日志中名称包括“disk”的错误事件。






示例 11

C:\PS>get-winevent -path 'c:\ps-test\Windows PowerShell.evtx'

说明
-----------
此命令从测试目录中的 Windows PowerShell 事件日志文件副本中获取事件。路径用引号引起,因为日志名称包含空格。






示例 12

C:\PS>get-winevent -path 'c:\tracing\tracelog.etl' -maxevents 100 -oldest
    
C:\PS> get-winevent -path 'c:\tracing\tracelog.etl' -oldest | sort-object -property timecreated -desc | select-object -first 100

说明
-----------
这些命令从 Windows 事件跟踪 (ETW) 事件跟踪日志文件中获取前 100 个事件。

第一个命令获取日志中 100 个最旧的事件。它使用 Get-WinEvent cmdlet 来从 Tracelog.etl 文件中获取事件。它使用 MaxEvents 参数将检索的事件数限制为 100 个。因为事件是按它们写入日志的顺序(从旧到新)列出的,所以需要 Oldest 参数。

第二个命令获取日志中 100 个最新的事件。它使用 Get-WinEvent cmdlet 来从 Tracing.etl 文件中获取所有事件。它将
事件传递给 Sort-Object cmdlet,后者按 TimeCreated 属性值对它们进行降序排序。然后,它将已排序的事件发送到 Select-Object cmdlet 以选择最新的 100 个事件。






示例 13

C:\PS>get-winevent -path "c:\tracing\tracelog.etl", "c:\Logs\Windows PowerShell.evtx" -oldest | where {$_.id -eq "103"}

说明
-----------
此示例演示如何从事件跟踪日志文件 (.etl) 和保存到测试目录中的 Windows PowerShell 日志文件 (.evtx) 副本获取事件。

可以在单个命令中组合多种文件类型。因为文件包含相同类型的 .NET Framework 对象(EventLogRecord 对象),所以可以使用相同的属性来筛选它们。

请注意,此命令需要 Oldest 参数,因为它从 .etl 文件读取数据,但 Oldest 参数同时应用于两个文件。






示例 14

C:\PS># Use the Where-Object cmdlet
C:\PS> $yesterday = (get-date) - (new-timespan -day 1)
C:\PS> get-winevent -logname "Windows PowerShell" | where {$_.timecreated -ge $yesterday}


# Uses FilterHashTable
C:\PS> $yesterday = (get-date) - (new-timespan -day 1)
C:\PS> get-winevent -FilterHashTable @{LogName='Windows PowerShell'; Level=3; StartTime=$yesterday}


# Use FilterXML
C:\PS> get-winevent -FilterXML "<QueryList><Query><Select Path='Windows PowerShell'>*[System[Level=3 and TimeCreated[timediff(@SystemTime) <= 86400000]]]</Select></Query></QueryList>"


# Use FilterXPath
C:\PS> get-winevent -LogName "Windows Powershell" -FilterXPath "*[System[Level=3 and TimeCreated[timediff(@SystemTime) <= 86400000]]]"

说明
-----------
此示例演示用于从事件日志中选择事件的不同筛选方法。所有这些命令都从 Windows PowerShell 事件日志中获取过去 24 小时内发生的事件。

使用筛选方法比使用 Where-Object cmdlet 效率高,因为在检索对象时将应用筛选器,而不是先检索所有对象然后再筛选它们。

因为日期难以用 XML 和 XPath 格式表示,所以为了创建日期的 XML 内容,将使用事件查看器的“筛选当前日志”功能。有关此功能的详细信息,请参阅事件查看器帮助。






示例 15

C:\PS>$date = (get-date).AddDays(-2)
    
C:\PS> $events = get-winevent -FilterHashTable @{ logname = "Microsoft-Windows-Diagnostics-Performance/Operational"; StartTime = $date; ID = 100 }

说明
-----------
此示例使用筛选器哈希表来从性能日志中获取事件。
    
第一个命令使用 Get-Date cmdlet 和 AddDays 方法来获取当前日期的两天前的日期。它将该日期保存在 $date 变量中。
    
第二个命令使用具有 FilterHashTable 参数的 Get-WinEvent cmdlet。哈希表中的键定义从性能日志中选择过去两天内发生的且事件 ID 为 100 的事件的筛选器。
    
LogName 键指定事件日志,StartTime 键指定日期,ID 键指定事件 ID。






示例 16

C:\PS>$starttime = (get-date).adddays(-7)        
    
C:\PS> $ie-error = Get-WinEvent -FilterHashtable @{logname="application"; providername="Application Error"; data="iexplore.exe"; starttime=$starttime}

说明
-----------
此示例使用筛选器哈希表来查找上周发生的 Internet Explorer 应用程序错误。
    
第一个命令获取当前日期的七天前的日期,并将它存储在 $starttime 变量中。
    
第二个命令使用具有 FilterHashTable 参数的 Get-WinEvent cmdlet。哈希表中的键定义从应用程序日志中选择由应用程序错误提供程序编写的且包括短语“iexplore.exe”的事件的筛选器。
    
LogName 键指定事件日志。ProviderName 键指定事件提供程序,StartTime 键指定事件的开始日期,Data 键指定事件消息中的文本。






另请参阅




目录