System.Diagnostics.EventLog#WriteEvent()无法找到特定事件ID的原因
背景
我尝试使用System.Diagnostics.EventLog#WriteEvent()作为New-WinEvent和Write-EventLog cmdlet的替代方案。
问题
我尝试用WriteEvent()写入以下日志:
- 日志名称:
Application - 源:
Application Error - 事件ID:
1005
$eventLog = [System.Diagnostics.EventLog]::new('Application') $eventLog.Source = 'Application Error' $eventLog.WriteEvent( [System.Diagnostics.EventInstance]::new(1005, 0, [System.Diagnostics.EventLogEntryType]::Error), @( 'FilePath.exe', # FilePath 'Application Name', # AppName 0x1234, # StatusCode 1 # MediumType ) )
但在事件查看器中收到以下提示:
无法找到来自源 Application Error 的事件 ID 1005 的描述。要么引发此事件的组件未安装在本地计算机上,要么安装已损坏。您可以在本地计算机上安装或修复该组件。
如果事件起源于另一台计算机,则必须随事件一起保存显示信息。
事件中包含以下信息:
FilePath.exe
Application Name
4660
1消息资源存在,但在消息表中未找到该消息
另一方面,使用New-WinEvent cmdlet时能得到预期消息:
New-WinEvent -ProviderName "Application Error" -Id 1005 -Payload @( 'FilePath.exe', # FilePath 'Application Name', # AppName 0x1234, # StatusCode 1 # MediumType )
Windows 无法访问文件 FilePath.exe,原因如下之一:网络连接存在问题、文件所在磁盘或计算机上安装的存储驱动程序有问题,或者磁盘丢失。Windows 因此错误关闭了程序 Application Name。
程序:Application Name
文件:FilePath.exe错误值列在附加数据部分。
用户操作
- 重新打开文件。这种情况可能是临时问题,再次运行程序时可能会自行纠正。
- 如果仍然无法访问文件:
- 如果文件在网络上,请您的网络管理员验证网络是否存在问题以及是否可以联系服务器。
- 如果文件在可移动磁盘(例如软盘或CD-ROM)上,请验证磁盘是否已完全插入计算机。
- 通过运行 CHKDSK 检查并修复文件系统。要运行 CHKDSK,请单击“开始”,单击“运行”,键入 CMD,然后单击“确定”。在命令提示符下,键入 CHKDSK /F,然后按 Enter。
- 如果问题仍然存在,请从备份副本还原文件。
- 确定同一磁盘上的其他文件是否可以打开。如果不能,则磁盘可能已损坏。如果是硬盘,请联系管理员或计算机硬件供应商寻求进一步帮助。
附加数据
错误值: 0x1234
磁盘类型: 0x1
我测试了其他事件源和ID,结果如下:
| 方法/Cmdlet | 源 | 事件ID | 结果 |
|---|---|---|---|
| WriteEvent() | Application Error | 1000 | ✔️ |
| WriteEvent() | Application Error | 1005 | 提示“无法找到描述...” |
| WriteEvent() | Application-Addon-Event-Provider | 1 | ✔️ |
| New-WinEvent | Application Error | 1000 | 无错误但无法设置消息中的%2、%3... |
| New-WinEvent | Application Error | 1005 | ✔️ |
| New-WinEvent | Application-Addon-Event-Provider | 1 | ✔️ |
| Write-EventLog | Application Error | 1000 | 无错误但无法设置消息中的%2、%3... |
| Write-EventLog | Application Error | 1005 | 提示“无法找到描述...” |
| Write-EventLog | Application-Addon-Event-Provider | 1 | 无错误但无法设置消息中的%2、%3... |
问题问询
我不想根据事件源/ID切换不同的方法或cmdlet,希望统一写入事件日志。请问为何使用WriteEvent()写入事件ID1005时会出现“无法找到来自源Application Error的事件ID1005的描述”的提示?
补充说明
我在运行环境中没有管理员权限,无法运行New-EventLog创建自定义日志名称。
内容的提问来源于stack exchange,提问作者SATO Yusuke

