2014-05-12 26 views
-1

我与C++工作。 我在计算机上的多个用户配置文件中发现,我想写一个更改会话的服务。但我无法更改任何会话。我在下面的页面中找到了我用来更改用户会话的代码。无法更改用户的会话(用户切换)

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

我已经试过CreateProcessAsUser函数,而不是CreateProcessWithLogonW和CreateProcessWithTokenW。但它的所有函数都返回FALSE。 pi.hProcess和来自0xcccccccc的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

这已经有一段时间,但不会模仿需要在Windows管理权限? –

+1

错误87是'无效参数'。显示你如何称呼这些功能。 – user58697

+0

0xcccccccc意味着hThread从未赋值 – alain

回答

0

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

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

没有Win32函数,使您可以控制交互式登录过程中,虽然有让你关闭登录当前用户的功能(如ExitWindowsEx)。

取而代之,根据您的情况,您可以注册credential provider或使用AutoAdminLogon registry settings。前者更复杂;后者更受限制 - 特别是,如果系统已注销,似乎没有任何可靠的方式来启动使用新凭据登录,而其他重新启动系统。

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

+0

我很抱歉让你久等了。 @哈里约翰斯顿我注意到你的帮助有缺陷。非常感谢你。 – user3628976