Windows 用户模拟都有哪些副作用?
Posted
技术标签:
【中文标题】Windows 用户模拟都有哪些副作用?【英文标题】:What side affects are there from Windows user impersonation?Windows 用户模拟有哪些副作用? 【发布时间】:2015-02-25 18:52:40 【问题描述】:在 Windows 中,程序可以通过调用 LogonUser
、OpenProcessToken
、SSPI 函数和其他一些函数来获取用户访问令牌。获得令牌后,您可以将这个令牌传递给许多函数,以便以该用户的身份执行操作。这些行为通常会对“父”进程产生副作用吗?
例如,您可以通过LoadUserProfile
加载用户的个人资料(注册表设置等)。除此之外,LoadUserProfile
会将用户的注册表配置单元加载到HKEY_USERS
并将HKEY_CURRENT_USER
映射到它。从父进程的角度来看,这会改变HKEY_CURRENT_USER
吗?还是仅在通过CreateProcessAsUser
以该用户身份启动新进程、通过ImpersonateLoggedOnUser
模拟当前进程等后才“可见”?
【问题讨论】:
父进程是指调用 LogonUser 的进程。 【参考方案1】:根据其documentation,LoadUserProfile()
返回已加载的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
时冒充用户,那么它将在整个过程中映射到该用户的密钥。 Raymond Chen 甚至在他的博客上也这么说:
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
句柄。
【讨论】:
另见Is it wrong to call SHFileOperation from a service? Revised(旧新事物)。 对于用户的REG_EXPAND_SZ
值,调用ExpandEnvironmentStringsForUser
。
要将HKEY_CURRENT_USER
重定向到加载的配置文件密钥,请调用RegOverridePredefKey
。
@eryksun:关于RegOverridePredefKey()
是真的,尽管它仅供安装程序用于监控安装期间对注册表所做的更改。以上是关于Windows 用户模拟都有哪些副作用?的主要内容,如果未能解决你的问题,请参考以下文章
win10中的Windows PowerShell是啥?都有哪些作用
win10中的Windows PowerShell是啥?都有哪些作用
win10中的Windows PowerShell是啥?都有哪些作用