如何使当前用户运行预定流程?

时间:2014-10-23 23:11:13

标签: c++ winapi scheduled-tasks

我使用与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;
}

0 个答案:

没有答案