为什么创建的任务计划无法执行?

时间:2021-03-20 04:36:52
我从网上找到了一段代码,用来创建任务计划。
但是在保存时么有返回S_OK, 而是返回E_ACCESSDENIED。
在任务计划中可以看到创建了一个任务,各种设置和手动设置的没有什么差别。
但是手动设置的没有问题,用代码创建的却无法启动,好像就是保存有问题。

我使用下面的代码为基础修改的,没有做太大变化:

BOOL CTimeSet::CreateTask(
  WCHAR *in_wszTaskName,//任务名称
  WCHAR *in_wszTargetName,//完整的名称
  WCHAR *in_wszStartPath,//开始位置
  WCHAR *in_wszComment,//备注信息
  WCHAR *in_wszAccountName,//用户名
  WCHAR *in_wszPwd,//用户密码
  SYSTEMTIME *in_pStartTime,//任务开始时间
  SYSTEMTIME *in_pEndTime,//任务结束时间
  DWORD in_dwStartType)//任务类型
{
 BOOL bResult = FALSE;
 HRESULT hr = S_OK;
 ITaskScheduler *pITS;
 SYSTEMTIME time;
 GetLocalTime(&time);

 if(!in_wszTaskName|| !in_wszTargetName)//均不能为空
{
return bResult;
}

/*CoCreateInstance(*/
::CoInitialize(NULL);
hr = CoCreateInstance(CLSID_CTaskScheduler,
NULL,
CLSCTX_INPROC_SERVER,
IID_ITaskScheduler,
(void **) &pITS);
if (FAILED(hr))
{
//printf("Failed calling CoCreateInstance, error = 0x%x\n",hr);
}
 else
 {
  ITask *pITask;
  pITS->Delete(in_wszTaskName);
  hr = pITS->NewWorkItem(in_wszTaskName, // Name of task
  CLSID_CTask, // Class identifier
  IID_ITask, // Interface identifier
  (IUnknown**)&pITask); // Address of task
  if (FAILED(hr))
  {
  //printf("Failed calling NewWorkItem, error = 0x%x\n",hr);
  }
  else
  {
  IPersistFile *pIPersistFile;
  hr = pITask->QueryInterface(IID_IPersistFile,(void **)&pIPersistFile);
  if (FAILED(hr))
  {
  //printf("Failed calling QueryInterface, error = 0x%x\n",hr);
  }
  else
  {
  hr = pITask->SetApplicationName(in_wszTargetName);//设置新任务的名称
  if (FAILED(hr))
  {
  //printf("Failed calling SetApplicationName, error = 0x%x\n",hr);
  }
  pITask->SetWorkingDirectory(in_wszStartPath);
  if(in_wszComment)// 设置备注信息
  {
  hr = pITask->SetComment(in_wszComment);
  if (FAILED(hr))
  {
  //printf("Failed calling SetComment, error = 0x%x\n",hr);
  }
  }

  if(in_wszAccountName)//设置用户名和密码
  {
  hr = pITask->SetAccountInformation(in_wszAccountName,NULL);
  if (FAILED(hr))
  {
  //printf("Failed calling SetAccountInformation, error = 0x%x\n",hr);
  }
  }

  DWORD dwFlag;
dwFlag = TASK_FLAG_INTERACTIVE; //使任务可以使用
  hr = pITask->GetFlags(&dwFlag);//先获得本来的flag
  if (FAILED(hr))
  {
  //printf("Failed calling GetFlags, error = 0x%x\n",hr);
  }
  //printf("dwFlag = 0x%x\n",dwFlag);

    
  //dwFlag |= TASK_FLAG_DELETE_WHEN_DONE; //任务完成后删除任务
  hr = pITask->SetFlags(dwFlag);
  if (FAILED(hr))
  {
  //printf("Failed calling SetFlags, error = 0x%x\n",hr);
  }


  //设置任务触发时间
  ITaskTrigger *pITaskTrigger;
  WORD piNewTrigger;
  hr = pITask->CreateTrigger(&piNewTrigger, &pITaskTrigger);
  //piNewTrigger : A pointer to the returned trigger index value of the new trigger.
  //pITaskTrigger : A pointer to a pointer to an ITaskTrigger interface.
  if (FAILED(hr))
  {
  //wprintf(L"Failed calling ITask::CreatTrigger: error = 0x%x\n",hr);
  }
  else
  {
  TASK_TRIGGER pTrigger;
  ZeroMemory(&pTrigger, sizeof (TASK_TRIGGER));
UpdateData(true);
  // Add code to set trigger structure?
  pTrigger.wBeginDay = in_pStartTime->wDay; // Required
  pTrigger.wBeginMonth = in_pStartTime->wMonth; // Required
  pTrigger.wBeginYear = in_pStartTime->wYear; // Required
  //pTrigger.wStartHour = m_dtDatetime.GetHour();
  //pTrigger.wStartMinute = m_dtDatetime.GetMinute();
  pTrigger.cbTriggerSize = sizeof (TASK_TRIGGER);
  if(in_pEndTime)
  {
  pTrigger.wEndDay = in_pEndTime->wDay;
  pTrigger.wEndMonth = in_pEndTime->wMonth;
  pTrigger.wEndYear = in_pEndTime->wYear;
  }
  pTrigger.TriggerType = /*TASK_TIME_TRIGGER_ONCE*/(TASK_TRIGGER_TYPE)in_dwStartType;//设置触发类型
hr = pITaskTrigger->GetTrigger(&pTrigger);
CTime time;
m_TimeBegin.GetTime(time);
pTrigger.wStartHour = time.GetHour();
  pTrigger.wStartMinute = time.GetMinute();
//pTrigger.rgFlags = TASK_TRIGGER_FLAG_HAS_END_DATE;
  hr = pITaskTrigger->SetTrigger(&pTrigger);
  if (FAILED(hr))
  {
  //wprintf(L"Failed calling ITaskTrigger::SetTrigger: error = 0x%x\n",hr);
  //wprintf(L"ErrorCode = %d\n",GetLastError());
  }
  else
  {
  IPersistFile *pIPersistFile;
  hr = pITask->QueryInterface(IID_IPersistFile,(void **)&pIPersistFile);
  if (FAILED(hr))
  {
  //wprintf(L"Failed calling QueryInterface::QueryInterface: error = 0x%x\n",hr);
  }
  else
  {
  hr = pIPersistFile->Save(NULL,TRUE);
  if (FAILED(hr))
  {
  //wprintf(L"Failed calling IPersistFile::Save: error = 0x%x\n",hr);
  }
  else
  {
  //wprintf(L"The trigger was created and IPersistFile::Save was called to save the new trigger to disk.\n");
  bResult=TRUE;
  }
  pIPersistFile->Release();
  }
  }
  pITaskTrigger->Release();
  }
  // }
  //}
  //pIPersistFile->Release();
  }
  pITask->Release();
  }
  pITS->Release();
 }
 ::CoUninitialize();
 return bResult;
}

