【问题标题】:Create a scheduled task using TASK_TRIGGER_LOGON in python在 python 中使用 TASK_TRIGGER_LOGON 创建计划任务
【发布时间】:2018-12-12 20:06:48
【问题描述】:

我正在尝试创建一个在当前用户每次登录时都会运行的任务。

我找不到任何好的示例或文档。我找到的最好的例子是this

我尝试将TASK_TRIGGER_DAILY = 2 替换为TASK_TRIGGER_LOGON = 9,删除tigger.DaysInterval = 100 并使用trigger.Delay 等相关对象找到here

它总是会导致:

Pywintyps.com error: (-2147352567, ‘Exception occurred.’, (0, None, None, None, 0 -2147024809), None) on line 67: result = rootFolder.RegisterTaskDefinition(task_id, taskDef, TASK_CREATE_OR_UPDATE, "", "", RUNFLAGSENUM[run_flags] )
#username, password

调用schtasks.exe 可行,但这需要我想避免的 UAC 提升请求。

一个工作示例或一些相关的 Python 文档会很棒。我对C++不够精通,无法将其全部翻译成Python

【问题讨论】:

    标签: python win32com taskscheduler


    【解决方案1】:
    # Uses the COM Task Scheduler Interface to create a task
    # scheduled to execute when the current user logs on.
    
    import win32com.client
    import os
    
    computer_name = "" #leave all blank for current computer, current user
    computer_username = ""
    computer_userdomain = ""
    computer_password = ""
    action_id = "Test Task" #arbitrary action ID
    action_path = r"c:\windows\system32\calc.exe" #executable path (could be python.exe)
    action_arguments = r'' #arguments (could be something.py)
    action_workdir = r"c:\windows\system32" #working directory for action executable
    author = "Someone" #so that end users know who you are
    description = "Run calc.exe when the current user logs on"
    task_id = "Test Task"
    task_hidden = False #set this to True to hide the task in the interface
    username = ""
    password = ""
    
    #define constants
    TASK_TRIGGER_LOGON = 9
    TASK_CREATE_OR_UPDATE = 6
    TASK_ACTION_EXEC = 0
    TASK_LOGON_INTERACTIVE_TOKEN = 3
    
    #connect to the scheduler (Vista/Server 2008 and above only)
    scheduler = win32com.client.Dispatch("Schedule.Service")
    scheduler.Connect(computer_name or None, computer_username or None, computer_userdomain or None, computer_password or None)
    rootFolder = scheduler.GetFolder("\\")
    
    #(re)define the task
    taskDef = scheduler.NewTask(0)
    colTriggers = taskDef.Triggers
    
    trigger = colTriggers.Create(TASK_TRIGGER_LOGON)
    trigger.Id = "LogonTriggerId"
    trigger.UserId = os.environ.get('USERNAME') # current user account
    #trigger.Enabled = False
    
    colActions = taskDef.Actions
    action = colActions.Create(TASK_ACTION_EXEC)
    action.ID = action_id
    action.Path = action_path
    action.WorkingDirectory = action_workdir
    action.Arguments = action_arguments
    
    info = taskDef.RegistrationInfo
    info.Author = author
    info.Description = description
    
    settings = taskDef.Settings
    #settings.Enabled = False
    settings.Hidden = task_hidden
    #settings.StartWhenAvailable = True
    
    #register the task (create or update, just keep the task name the same)
    result = rootFolder.RegisterTaskDefinition(task_id, taskDef, TASK_CREATE_OR_UPDATE, "", "", TASK_LOGON_INTERACTIVE_TOKEN)
    
    '''
    # run the task once
    task = rootFolder.GetTask(task_id)
    task.Enabled = True
    runningTask = task.Run("")
    task.Enabled = False
    '''
    

    最难的部分是找出TASK_LOGON_INTERACTIVE_TOKEN = 3 而不是微软文档example 中显示的4。在post 中找到它。

    【讨论】:

      猜你喜欢
      • 2017-05-31
      • 2021-08-25
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多