在Windows中,程序可以通过调用LogonUser
,OpenProcessToken
,SSPI函数和其他几个函数来获取用户访问令牌。获得令牌之后,有许多功能可以将此令牌传递给该用户以执行操作。这些行为通常会对“父”流程产生副作用吗?
例如,您可以通过LoadUserProfile
加载用户的个人资料(注册表设置等)。除此之外,LoadUserProfile
会将用户的注册表配置单元加载到HKEY_USERS
并将HKEY_CURRENT_USER
映射到它。从父进程的角度来看,这会改变HKEY_CURRENT_USER
吗?或者仅在通过CreateProcessAsUser
作为该用户启动新流程后“可见”,通过ImpersonateLoggedOnUser
冒充当前流程等?
答案 0 :(得分:3)
根据documentation,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
时冒充用户,那么它将在该过程的持续时间内映射到该用户的密钥。雷蒙德陈甚至在他的博客上说了很多话:
Is it wrong to call SHFileOperation from a service? Revised
注册表项HKEY_CURRENT_USER在进程首次访问密钥时绑定到当前用户:
...
这意味着,如果您模拟用户,然后访问HKEY_CURRENT_USER,则会将HKEY_CURRENT_USER绑定到模拟用户。即使你停止冒充,未来对HKEY_CURRENT_USER的引用仍会引用该用户。
但是,对于大多数情况,您可能会在模仿任何人之前访问注册表,或者您在模拟时不会访问注册表,因此HKEY_CURRENT_USER
通常会映射到应用程序正在运行的用户。如果某个帖子冒充用户并需要访问该用户的HKEY_CURRENT_USER
密钥,请使用OpenThreadToken()
(如果您还没有该代码)和LoadUserProfile()
获得该用户的HKEY_CURRENT_USER
句柄。