无法更改用户的会话(切换用户)

时间:2014-05-12 17:54:17

标签: c++ windows

我正在使用C ++。 我在计算机上找到了多个用户配置文件,我想编写一个更改会话的服务。但我不能改变任何会话。我在下面的代码中找到了我用来更改用户会话的代码。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa379608(v=vs.85).aspx

我尝试过CreateProcessAsUser函数,而不是CreateProcessWithLogonW和CreateProcessWithTokenW。但它有所有函数返回FALSE。 来自0xcccccccc的pi.hProcess和pi.hThread值。返回的值错误代码87。 该计划在此结束:

bResult = CreateProcessAsUser(
    hToken,            
    NULL,              
    NULL,           
    NULL,              
    NULL,             
    FALSE,             
    NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE , 
    NULL,              
    NULL,             
    &si,               
    &pi               
    );




RevertToSelf();

if (bResult && pi.hProcess != INVALID_HANDLE_VALUE)
{
    WaitForSingleObject(pi.hProcess, INFINITE);
    CloseHandle(pi.hProcess);
}

if (pi.hThread != INVALID_HANDLE_VALUE){ //p.hTheread = 0xcccccccc
    wprintf(L"%d\n", GetLastError()); // ErrorCode=87. 
    CloseHandle(pi.hThread); 
}

当此代码运行时,我正在考虑将代码添加到服务中。

1 个答案:

答案 0 :(得分:0)

您误解了CreateProcessAsUser函数的用途。这不是一个不常见的误解。

Win32函数CreateProcessAsUser,CreateProcessWithLogonW,LogonUser,LogonUserEx,LogonUserExExW,CreateLogonSession等等都与内核的安全模型(进程,登录会话和令牌)有关,而不是交互式登录过程(创建)远程桌面会话,将它们与用户关联,以及在它们之间切换。)

虽然有一些函数(例如ExitWindowsEx)允许您关闭当前用户,但是没有允许您控制交互式登录过程的Win32函数。

相反,根据您的具体情况,您可以注册credential provider或使用AutoAdminLogon registry settings。前者要复杂得多;后者更受限制 - 特别是,如果系统已注销,似乎没有任何可靠的方法来启动使用新凭据登录,而不是重启系统。

如果您确实使用了AutoAdminLogon,请务必按照Protecting the Automatic Logon Password中的说明保持密码(合理)安全。