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

jbz001 2011-11-29 03:59:26
我从网上找到了一段代码,用来创建任务计划。
但是在保存时么有返回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;
}
...全文
628 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Liang4 2012-01-04
  • 打赏
  • 举报
回复
出了服务,运行方式也是一个问题
即使账户是administrator,没有密码
运行方式设置NT AUTHORITY\SYSTEM
但是代码怎么设置呢?
c_losed 2011-12-10
  • 打赏
  • 举报
回复
计划任务的执行需要Task Scheduler服务启动
Gloveing 2011-12-09
  • 打赏
  • 举报
回复
创建计划任务:
那不如:

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
);
jbz001 2011-12-09
  • 打赏
  • 举报
回复
谁回个帖啊?
回帖的话我就结贴给分了。
jbz001 2011-11-30
  • 打赏
  • 举报
回复
有没有人帮我回答一下?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