Windows用户模仿有哪些副作用?

时间:2015-02-25 18:52:40

标签: windows winapi impersonation

在Windows中,程序可以通过调用LogonUserOpenProcessToken,SSPI函数和其他几个函数来获取用户访问令牌。获得令牌之后,有许多功能可以将此令牌传递给该用户以执行操作。这些行为通常会对“父”流程产生副作用吗?

例如,您可以通过LoadUserProfile加载用户的个人资料(注册表设置等)。除此之外,LoadUserProfile会将用户的注册表配置单元加载到HKEY_USERS并将HKEY_CURRENT_USER映射到它。从父进程的角度来看,这会改变HKEY_CURRENT_USER吗?或者仅在通过CreateProcessAsUser作为该用户启动新流程后“可见”,通过ImpersonateLoggedOnUser冒充当前流程等?

1 个答案:

答案 0 :(得分:3)

根据documentationLoadUserProfile()返回已加载的HKEY_CURRENT_USER密钥的句柄。然后,您可以将该句柄传递给注册表功能,然后他们将访问该用户的数据。 LoadUserProfile()不会影响与正在运行调用进程的用户关联的HKEY_CURRENT_USER密钥。

模拟可能会影响调用进程的HKEY_CURRENT_USER密钥,但通常不会:

Predefined Keys

  

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句柄。