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

Can't change user's session (switch users)

本文关键字:用户 会话      更新时间:2023-10-16

我正在用c++工作。我在计算机上发现了多个用户配置文件,我想写一个改变会话的服务。但我不能更改任何会话。我发现在下面的页面代码,我正在使用更改用户会话。

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

我尝试过CreateProcessAsUser函数,而不是CreateProcessWithLogonW和CreateProcessWithTokenW。但它有所有的函数返回FALSE。π。hProcess和pi。hThread值来自0xcccccccc。返回错误码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"%dn", GetLastError()); // ErrorCode=87. 
    CloseHandle(pi.hThread); 
}

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

您误解了CreateProcessAsUser函数的目的。这是一个常见的误解。

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

没有Win32函数允许您控制交互式登录过程,尽管有函数(如ExitWindowsEx)允许您注销当前用户。

相反,根据您的情况,您可以注册凭据提供程序或使用AutoAdminLogon注册表设置。前者要复杂得多;后者的限制更大——特别是,如果系统注销了,除了重新启动系统之外,似乎没有任何可靠的方法可以用新的凭据启动登录。

如果您使用AutoAdminLogon,请确保遵循保护自动登录密码中的说明,以确保密码(合理)安全。