You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何通过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:操作系统更新

若需自定义原因描述,需在目标电脑注册表中添加对应项:

  1. 主要原因:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Reliability\ShutdownReason\Major下新建字符串值,名称为主要原因数字(如5),数据为自定义标题(如「自定义系统维护」)
  2. 次要原因:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Reliability\ShutdownReason\Minor下新建字符串值,名称为次要原因数字(如1),数据为子标题(如「配置更新」)
  3. 组合代码为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

火山引擎 最新活动