任务计划程序运行脚本时Write-eventlog写入远程事件日志失败
故障现象
- 手动执行场景:通过PowerShell ISE、常规PowerShell窗口手动运行写事件日志脚本时,可正常在远程域控制器上生成目标日志记录,无异常
- 任务计划调度场景:无论使用已确认拥有系统日志写入权限的服务账户,还是手动运行可正常生效的个人域账户凭据配置任务,日志写入操作均失败
测试用脚本逻辑极简,核心作用是生成指定事件日志,触发后续事件监控服务发送通知,代码如下:
Write-EventLog -Computername dc1 -LogName System -Source "script_output_events_test1" -EntryType Warning -EventId 45912 -Message "test"
已确认的排查结论
排查阶段已在脚本中添加Out-File命令记录执行状态,确认任务计划程序触发时脚本可正常生成指定输出文件,证明任务调度流程本身可正常拉起脚本执行,仅Write-EventLog命令未成功完成执行。
根因说明
该问题属于PowerShell结合任务计划操作远程资源的典型问题,核心诱因有三点:
- 认证令牌权限不足
当任务计划配置为「不管用户是否登录都要运行」时,Windows默认不会为配置的运行账户生成可用于跨机器认证的网络级令牌,此时访问远程域控的身份实际是运行任务的本地计算机账户,而非你配置的服务账户/个人域账户。域控默认不会给普通域内计算机账户开放系统日志写入权限,因此请求会被拒绝。而手动运行脚本时属于交互式登录,持有完整的可跨域认证的用户令牌,因此可以正常写入。 - 事件源注册权限不足
如果script_output_events_test1这个日志源是之前手动运行脚本时首次注册的,对应注册表项的访问权限仅授予了交互式登录的用户上下文,任务计划运行时的非交互式会话无法访问该事件源的注册表配置,同样会导致写入失败。 - 缺少错误捕获导致无明确报错
原脚本未添加错误捕获逻辑,Write-EventLog执行失败时的错误信息不会被输出,因此只能观察到命令未执行成功,无法直接定位具体报错原因。
可落地的修复步骤
- 调整任务计划安全配置
打开对应任务的属性页,在「常规」选项卡优先勾选仅当用户登录时运行,同时勾选「使用最高权限运行」。如果业务要求必须在用户未登录时也能正常运行,需要取消勾选「不存储密码」选项(部分Windows版本显示为「存储账户凭据用于跨网络认证」),同时给运行任务的计算机账户开放目标域控System日志的写入权限。 - 提前在域控侧注册固定日志源
直接登录dc1域控制器本地执行以下命令,永久注册目标日志源,避免远程运行时因源注册权限不足报错:New-EventLog -LogName System -Source "script_output_events_test1" - 给脚本添加错误捕获逻辑
修改原脚本增加错误日志输出,后续再出现执行失败时可以直接从日志文件定位具体原因,参考代码如下:try { Write-EventLog -Computername dc1 -LogName System -Source "script_output_events_test1" -EntryType Warning -EventId 45912 -Message "test" -ErrorAction Stop "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] 事件日志写入成功" | Out-File -FilePath C:\Scripts\event_run.log -Append } catch { "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] 事件日志写入失败,错误信息:$_" | Out-File -FilePath C:\Scripts\event_run.log -Append } - 规范任务计划的PowerShell启动参数
编辑任务计划的操作项,显式指定PowerShell启动参数,避免非交互式上下文下的执行策略拦截,参考配置:- 程序/脚本:
powershell.exe - 添加参数:
-NoProfile -ExecutionPolicy Bypass -File "C:\Scripts\你的脚本文件名.ps1"
注意脚本路径要写绝对路径,不要用相对路径。
- 程序/脚本:
内容的提问来源于stack exchange,提问作者Mitchell Egan Rodkey
相关产品推荐
相关产品推荐

