Windows用户冒充有哪些影响?

Windows中,程序可以通过调用LogonUserOpenProcessToken ,SSPI函数和其他一些程序来获取用户访问令牌。 一旦你有了令牌,有很多function可以把这个令牌传递给这个用户。 这些行为通常对“父母”过程有副作用吗?

例如,您可以通过LoadUserProfile加载用户的configuration文件(registry设置等)。 除此之外, LoadUserProfile会将用户的registryconfiguration单元加载到HKEY_USERS并将HKEY_CURRENT_USER映射到它。 从父进程的angular度来看,这是否改变了HKEY_CURRENT_USER ? 或者是通过CreateProcessAsUser作为该用户启动一个新进程后才“可见”,通过ImpersonateLoggedOnUserImpersonateLoggedOnUser当前进程?

Solutions Collecting From Web of "Windows用户冒充有哪些影响?"

根据其文档 , 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模拟用户,则会在该过程期间映射到该用户的密钥。 Raymond Chen甚至在他的博客上也表示:

从服务调用SHFileOperation是错误的吗? 修订

在进程首次访问密钥时,注册表项HKEY_CURRENT_USER被绑定到当前用户:

这意味着如果您模拟用户,然后访问HKEY_CURRENT_USER,然后将HKEY_CURRENT_USER绑定到模拟的用户。 即使您停止模拟,未来引用HKEY_CURRENT_USER仍将引用该用户。

但是,在大多数情况下,您可能在模拟任何人之前访问注册表,或者在模拟时不访问注册表,因此HKEY_CURRENT_USER通常会映射到应用程序正在运行的用户。 如果一个线程正在模拟一个用户并需要访问该用户的HKEY_CURRENT_USER键,请使用OpenThreadToken() (如果您还没有该令牌)并使用LoadUserProfile()来获取该用户的HKEY_CURRENT_USER句柄。