如何通过PowerShell为重启事件日志添加自定义原因及原因代码?
解决PowerShell重启电脑时自定义事件日志原因及代码的问题
原Restart-Computer cmdlet未提供指定重启原因和代码的参数,导致事件日志中出现「无法找到此原因的标题」及默认错误代码(0x80070015)。以下是两种PowerShell实现自定义重启原因的方案:
方案一:使用CIM方法(推荐)
通过Win32_OperatingSystem类的Reboot方法,可直接传入原因代码和备注参数,让事件日志显示正确的原因信息。
示例代码
# 获取目标电脑名称和凭据 $computerName = Read-Host "Enter computer name" $credential = Get-Credential # 定义重启原因代码(高16位=主要原因,低16位=次要原因,示例为"应用程序维护") $reasonCode = 0x40001 # 对应主要原因0x4,次要原因0x1 # 自定义备注信息 $comment = "应用程序更新完成,需重启生效" # 获取目标系统的CIM实例并执行重启 $osInstance = Get-CimInstance -ClassName Win32_OperatingSystem -ComputerName $computerName -Credential $credential $osInstance | Invoke-CimMethod -MethodName Reboot -Arguments @{ Reason = $reasonCode; Comment = $comment }
原因代码说明
Windows重启原因代码为32位整数,格式为主要原因(高16位) + 次要原因(低16位)。常见预定义原因代码包括:
- 0x40001:应用程序维护
- 0x20001:硬件维护
- 0x50001:操作系统更新
若需自定义原因描述,需在目标电脑注册表中添加对应项:
- 主要原因:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Reliability\ShutdownReason\Major下新建字符串值,名称为主要原因数字(如5),数据为自定义标题(如「自定义系统维护」) - 次要原因:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Reliability\ShutdownReason\Minor下新建字符串值,名称为次要原因数字(如1),数据为子标题(如「配置更新」) - 组合代码为
0x50001,调用时传入该值即可在事件日志中显示自定义标题。
方案二:使用shutdown.exe命令
通过调用系统内置的shutdown.exe,利用其/d(原因代码)和/c(备注)参数实现自定义。
示例代码
$computerName = Read-Host "Enter computer name" $credential = Get-Credential # 原因格式:p:主要原因:次要原因(p代表计划内重启,u代表未计划) # /c 指定备注,/f 强制关闭应用 $shutdownArgs = "/r /m \\$computerName /d p:4:1 /c '应用程序更新后重启' /f" # 在目标电脑执行关机命令 Invoke-Command -ComputerName $computerName -Credential $credential -ScriptBlock { param($args) Start-Process shutdown.exe -ArgumentList $args -NoNewWindow -Wait } -ArgumentList $shutdownArgs
效果验证
执行上述任一方案后,事件日志中会显示:
进程...发起了
的重启操作,原因显示为「应用程序维护」(或自定义标题),原因代码:0x40001,关机类型:重启,备注:应用程序更新完成,需重启生效。
内容的提问来源于stack exchange,提问作者Khaos GB




