我正在使用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);
}
当此代码运行时,我正在考虑将代码添加到服务中。
答案 0 :(得分:0)
您误解了CreateProcessAsUser函数的用途。这不是一个不常见的误解。
Win32函数CreateProcessAsUser,CreateProcessWithLogonW,LogonUser,LogonUserEx,LogonUserExExW,CreateLogonSession等等都与内核的安全模型(进程,登录会话和令牌)有关,而不是交互式登录过程(创建)远程桌面会话,将它们与用户关联,以及在它们之间切换。)
虽然有一些函数(例如ExitWindowsEx)允许您关闭当前用户,但是没有允许您控制交互式登录过程的Win32函数。
相反,根据您的具体情况,您可以注册credential provider或使用AutoAdminLogon registry settings。前者要复杂得多;后者更受限制 - 特别是,如果系统已注销,似乎没有任何可靠的方法来启动使用新凭据登录,而不是重启系统。
如果您确实使用了AutoAdminLogon,请务必按照Protecting the Automatic Logon Password中的说明保持密码(合理)安全。