有什么区别:LoadUserProfile -vs- RegOpenCurrentUser

时间:2009-01-19 21:36:12

标签: c++ windows impersonation token roaming-profile

这两个API非常相似,但不清楚区别是什么以及何时应该使用它们(除了指定LoadUserProfile与我不使用的CreateProcessAsUser一起使用。我只是模仿hive访问)。

LoadUserProfile http://msdn.microsoft.com/en-us/library/bb762281(VS.85).aspx

RegOpenCurrentUser http://msdn.microsoft.com/en-us/library/ms724894(VS.85).aspx

根据服务和&注册表文章: http://msdn.microsoft.com/en-us/library/ms685145(VS.85).aspx 我们应该在模仿时使用RegOpenCurrentUser。

但是如果用户个人资料正在漫游,那么RegOpenCurrentUser应该做什么/应该加载它?

据我从这些文档中可以看出,两个API都为线程模拟的用户提供了HKEY_CURRENT_USER的句柄。因此,它们都“加载”hive,即将其锁定为数据库文件,并为注册表API提供句柄。

似乎LoadUserProfile以与用户登录时相同的方式加载用户配置文件,而RegOpenCurrentUser则不是 - 这是正确的吗?这两个API如何安装配置单元的根本区别(如果有的话)是什么?

IF

之间的含义和差异(如果有的话)是什么?
  1. 当这些模拟句柄中的每个句柄都在使用时,用户是登录还是注销?

  2. 当调用每个匹配的关闭函数(RegCloseKey和UnloadUserProfile)时,用户已经登录了吗?

3 个答案:

答案 0 :(得分:1)

  

但是如果用户个人资料正在漫游,那么RegOpenCurrentUser应该做什么/应该加载它?

它不会加载配置文件。以这种方式思考:如果确实如此,那么在完成UnloadUserProfile()的句柄后,您必须以某种方式调用HKEY_CURRENT_USER

  

似乎LoadUserProfile以与用户登录时相同的方式加载用户配置文件,而RegOpenCurrentUser则不是 - 这是正确的吗?

  

这两个API如何安装配置单元的根本区别(如果有的话)是什么?

无。

  

IF之间会发生什么影响和差异(如果有的话)   用户登录或注销时,这些模拟句柄中的每一个都已被使用?

他们将获得自己的手柄(相同的钥匙)打开和关闭。

  

当调用每个匹配的关闭函数(RegCloseKey和UnloadUserProfile)时,用户已经登录了吗?

同上。

答案 1 :(得分:1)

由于我目前正在尝试完成同样的事情,我认为我会在过去几天里发现我所发现的事情。

我正在Windows XP sp3环境中工作并尝试在两种不同的场景中使用CurrentUser注册表访问来模拟

如果你遇到任何有用的东西,如果你分享你的经验,我将非常感激。 My stack overflow question can be found here

管理员>有限的用户和受限用户>管理员

到目前为止我注意到的是(在Windows XP sp3中)

LoadUserProfile():

仅当模仿用户启用了SeRestoreName和SeBackupName权限时才起作用(仅为有限用户启用这两个权限是不够的,因为它仍然因访问被拒绝错误而失败 - 有关详细信息,请参阅我的StackOverflow问题)。到目前为止,我能够成功调用LoadUserProfile()的唯一方法是在开始模拟之前通过管理员帐户执行此操作。

RegOpenCurrentUser():

只有在用户的个人资料已经加载时才“正常”工作,在我迄今为止所做的每一次尝试中,我只能获得S-1-5-18配置单元的句柄,除非用户配置单元被加载并已在HKEY_USERS下访问

答案 2 :(得分:0)

这两个功能在不同情况下使用。

如果尚未加载用户个人资料,则

LoadUserProfile是合适的。

RegOpenCurrentUser适用于已加载用户配置文件 的情况,即,如果您要访问已经交互式登录的用户的注册表配置单元。

请注意,LoadUserProfile通常称为,没有模拟(因为您必须具有管理员权限才能使用它),但RegOpenCurrentUser必须使用调用 >冒充。