C++ 区别是什么:LoadUserProfile-vs-RegOpenCurrentUser

C++ 区别是什么:LoadUserProfile-vs-RegOpenCurrentUser,c++,windows,impersonation,token,roaming-profile,C++,Windows,Impersonation,Token,Roaming Profile,这两个API非常相似,但不清楚它们的区别是什么以及何时应该使用它们(除了LoadUserProfile被指定用于CreateProcessAsUser,我没有使用它。我只是模拟配置单元访问) LoadUserProfile RegOpenCurrentUser 根据《服务与注册》的文章: 我们应该在模拟时使用RegOpenCurrentUser 但是,如果用户配置文件是漫游的,RegOpenCurrentUser应该做什么?它应该加载吗 从这些文档中可以看出,这两个API都为线程模拟的用户提

这两个API非常相似,但不清楚它们的区别是什么以及何时应该使用它们(除了LoadUserProfile被指定用于CreateProcessAsUser,我没有使用它。我只是模拟配置单元访问)

LoadUserProfile

RegOpenCurrentUser

根据《服务与注册》的文章: 我们应该在模拟时使用RegOpenCurrentUser

但是,如果用户配置文件是漫游的,RegOpenCurrentUser应该做什么?它应该加载吗

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

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

如果发生以下情况,会产生什么影响和区别(如果有)

  • 当每个模拟句柄都已在使用时,用户是否登录或注销

  • 调用每个匹配的关闭函数(RegCloseKey和UnloadUserProfile)时,用户是否已登录

  • 但是,如果用户配置文件是漫游的,RegOpenCurrentUser应该做什么?它应该加载吗

    它不会加载配置文件。可以这样想:如果是这样的话,那么在处理完
    HKEY\U CURRENT\U USER
    的句柄后,您必须以某种方式调用
    UnloadUserProfile()

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

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

    没有

    如果发生以下情况,会产生什么影响和区别(如果有) 当每个模拟句柄都已在使用时,用户是否登录或注销

    他们将拥有自己的打开和关闭手柄(同一个键)

    调用每个匹配的关闭函数(RegCloseKey和UnloadUserProfile)时,用户是否已登录


    同上。

    由于我目前正试图完成与您相同的任务,我想我会与过去几天的发现相呼应

    我在WindowsXPSP3环境中工作,试图在两种不同的场景中使用CurrentUser注册表访问实现模拟

    如果您遇到任何有用的东西,如果您能分享您的经验,我将不胜感激

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

    到目前为止,我注意到的是(在WindowsXPSP3中)

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

    RegOpenCurrentUser():
    只有在用户配置文件已加载时才能“正常”工作,在我迄今为止的每次尝试中,我只能获得s-1-5-18配置单元的句柄,除非用户配置单元已加载并可在HKEY_下访问。用户已在不同情况下使用这两个功能

    适用于尚未加载用户配置文件的情况

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

    请注意,
    LoadUserProfile
    通常在没有模拟的情况下调用(因为您必须拥有使用它的管理员权限),但是
    RegOpenCurrentUser
    必须通过模拟来调用