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账户但当前用户无足够权限,或登录类型参数与账户不匹配
解决方案及修改后的代码
- 移除开机触发器的
StartBoundary和EndBoundary设置:开机触发任务不需要指定时间边界,系统会在每次启动时触发 - 调整任务注册的账户及登录类型:如果需要当前用户登录后运行,使用交互式令牌;如果需要系统级开机运行(无需用户登录),改用
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
相关产品推荐
相关产品推荐

