TaskScheduler RegisterTaskDefinition(38:4)UserID失败

我正在使用任务计划程序2.0 API来创build一个计划的任务。

遵循MSDN代码示例(用于创build时间触发的任务) ,我自己调用COM对象:

ITaskService taskService = new TaskScheduler(); taskService.Connect("", "", "", ""); ITaskDefinition task = taskService.NewTask(0); //flags reserved and must be zero task.RegistrationInfo.Author = "Me"; task.Principal.LogonType := TASK_LOGON_INTERACTIVE_TOKEN; ITimeTrigger = task.Triggers.Create(TASK_TRIGGER_TIME) as ITimeTrigger; trigger.Id = "Trigger1"; trigger.StartBoundary = "2017-03-14T16:30:00"; IExecAction action = task.Actions.Create(TASK_ACTION_EXEC) as IExecAction; action.Path = "Notepad.exe"; ITaskFolder folder = taskService.GetFolder("\"); folder.RegisterTaskDefinition("MyTaskName", task, TASK_CREATE_OR_UPDATE, Null, Null, TASK_LOGON_INTERACTIVE_TOKEN, ""); 

注意:上面的代码是从Delphi转码的; 从而不会使用不习惯的语法来吓跑人们。

在任务计划程序2.0中,所有任务实际上只是Xml。 您可以在注册之前查看任务定义的xml:

task.XmlText;

 <?xml version="1.0" encoding="UTF-16"?> <Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> <RegistrationInfo> <Author>Me</Author> </RegistrationInfo> <Triggers> <TimeTrigger id="Trigger1"> <StartBoundary>2017-03-14T16:30:00</StartBoundary> <Enabled>true</Enabled> </TimeTrigger> </Triggers> <Settings> <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries> <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries> <AllowHardTerminate>true</AllowHardTerminate> <StartWhenAvailable>false</StartWhenAvailable> <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable> <IdleSettings> <Duration>PT10M</Duration> <WaitTimeout>PT1H</WaitTimeout> <StopOnIdleEnd>true</StopOnIdleEnd> <RestartOnIdle>false</RestartOnIdle> </IdleSettings> <AllowStartOnDemand>true</AllowStartOnDemand> <Enabled>true</Enabled> <Hidden>false</Hidden> <RunOnlyIfIdle>false</RunOnlyIfIdle> <WakeToRun>false</WakeToRun> <ExecutionTimeLimit>PT72H</ExecutionTimeLimit> <Priority>7</Priority> </Settings> <Actions> <Exec> <Command>C:\Windows\System32\Notepad.exe</Command> </Exec> </Actions> </Task> 

试图注册该任务XML引发COMexception:

(38,4):用户ID

证书

MSDN的例子在他们的使用非常具体

  • logintypesTASK_LOGON_INTERACTIVE_TOKEN
  • UserId
  • 密码
  • SDDL (安全描述符列表)""

如何使用Task Scheduler 2.0 COM对象API注册计划任务?

看看本书后面的答案,继续前进

没有任何代码示例处理UserId 。 但是,如果我手动在任务调度程序中创build一个任务,并将其导出到XML:

在这里输入图像说明

可以在一个Principles元素中find一个UserId元素:

 <Principals> <Principal id="Author"> <UserId>S-1-5-21-1708537768-854245398-2146844275-1109</UserId> <LogonType>InteractiveToken</LogonType> <RunLevel>LeastPrivilege</RunLevel> </Principal> </Principals> 

即使我的代码(和MSDN示例)都调用:

MSDN

 // Set up principal logon type to interactive logon pTask->get_Principal( &pPrincipal ); pPrincipal->put_LogonType( TASK_LOGON_INTERACTIVE_TOKEN ); 

 task.Principal.LogonType := TASK_LOGON_INTERACTIVE_TOKEN; 

我的工作不正常 是什么赋予了?

即使我必须弄清楚用户的Sid:

  • 为什么MSDN示例不必?
  • 为什么这个人不必要

是什么赋予了?

另一个MSDN示例

规范的MSDN示例只设置:

 task.Principal.LogonType := TASK_LOGON_INTERACTIVE_TOKEN; 

MSDN上的另一个例子是 :

 task.Principal.Id := 'Principle1'; task.Principal.LogonType := TASK_LOGON_INTERACTIVE_TOKEN; task.Principal.RunLevel := TASK_RUNLEVEL_LUA; 

然后将原理相关的元素添加到最终的XML:

 <Principals> <Principal id="Principle1"> <RunLevel>LeastPrivilege</RunLevel> </Principal> </Principals> 

但仍然失败:

 (15,8):UserId 

为我的新的Xml:

  1: <?xml version="1.0" encoding="UTF-16"?> 2: <Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> ... 12: <Principals> 13: <Principal id="Principle1"> 14: <RunLevel>LeastPrivilege</RunLevel> 15: </Principal> 16: </Principals> ... 43: </Task> 

奖金阅读

  • ServerFault上的示例代码
  • 示例文章