You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows任务计划程序创建开机触发Python任务报错求助

解决Windows任务计划程序开机触发任务注册失败问题

运行开机触发任务注册代码时出现如下错误:

Exception in thread Thread-1 (schedullle):
Traceback (most recent call last):
  File "C:\Users\Nwachukwu Sarah\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1009, in _bootstrap_inner
    self.run()
  File "C:\Users\Nwachukwu Sarah\AppData\Local\Programs\Python\Python310\lib\threading.py", line 946, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\Nwachukwu Sarah\eyecare.py", line 78, in schedullle
    root_folder.RegisterTaskDefinition('Test Task',task_def,TASK_CREATE_OR_UPDATE,'Local Service',  '',5)
  File "<COMObject GetFolder>", line 3, in RegisterTaskDefinition
pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2147024891), None)

问题背景:此前创建的每2分钟运行一次的任务可正常工作,但开机触发的任务返回上述错误。

问题原因分析

错误码-2147024891对应权限拒绝,结合开机触发器的特性,主要问题出在两个方面:

  • 开机触发器的参数设置不符合要求:不必要的StartBoundary/EndBoundary会干扰开机触发逻辑
  • 任务注册时的账户权限不匹配:使用Local Service账户但当前用户无足够权限,或登录类型参数与账户不匹配

解决方案及修改后的代码

  1. 移除开机触发器的StartBoundary和EndBoundary设置:开机触发任务不需要指定时间边界,系统会在每次启动时触发
  2. 调整任务注册的账户及登录类型:如果需要当前用户登录后运行,使用交互式令牌;如果需要系统级开机运行(无需用户登录),改用SYSTEM账户并确保脚本以管理员权限运行

以下是修正后的代码:

def schedullle():
    import datetime
    import win32com.client

    scheduler = win32com.client.Dispatch('Schedule.Service')
    scheduler.Connect()
    root_folder = scheduler.GetFolder('\\')
    task_def = scheduler.NewTask(0)

    # 创建开机触发器
    TASK_TRIGGER_BOOT = 8
    trigger = task_def.Triggers.Create(TASK_TRIGGER_BOOT)
    trigger.ExecutionTimeLimit = "PT5M"
    trigger.Id = "BootTriggerId"
    trigger.Delay = "PT30S"  # 开机后延迟30秒执行

    # 创建执行动作
    TASK_ACTION_EXEC = 0
    action = task_def.Actions.Create(TASK_ACTION_EXEC)
    action.ID = 'TRIGGER BATCH'
    action.Path = "C:\\Users\\Nwachukwu Sarah\\test.bat"

    # 设置任务参数
    task_def.RegistrationInfo.Description = 'Test Task'
    task_def.RegistrationInfo.Author='Sarah'
    task_def.Settings.Enabled = True
    task_def.Settings.StopIfGoingOnBatteries = False
    task_def.Settings.StartWhenAvailable = True

    # 注册任务
    TASK_CREATE_OR_UPDATE = 6
    # 使用当前交互式用户登录(用户登录后执行)
    TASK_LOGON_INTERACTIVE_TOKEN = 3
    root_folder.RegisterTaskDefinition(
        'Test Task',
        task_def,
        TASK_CREATE_OR_UPDATE,
        '',  # 空字符串表示当前用户
        '',  # 密码留空,使用当前用户凭据
        TASK_LOGON_INTERACTIVE_TOKEN
    )

额外说明

  • 如果需要任务在无需用户登录的情况下开机运行,将注册部分改为:
    # 使用SYSTEM账户,登录类型为服务账户
    TASK_LOGON_SERVICE_ACCOUNT = 5
    root_folder.RegisterTaskDefinition(
        'Test Task',
        task_def,
        TASK_CREATE_OR_UPDATE,
        'SYSTEM',
        '',
        TASK_LOGON_SERVICE_ACCOUNT
    )
    
    注意:此方式需要脚本以管理员权限运行,否则会再次触发权限错误。
  • 确保test.bat路径正确,且脚本有足够权限执行该批处理文件。

内容的提问来源于stack exchange,提问作者Sarah Godwin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 01:20:56