在Windows中,程序可以通过调用获取用户访问令牌LogonUser
, OpenProcessToken
,SSPI功能,和一对夫妇等。 一旦你的道理,也有不少,你可以通过这个令牌进入以做事为这个用户的一些功能。 做这些排序通常有副作用的“父”进程的行动?
例如,您可以通过加载用户的配置文件(注册表设置等) LoadUserProfile
。 除其他事项外, LoadUserProfile
将用户的注册表配置单元加载到HKEY_USERS
和地图HKEY_CURRENT_USER
它。 从父进程的角度来看,这是否改变HKEY_CURRENT_USER
? 或者是开始一个新的过程,通过该用户后才“可见” CreateProcessAsUser
,通过冒充在当前进程ImpersonateLoggedOnUser
等?
每它的文档 , LoadUserProfile()
返回的句柄HKEY_CURRENT_USER
已加载密钥。 然后,您可以通过该句柄登记职能,他们会访问该用户的数据。 LoadUserProfile()
不影响HKEY_CURRENT_USER
与运行调用进程的用户相关联的密钥。
模拟会影响通话过程中的HKEY_CURRENT_USER
关键,但通常不会:
预定义项
HKEY_CURRENT_USER
...
HKEY_CURRENT_USER和HKEY_USERS之间的映射是每个进程并且建立首次进程引用HKEY_CURRENT_USER。 该映射是基于所述第一线程来引用HKEY_CURRENT_USER的安全上下文 。 如果此安全性上下文没有在HKEY_USERS加载注册表配置单元,映射建立与HKEY_USERS.Default。 在建立映射后,它仍然存在,即使线程变化的安全环境 。
所以,如果你要模拟当您使用用户HKEY_CURRENT_USER
首次,那么它将映射到用户对过程的持续时间的关键。 雷蒙德陈甚至高达上他的博客中说:
这是错误的,从一个服务调用SHFileOperation? 修订
该注册表项HKEY_CURRENT_USER被绑定到在键首先由进程访问时的当前用户:
...
这意味着,如果您模拟用户,然后访问HKEY_CURRENT_USER,然后结合HKEY_CURRENT_USER到模拟的用户。 即使你停止冒充,到HKEY_CURRENT_USER将来参考仍将是指该用户。
然而,大多数情况下,你可能会模仿你的人之前,或在冒充您将无法访问注册表,所以访问注册表HKEY_CURRENT_USER
通常会映射到该应用程序正在运行的用户。 如果一个线程模拟用户和需要访问该用户的HKEY_CURRENT_USER
键,使用OpenThreadToken()
如果您还没有令牌)和LoadUserProfile()
来获取用户的HKEY_CURRENT_USER
手柄。