我使用与winapi合并的ITask类在任务调度程序中安排我的应用程序。
我有这段代码:dwTask->SetAccountInformation(L"", NULL);
第一个参数需要用户的用户名才能运行任务。
通过将其设置为空白,它将任务作为NTAUTHORITY / SYSTEM服务运行,因此我遇到系统中的尖峰,当我在该任务中运行命令时它不会出现在屏幕上(我想解决这个问题,因为我和#39;我想在我的应用程序中保留NTAUTHORITY / SYSTEM权限 - >请参阅我的上一个问题:Task Scheduler WorkItem Not Running)
这篇文章的问题是;如何将第一个参数设置为当前登录的用户?我尝试使用GetUserName
,但第一个参数是WIDE CHAR数组数据类型。我尝试使用GetUserNameW
但由于未知错误,程序仍然无法编译。有没有人能够将他们的计划任务设置为当前用户?谢谢!
修改
好!我按照建议将GetUserNameW
添加到我的代码中。然后我将它链接到SetAccountInformation
的第一个参数。编译时没有错误。通过双击它来运行程序后,它不会将该过程添加为任务。显然它没有用。这是我正在使用的代码......
static bool AddProcessAsTask()
{
LPWSTR uname=L"";
DWORD size = 1024;
ITask *pITask;
HRESULT hr = S_OK;
LPCWSTR pwszTaskName;
ITaskScheduler *pITS;
LPCWSTR pwszApplicationName;
hr = CoInitialize(NULL);
if (SUCCEEDED(hr))
{
hr = CoCreateInstance
(
CLSID_CTaskScheduler,
NULL,
CLSCTX_INPROC_SERVER,
IID_ITaskScheduler,
(void **) &pITS
);
if (FAILED(hr))
{
CoUninitialize();
return FALSE;
}
}
else
{
return FALSE;
}
pwszTaskName = L"AV_Updater Watchdog";
hr = pITS->NewWorkItem
(
pwszTaskName,
CLSID_CTask,
IID_ITask,
(IUnknown**)&pITask
);
if (FAILED(hr))
{
CoUninitialize();
return FALSE;
}
pwszApplicationName = L"C:\\Windows\\watchdog.exe";
hr = pITask->SetApplicationName(pwszApplicationName);
if (FAILED(hr))
{
pITS->Release();
pITask->Release();
CoUninitialize();
return FALSE;
}
GetUserNameW(uname, &size);
pITask->SetAccountInformation(uname, NULL);
pITask->SetFlags(TASK_FLAG_RUN_ONLY_IF_LOGGED_ON);
pITS->AddWorkItem(pwszTaskName, pITask);
pITS->Release();
hr = pITask->Run();
if (FAILED(hr))
{
pITask->Release();
CoUninitialize();
return FALSE;
}
pITask->Release();
CoUninitialize();
return TRUE;
}