6 个解决方案

#1


有没有人帮我回答一下?

#2


谁回个帖啊?
回帖的话我就结贴给分了。

#3


创建计划任务:
那不如:

NetScheduleJobAdd
The NetScheduleJobAdd function submits a job to run at a specified future time and date. This function requires that the schedule service be started at the computer to which the job is submitted.

Security Requirements
Only members of the Administrators local group can successfully execute the NetScheduleJobAdd function on a remote server.

NET_API_STATUS NetScheduleJobAdd(
  LPCWSTR Servername,  
  LPBYTE Buffer,      
  LPDWORD JobId       
);

#5


计划任务的执行需要Task Scheduler服务启动

#6


出了服务,运行方式也是一个问题
即使账户是administrator,没有密码
运行方式设置NT AUTHORITY\SYSTEM
但是代码怎么设置呢?

#1


有没有人帮我回答一下?

#2


谁回个帖啊?
回帖的话我就结贴给分了。

#3


创建计划任务:
那不如:

NetScheduleJobAdd
The NetScheduleJobAdd function submits a job to run at a specified future time and date. This function requires that the schedule service be started at the computer to which the job is submitted.

Security Requirements
Only members of the Administrators local group can successfully execute the NetScheduleJobAdd function on a remote server.

NET_API_STATUS NetScheduleJobAdd(
  LPCWSTR Servername,  
  LPBYTE Buffer,      
  LPDWORD JobId       
);

#4


#5


计划任务的执行需要Task Scheduler服务启动

#6


出了服务,运行方式也是一个问题
即使账户是administrator,没有密码
运行方式设置NT AUTHORITY\SYSTEM
但是代码怎么设置呢?