Windows 用户模拟都有哪些副作用?

Posted

技术标签:

【中文标题】Windows 用户模拟都有哪些副作用?【英文标题】:What side affects are there from Windows user impersonation?Windows 用户模拟有哪些副作用? 【发布时间】:2015-02-25 18:52:40 【问题描述】:

在 Windows 中,程序可以通过调用 LogonUserOpenProcessToken、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是啥?都有哪些作用

怎么使用windows 操作系统中的恢复控制台,它的作用都有哪些?

C# 常用 命名空间都有哪些 这些命名空间是的作用是?