ImpersonateLoggedOnUser并启动一个使用ocx的新进程失败

问题描述:

我编写一个C++ windows应用程序(A),它使用LogonUser,LoadUserProfile和ImpersonateLoggedOnUser获取另一个用户(Y)的权限。 含义A开始使用在工作站(X)上登录的用户。如果用户想提升他的权利,他只需按下一个按钮并以另一个用户身份登录,而不必自行注销窗口并返回。ImpersonateLoggedOnUser并启动一个使用ocx的新进程失败

现在的情况是(根据函数的返回值): LogonUser的工作原理,LoadUserProfile的作品和ImpersonateLoggedOnUser的作品。

模仿之后,我开始另一个过程。这个过程是一个需要OCX控制的应用程序(B)。 这会失败,应用程序告诉我.oxc文件没有正确安装。

问题是,如果我直接以登录到机器(X)的用户身份启动B,它就会起作用。 如果我以用户(Y)的身份直接开始B,而我想使用A提升我的权限,则它可以工作。

如果我以(X)身份登录并在资源管理器中选择“运行方式”(Y),它就可以工作!

你知道我需要做哪些步骤来执行与Windows上的“运行方式”对话框相同的操作吗?

+0

可能是环境瓦尔特别是如果COM注册使用%COMMONPROGRAMFILES%\ SomeDirHere \ MyLib.OCX为InProc服务器位置。转储产生的进程的环境。 – wqw 2009-09-01 19:39:43

谢谢大家您的帮助。 以下是能够解决我的问题:
我开始使用CreateProcessWithLogonW()所需的过程。 为了让这个功能正常工作,我必须RevertToSelf()之前我叫它,然后再做模拟。

所以序列是现在:

LogonUser() 
LoadUserProfile() 
ImpersonateLoggedOnUser() 
// work with the app 
RevertToSelf() 
CreateProcessWithLogonW() 
// do the impersonation stuff again 

我不知道,不过貌似模仿是不够的 - 模拟只涉及过程(A),而是试图用的CreateProcess ProcessAttributes/ThreadAttributes明确从Windows的ACL设置为模拟的用户

+0

感谢您的提示,假冒只涉及(A) 现在我尝试使用MSDN告诉我CreateProcessWithLogonW()是CreateProcessAsUser()的首选。 现在的顺序是: LogonAsUser() LoadUserProfile() ImpersonateLoggedOnUser() CreateProcessWithLogonW() 其中CreateProcessWithLogonW()失败,错误代码5(拒绝访问) 任何想法从哪里走? – markus 2009-09-01 09:29:33

+0

尝试sysinternal utils(FileMon或RegMon)在拒绝“拒绝访问”之前明确地查看究竟是什么问题。另外,每个msdn:“默认情况下,CreateProcessWithLogonW不会将指定的用户配置文件加载到HKEY_USERS注册表项中。这意味着对HKEY_CURRENT_USER注册表项中信息的访问可能不会产生与正常交互式登录一致的结果”。请注意OCX密集使用注册表。 – Dewfy 2009-09-01 11:18:09

+0

@Dewfy:谢谢你的提示。特别是你提到的工具在将来也会对我有用! 访问被拒绝是通过在调用CreateProcessWithLogonW()之前调用RevertToSelf()来解决的, – markus 2009-09-02 10:52:30