Overview
“安装和启动事件收集”是 Windows Server 2016 中的一项新功能,通过它可指定一台收集器计算机,在其他计算机启动或完成安装过程时收集这些计算机上发生的各种重要事件。 然后,可以使用事件查看器、消息分析器、Wevtutil 或 Windows PowerShell cmdlet 分析收集的事件。
以前无法监视这些事件,因为在计算机安装好之前,收集这些事件所需的基础结构并不存在。 可监视的安装程序和启动事件类型包括:
加载内核模块和驱动程序
枚举设备和初始化其驱动程序(包括 CPU 类型等设备)
文件系统的验证和装载
启动可执行文件
启动和完成系统更新
系统可供登录、与域控制器建立连接、服务启动完成和网络共享可用时的点
收集器计算机必须运行 Windows Server 2016(它可以运行于具有桌面体验或服务器核心模式的服务器)。 目标计算机必须运行 Windows 10 或 Windows Server 2016。 You can also run this service on a virtual machine which is hosted on a computer that is not running Windows Server 2016. 已知虚拟化收集器和目标计算机的以下组合可以正常工作:
Virtualization host | 收集器虚拟机 | 目标虚拟机 |
---|---|---|
Windows 8.1 | yes | yes |
Windows 10 | yes | yes |
Windows Server 2016 | yes | yes |
Windows Server 2012 R2 | yes | no |
安装收集器服务
从 Windows Server 2016 开始,事件收集器服务作为可选功能提供。 在此版本中,可以在提升的 Windows PowerShell 提示符下使用 DISM.exe 和此命令进行安装:
dism /online /enable-feature /featurename:SetupAndBootEventCollection
此命令创建名为 BootEventCollector 的服务,并使用空配置文件启动它。
通过检查 get-service -displayname *boot*
确认安装成功。 启动事件收集器应正在运行。 It runs under the Network Service Account and creates an empty configuration file (Active.xml) in %SystemDrive%\ProgramData\Microsoft\BootEventCollector\Config.
还可以在服务器管理器中使用“添加角色和功能”向导安装安装程序和启动事件收集服务。
Configuration
需要配置两个项目来收集安装程序和启动事件。
在将发送事件的目标计算机上(即你要监视其安装程序和启动的计算机上),启用 KDNET/EVENT-NET 传输并启用事件转发。
在收集器计算机上,指定要接受事件的计算机以及保存这些事件的位置。
Note
无法将计算机配置为将启动或启动事件发送到自身。 但是,如果要监视两个计算机,则可以将其配置为将事件相互发送。
配置目标计算机
在每个目标计算机上,首先启用 KDNET/EVENT-NET 传输,然后通过传输启用 ETW 事件发送,然后重启目标计算机。 EVENT-NET 是一种内核内传输协议,类似于 KDNET(内核调试程序协议)。 EVENT-NET 仅传输事件,不允许调试程序访问。 这两种协议互斥;一次只能启用其中一种。
可以远程(使用 Windows PowerShell)或本地启用事件传输。
远程启用事件传输
如果已设置 Windows PowerShell 远程处理至目标计算机,请跳到步骤 3。 如果未设置,则在目标计算机上,打开命令提示符并运行以下命令:
winrm quickconfig
响应提示,然后重启目标计算机。 如果目标计算机与收集器计算机不在同一域中,则可能需要将它们定义为受信任的主机。 要执行此操作:
在收集器计算机上,运行以下任一命令:
在 Windows PowerShell 提示符下:运行
Set-Item -Force WSMan:\localhost\Client\TrustedHosts <target1>,<target2>,...
,接着运行Set-Item -Force WSMan:\localhost\Client\AllowUnencrypted true
,其中 <target1> 等是目标计算机的名称或 IP 地址。或者在命令提示符下:运行 winrm set winrm/config/client @{TrustedHosts=<target1>,<target2>,...;AllowUnencrypted=true}
Important
这会设置未加密的通信,因此不要在实验室环境之外执行此操作。
通过转到收集器计算机并运行以下任一 Windows PowerShell 命令来测试远程连接:
如果目标计算机与收集器计算机在同一个域中,请运行
New-PSSession -Computer <target> | Remove-PSSession
如果目标计算机不在同一域中,请运行
New-PSSession -Computer <target> -Credential Administrator | Remove-PSSession
,将会提示输入凭据。如果命令未返回任何内容,则远程处理已成功。
在目标计算机上,打开提升的 Windows PowerShell 提示符并运行这一命令。
Enable-SbecBcd -ComputerName <target_name> -CollectorIP <ip> -CollectorPort <port> -Key <a.b.c.d>
其中,<target_name> 是目标计算机的名称,<ip> 是收集器计算机的 IP 地址。 <port> 是收集器运行所用的端口号。 密钥 <a.b.c.d> 是通信所需的加密密钥,它包括由点分隔的四个字母数字字符串。 收集器计算机上使用的是相同的密匙。 如果未输入密钥,系统将生成一个随机密钥;对于收集器计算机,需要用到它,因此请记下来。
如果已设置收集器计算机,请使用新目标计算机的信息更新收集器计算机上的配置文件。 请参阅“配置收集器计算机”部分以获取详细信息。
在目标计算机上本地启用事件传输
启动提升的命令提示符,然后运行以下命令:
bcdedit /event yes
bcdedit /eventsettings net hostip:1.2.3.4 port:50000 key:a.b.c.d
在这里,“1.2.3.4”是一个示例;请将其替换为收集器计算机的 IP 地址。 此外,将 50000 替换为收集器运行所用的端口号,并将“a.b.c.d”替换为通信所需的加密密钥。 收集器计算机上使用的是相同的密匙。 如果未输入密钥,系统将生成一个随机密钥;对于收集器计算机,需要用到它,因此请记下来。
如果已设置收集器计算机,请使用新目标计算机的信息更新收集器计算机上的配置文件。 请参阅“配置收集器计算机”部分以获取详细信息。
现在启用事件传输本身,必须使系统能够实际通过该传输发送 ETW 事件。
启用通过传输远程发送 ETW 事件
在收集器计算机上,打开提升的 Windows PowerShell 提示符。
运行
Enable-SbecAutologger -ComputerName <target_name>
,其中 <target_name> 是目标计算机的名称。
如果无法设置 Windows PowerShell 远程处理,始终可以在目标计算机上直接启用事件发送。
启用通过本地传输发送 ETW 事件
在目标计算机上,启动 Regedit.exe 并找到以下注册表密匙:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WMI\AutoLogger. 此密钥下各种日志会话被列为子密匙。 Setup Platform, NT Kernel Logger, and Microsoft-Windows-Setup are possible choices for use with Setup and Boot Event Collection, but the recommended option is EventLog-System. 配置和启动 AutoLogger 会话中包含此类密匙的详情。
In the EventLog-System key, change the value of LogFileMode from 0x10000180 to 0x10080180. 有关此类设置的详细信息,请参阅日志记录模式常量。
还可以启用将错误检查数据转发到收集器计算机(可选)。 为此,请查找注册表密匙 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager,并使用值 0x1 创建密钥调试打印筛选器。
重新启动目标计算机。
选择网络适配器
如果目标计算机有多个网络适配器,KDNET 驱动程序将选择列出的第一个受支持的网络适配器。 可以使用以下步骤指定用于转发安装程序事件的特定网络适配器:
指定网络适配器
On the target computer, open Device Manager, expand Network Adapters, find the network adapter you want to use, and right-click it.
In the menu that opens, click Properties, and then click the Details tab. Expand the menu in the Property field, scroll to find Location information (the list is probably not in alphabetical order), and then click it. 该值将是 PCI bus X, device Y, function Z 形式的字符串。记下 X.Y.Z;它们是以下命令所需的总线参数。
运行以下任一命令:
从提升的 Windows PowerShell 提示符下:
Enable-SbecBcd -ComputerName <target_name> -CollectorIP <ip> -CollectorPort <port> -Key <a.b.c.d> -BusParams <X.Y.Z>
从提升的命令提示符下:bcdedit /eventsettings net hostip:aaa port:50000 key:bbb busparams:X.Y.Z
验证目标计算机配置
To check settings on the target computer, open an elevated command prompt and run bcdedit /enum. When this is finished, then run bcdedit /eventsettings. 仔细检查以下值:
Key
调试类型 = 网络
Hostip = <收集器的 IP 地址>
Port = <指定供收集器使用的端口号>
DHCP = 是
Also check that you have enabled bcdedit /event, since /debug and /event are mutually exclusive. 只能运行其中一项。 同样,不能同时运行 /eventsettings 与 /debug 或 /dbgsettings 与 /event。
另请注意,如果将事件收集设置为串行端口,则不可用。
配置收集器计算机
收集器服务接收事件并将其保存在 ETL 文件中。 然后,这些 ETL 文件可由其他工具(例如事件查看器、消息分析器、Wevtutil 和 Windows PowerShell cmdlet)读取。
由于 ETW 格式不允许指定目标计算机名称,因此每个目标计算机的事件必须保存到单独的文件中。 显示工具可能会显示计算机名称,但它显示的是运行该工具的计算机的名称。
更确切地说,每个目标计算机都分配有一个 ETL 文件环。 每个文件名都包含从 000 到配置的最大值(最大 999)的索引。 当文件达到最大配置大小时,它会切换将事件写入下一个文件。 在达到文件最大值后,它会切换回文件索引 000。 这样,文件会自动回收,从而限制磁盘空间的使用。 还可以设置其他外部保留策略以进一步限制磁盘使用情况;例如,可以删除早于设定天数的文件。
Collected ETL files are typically kept in the directory c:\ProgramData\Microsoft\BootEventCollector\Etl (which might have additional subdirectories). 可以通过按上次修改时间对日志文件进行排序来查找最新的日志文件。 There is also a status log (typically in c:\ProgramData\Microsoft\BootEventCollector\Logs), which records whenever the collector switches writing to a new file.
还有一个收集器日志,用于记录有关收集器本身的信息。 You can keep this log in the ETW format (in which events are reported to the Windows log service; this is the default) or in a file (normally in c:\ProgramData\Microsoft\BootEventCollector\Logs). 如果要启用生成大量数据的详细模式,则使用文件可能会有帮助。 还可以通过从命令行运行收集器,将日志设置为写入标准输出。
创建收集器配置文件
When you enable the service, three XML configuration files are created and stored in c:\ProgramData\Microsoft\BootEventCollector\Config:
Active.xml This file contains the current active configuration of the collector service. 安装后,此文件的内容与 Empty.xml 相同。 设置新的收集器配置时,将其保存到此文件中。
Empty.xml This file contains the minimum configuration elements needed with their default values set. 它不启用任何收集;它仅允许收集器服务在空闲模式下启动。
Example.xml This file provides examples and explanations of the possible configuration elements.
选择文件大小限制
必须决定设置文件大小限制。 最佳文件大小限制取决于预期的事件量和可用磁盘空间。 就清理历史数据而言,较小的文件更为方便。 但是,每个文件都带有 64KB 标头的开销,而且读取多个文件来获取组合历史记录可能不太方便。 绝对最小文件大小限制为 256 KB。 合理的实际文件大小限制应超过 1 MB,10 MB 可能是一个较为合适的典型值。 如果预期会存在许多事件,则可合理选择更大的限制值。
有关配置文件,需要注意以下详细信息:
目标计算机地址。 可以使用其 IPv4 地址、MAC 地址或 SMBIOS GUID。 选择要使用的地址时,请注意以下因素:
IPv4 地址最适用于 IP 地址的静态分配。 但是,即使是静态 IP 地址,也必须通过 DHCP 分配。
如果事先已知 MAC 地址或 SMBIOS GUID, 使用时也很方便,但 IP 地址是动态分配的。
EVENT-NET 协议不支持 IPv6 地址。
可以指定多种方法来标识计算机。 例如,如果物理硬件即将更换,则可以同时输入旧 MAC 地址和新 MAC 地址,两个地址都将可用。
用于与收集器计算机通信的加密密钥
目标计算机的名称。 可以使用 IP 地址、主机名或任何其他名称作为计算机名称。
要使用的 ETL 文件的名称及其环大小配置
创建配置文件
打开提升的 Windows PowerShell 提示符,并将目录更改为 %SystemDrive%\ProgramData\Microsoft\BootEventCollector\Config。
键入
notepad .\newconfig.xml
,然后按 Enter。将此示例配置复制到记事本窗口中:
<collector configVersionMajor=1 statuslog=c:\ProgramData\Microsoft\BootEventCollector\Logs\statuslog.xml> <common> <collectorport value=50000/> <forwarder type=etl> <set name=file value=c:\ProgramData\Microsoft\BootEventCollector\Etl\{computer}\{computer}_{#3}.etl/> <set name=size value=10mb/> <set name=nfiles value=10/> <set name=toxml value=none/> </forwarder> <target> <ipv4 value=192.168.1.1/> <key value=a.b.c.d/> <computer value=computer1/> </target> <target> <ipv4 value=192.168.1.2/> <key value=d1.e2.f3.g4/> <computer value=computer2/> </target> </common> </collector>
Note
根节点是 <collector>。 其属性指定配置文件语法的版本和状态日志文件的名称。
<common> 元素将多个目标组合在一起,为它们指定公共配置元素,这与使用用户组指定多个用户的公共权限非常类似。
<collectorport> 元素定义收集器将用来侦听传入数据的 UDP 端口号。 此端口与 Bcdedit 的目标配置步骤中指定的端口相同。 收集器仅支持一个端口,所有目标必须连接到同一端口。
<forwarder> 元素指定将如何转发从目标计算机接收的 ETW 事件。 只有一种类型转发器,将它们写入 ETL 文件。 参数指定文件名模式、文件环的大小限制以及每台计算机的环大小。 toxml 设置指定接收 ETW 事件时将按二进制形式写入它们,不会转换为 XML。 若要了解如何决定是否将事件赋予 XML,请参阅“XML 事件转换”部分。 文件名模式包含以下替换:{computer} 替代计算机名,{#3} 替代文件环的索引。
在此示例文件中,两台目标计算机均使用 <target> 元素来定义。 每个定义都使用 <ipv4> 指定 IP 地址,但也可以使用 MAC 地址(例如,
<mac value=11:22:33:44:55:66/>
或<mac value=11-22-33-44-55-66/>
)或 SMBIOS GUID(例如<guid value={269076F9-4B77-46E1-B03B-CA5003775B88}/>
)来标识目标计算机。 另请注意,加密密钥(与目标计算机上指定的或与 Bcdedit 生成的相同),以及计算机名称。将每台目标计算机的详细信息输入为配置文件中单独的 <target> 元素,然后保存 Newconfig.xml 并关闭记事本。
通过
$result = (Get-Content .\newconfig.xml | Set-SbecActiveConfig); $result
应用新配置。 应该会返回输出,并且“成功”字段为 true。 如果收到另一个结果,请参阅本主题的“故障排除”部分。
始终可以通过 (Get-SbecActiveConfig).text
检查当前活动配置。
可以通过 $result = (Get-Content .\newconfig.xml | Check-SbecConfig); $result
对配置文件执行有效性检查。
尽管 Windows PowerShell 命令应用新配置会自动更新服务,而无需重启该服务,但始终可以使用以下任一命令自行重启服务:
对于 Windows PowerShell,使用
Restart-Service BootEventCollector
在常规命令提示符中:sc stop BootEventCollector; sc start BootEventCollector
将 Nano Server 配置为目标计算机
Nano Server 提供的最小接口有时很难诊断出问题。 可以将 Nano Server 映像配置为自动参与安装程序和启动事件收集,将诊断数据发送到收集器计算机,而无需进行进一步干预。 为此,请按照下列步骤进行操作:
将 Nano Server 配置为目标计算机
创建基础 Nano Server 映像。 有关详细信息,请参阅 Nano Server 入门。
设置收集器计算机,如本主题的“配置收集器计算机”部分所示。
添加 AutoLogger 注册表密匙以启用发送诊断消息。 为此,请装载在步骤 1 中创建的 Nano Server VHD,加载注册表配置单元,然后添加特定注册表密匙。 在此示例中,Nano Server 映像位于 C:\NanoServer;你使用的路径可能有所不同,因此请相应地调整步骤。
On the collector computer, copy the ..\Windows\System32\WindowsPowerShell\v1.0\Modules\BootEventCollector folder and paste it into the ..\Windows\System32\WindowsPowerShell\v1.0\Modules directory on the computer you are using to modify the Nano Server VHD.
以提升的权限启动 Windows PowerShell 控制台并运行
Import-Module BootEventCollector
。更新 Nano Server VHD 注册表以启用 AutoLoggers。 为此,请运行
Enable-SbecAutoLogger -Path C:\NanoServer\Workloads\IncludingWorkloads.vhd
。 这会添加一个基本列表,其中列出最典型的安装和启动事件;可在控制事件跟踪会话中研究其他项。
更新 Nano Server 映像中的 BCD 设置以启用事件标志并设置收集器计算机,以确保将诊断事件发送到正确的服务器。 请注意收集器的 Active.XML 文件中配置的收集器计算机的 IPv4 地址、TCP 端口和加密密钥(本主题的其他地方所述)。 利用提升的权限在 Windows PowerShell 控制台中使用此命令:
Enable-SbecBcd -Path C:\NanoServer\Workloads\IncludingWorkloads.vhd -CollectorIp 192.168.100.1 -CollectorPort 50000 -Key a.b.c.d
通过将 IPv4 地址范围、特定 IPv4 地址或 Nano Server 的 MAC 地址添加到收集器计算机上的 Active.XML 文件中,更新收集器计算机来接收 Nano Server 计算机发送的事件(请参阅本主题的“配置收集器计算机”部分)。
启动事件收集器服务
在收集器计算机上保存有效的配置文件并配置目标计算机后,只要重新启动目标计算机,就会建立与收集器的连接,并收集事件。
收集器服务本身的日志(不同于服务收集的安装程序和启动数据)可以在 Microsoft-Windows-BootEvent-Collector/Admin 下找到。 对于事件的图形界面,请使用事件查看器。 创建新视图;展开应用程序和服务日志,然后展开 Microsoft,然后展开 Windows。 Find BootEvent-Collector, expand it, and find Admin.
对于 Windows PowerShell,使用
Get-WinEvent -LogName Microsoft-Windows-BootEvent-Collector/Admin
在常规命令提示符中:wevtutil qe Microsoft-Windows-BootEvent-Collector/Admin
Troubleshooting
排查安装问题功能
Error | Error description | Symptom | Potential problem |
---|---|---|---|
Dism.exe | 87 | 在此上下文中无法识别功能名称选项 | 如果功能名称拼写错误,可能会出现这种情况。 请验证是否拼写正确,然后请重试。 确认你正在使用的操作系统版本提供此功能。 在 Windows PowerShell 中,运行 dism /online /get-features | ?{$_ -match boot} 。 如果未返回任何匹配项,则可能正在运行不支持此功能的版本。 |
Dism.exe | 0x800f080c | 功能 <name> 未知。 |
同上 |
收集器故障排除
Logging: The Collector logs its own events as ETW provider Microsoft-Windows-BootEvent-Collector. 你首先应该在此处查找收集器的问题疑难解答。 可以在事件查看器中的“应用程序和服务日志”>“Microsoft”>“Windows”>“BootEvent-Collector”>“管理员”下面查找它们,也可以在命令窗口中使用以下任一命令读取它们:
在常规命令提示符中:wevtutil qe Microsoft-Windows-BootEvent-Collector/Admin
在 Windows PowerShell 提示符中:Get-WinEvent -LogName Microsoft-Windows-BootEvent-Collector/Admin
(可以追加-Oldest
,以按时间顺序返回最早事件的列表)
可以通过“警告”、“信息”(默认)、“详细”和“调试”来调整日志中错误的详细级别。 设置比信息更详细的级别有助于诊断目标计算机无法连接的问题,但这些级别可能会生成大量数据,因此请谨慎使用。
可以在配置文件的 <collector> 元素中设置最小日志级别。 例如:<collector configVersionMajor=1 minlog=verbose>。
详细级别记录处理时收到的每个数据包的记录。 调试级别还会添加更多处理详细信息,并转储所有收到的 ETW 数据包的内容。
在调试级别,将日志写入文件可能很有用,而不是尝试在常规日志记录系统中查看它。 若要执行此操作,请在配置文件的 <collector> 元素中添加其他元素:
<collector configVersionMajor=1 minlog=debug log=c:\ProgramData\Microsoft\BootEventCollector\Logs\log.txt>
建议的收集器故障排除方法:
首先,验证收集器是否已从目标接收连接(仅在目标开始发送消息时创建文件)
Get-SbecForwarding
如果返回存在来自此目标的连接,则问题可能存在于自动记录器的设置中。 如果未返回任何内容,则首先需要了解 KDNET 的连接问题。 若要诊断 KDNET 连接问题,请尝试从两端(即收集器和目标)检查连接。
若要查看收集器中的扩展诊断,请将此项添加到配置文件的 <collector> 元素:<collector ... minlog=verbose>。这将启用有关每个已接收数据包的消息。
检查是否收到任何数据包。 你可能希望以详细模式将日志直接写入文件,而不是通过 ETW(可选)。 为此,请将此项添加到配置文件的 <collector> 元素:<collector ... minlog=verbose log=c:\ProgramData\Microsoft\BootEventCollector\Logs\log.txt>
检查事件日志中是否存在有关收到的数据包的任何消息。 检查是否收到任何数据包。 如果收到数据包但不正确,请检查事件消息以了解详细信息。
从目标端,KDNET 将一些诊断信息写入注册表。 Look in HKLM\SYSTEM\CurrentControlSet\Services\kdnet for messages. KdInitStatus (DWORD) 在成功时将为 0,在错误时显示错误代码 KdInitErrorString = 错误说明(如果没有错误,也会包含信息性消息)
在目标上运行 Ipconfig.exe,并检查它报告的设备名称。 如果正确加载了 KDNET,设备名称应该类似于 kdnic,而不是原始供应商的卡片名称。
检查是否为目标配置了 DHCP。 KDNET 必须需要 DHCP。
确认收集器与目标位处于同一网络。 如果不是,请检查是否已正确配置路由,尤其是 DHCP 的默认网关设置。
Connection status
可以查看当前已建立的连接列表,以及有关使用 Get-SbecForwarding
转发数据的位置信息。
还可以获取与 Get-SbecHistory
的连接中状态更改的最新历史记录。
设置新配置的故障排除
如果使用 Windows PowerShell 命令 $result = (Get-Content .\newconfig.xml | Set-SbecActiveConfig); $result
应用配置,则变量 $result
将包含有关部署的信息。 可以查询此变量,以便从中获取不同的信息:
获取与 $result.ErrorString
有关的错误的信息。 如果在此处报告了任何错误,则不会应用新配置,并且旧配置将保持不变。
使用 $result.WarningString
获取警告。
使用 $result.InfoString
获取有关配置的详细信息。
可以使用 $result | fl *
获取完整的结果。
或者,如果不需要在变量中保存结果,可以使用 Get-Content .\newconfig.xml | Set-SbecActiveConfig | fl *
。
目标计算机故障排除
Error | Error description | Potential problem |
---|---|---|
Target computer | 目标未连接到收集器 | 目标计算机在配置后未重启。 重新启动目标计算机。 目标计算机的 BCD 设置不正确。 检查“验证目标计算机设置”部分中的设置。 根据需要更正,然后重启目标计算机。 KDNET/EVENT-NET 驱动程序无法连接到网络适配器或连接到了错误的网络适配器。 In Windows PowerShell, run See also: A suggested approach to troubleshooting the Collector above, especially Steps 5 through 8. |
Collector | 迁移收集器托管的虚拟机后,我无法再查看事件。 | 验证收集器计算机的 IP 地址是否已更改。 如果已更改,请查看“允许通过传输远程发送 ETW 事件”。 |
Collector | 未创建 ETL 文件。 | Get-SbecForwarding 表明目标已连接,没有错误,但未创建 ETL 文件。目标计算机可能尚未发送任何数据,仅当接收到数据时,才会创建 ETL 文件。 |
Collector | ETL 文件中未显示事件。 | 目标计算机已发送事件,但当 ETL 文件通过消息分析器事件查看器读取时,该事件不存在。 事件可能仍在缓冲区中。 在收集完整的 64 KB 缓冲区或超时约 10-15 秒且未发生新事件时,事件才会被写入 ETL 文件。 等待超时到期,或使用 Save-SbecInstance 刷新缓冲区。事件清单在收集器计算机或运行事件查看器或消息分析器的计算机上不可用。 在这种情况下,收集器可能无法处理事件(检查收集器日志),或者查看器可能无法显示它。 建议在收集器计算机上安装所有清单,并在收集器计算机上安装更新,然后再在目标计算机上安装此类更新。 |