编程式创建Windows用户配置文件

4

我正在尝试做与此问题提问者类似的事情:

从凭据提供程序 DLL 发出 HTTPS 请求

关于用户配置文件的组成部分,我找到了this

  • Windows 认可和加载的最小配置文件是什么?
  • 如何创建并向 Windows 注册配置文件?

我的目标是 Windows 7(专业版或企业版)。我更熟悉 Linux,对于在 Windows 上编程一窍不通,所以请温柔点。

P.S. 是否有一种方法可以在 Linux 上开始开发,然后在 Windows 上测试而不使用虚拟机?

这就是我要做的事情

我正在构建一个用于同步配置文件的程序,供那些经常移动的人使用,这样他们就不必随身携带笔记本电脑。这个问题涉及到用户登录新电脑的情况。可能的应用包括:

  • 经常在办公室之间旅行的商人
  • 每天使用不同电脑的学生
  • 在国外使用网吧的用户
  • 不喜欢在获取新电脑时复制文件的家庭用户

我想提供尽可能好的用户体验,这意味着几乎即时地创建用户配置文件。 漫游配置文件最多也很慢且容易出现错误。 让Windows创建配置文件并不是一个真正的选择,因为我需要进行自定义身份验证(我已经解决了这个问题),并且我需要从服务器复制设置。

我需要的是一种方法:

  • 只在用户登录时创建必需的基本内容
  • 如果已更新配置文件,则从云端更新设置
  • 让用户在30秒内(最好更快)从登录屏幕到工作状态

这是我考虑要做的事情:

  • 与服务器验证用户身份
  • 联系Windows服务处理配置文件的创建/更新
  • Windows服务将在创建配置文件时下载必要的设置
  • 应用设置
  • 用户登录
2个回答

7
首先,我建议您阅读有关用户配置文件的this
用户配置文件的主要思想很简单,自从 Windows NT 的第一个版本(我的意思是 Windows NT 3.1)以来它一直保持不变:用户配置文件由存在于本地计算机上的目录结构组成。用户配置文件中的一个文件(称为 "hive")表示注册表中当前用户部分。重要的是,用户对其用户配置文件具有完全访问权限。访问权限不仅保存在文件系统中,而且还保存在注册表内部。因此,在为用户创建配置文件之前,必须先创建用户帐户,因为文件或注册表键的安全描述符的一部分必须包含用户的 SID(安全标识符)。
如果要创建新的用户配置文件,则将使用用户配置文件的“原型”作为模板。可以在注册表中找到模板的路径,作为HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList注册表键下的Default值。您可以使用GetDefaultUserProfileDirectory获取相同的信息。
要创建个人资料,应使用用户帐户登录以获取登录令牌(请参见LogonUser,其中dwLogonType参数的LOGON32_LOGON_INTERACTIVE标志),然后使用LoadUserProfile,如果用户不存在本地用户配置文件,则将创建它。 如果用户具有集中式或漫游配置文件,则应在输入PROFILEINFO结构中填写lpProfilePath,以便将其指向位于服务器上的用户的漫游配置文件路径。 要获取路径,可以使用dwLevel等于4的NetUserGetInfo。 这种方法非常古老,例如在此处中描述。
因为从[LogonUser]获取的登录令牌实际上只需要获取用户SID,以便授予用户对其文件和注册表键的权限,因此自Vista开始,微软引入了另一个简化且非常实用的API CreateProfile来替换CreateUserProfileEx(仅存在于Windows XP)。
我之前解释的一切实际上只在很少的情况下需要。大多数情况下,只有在您将用户帐户用于Windows服务时才会自动创建用户配置文件,否则用户配置文件将会在计算机上第一次交互式用户登录时自动创建
如果您需要对计算机上所有用户进行更改(例如在安装新软件后),则可以在不创建用户配置文件的情况下通过许多方式完成此操作。
如果您能更准确地说明为什么需要创建用户配置文件,我可能会建议您实现相同目标的其他替代方法。

非常感谢您的快速回复!我将把您的答案标记为正确的。我已经添加了我的问题。如果您能给我一些额外的指导,那将非常有帮助。非常感谢您详尽的答复。 - beatgammit
我必须等到明天才能奖励你的赏金。再次感谢! - beatgammit
只是一些注意事项。LOGON32_LOGON_INTERACTIVE 不是必需的,也可以与 LOGON32_LOGON_NETWORK 一起使用。在所有现代 Windows 版本中,您需要以管理员身份启动应用程序(模拟将不起作用)。 - Adi Roiban
@AdiRoiban:这个问题是关于用户配置文件创建的。使用 LOGON32_LOGON_NETWORK 登录速度很快,但它不会执行许多生成配置文件所需的重要操作。例如,交互式登录需要为断开的操作缓存登录信息,这可能非常重要,特别是对于笔记本电脑和Windows服务(请参见问题文本)。 - Oleg
感谢您的解释。LoadUserProfile 的文档说明调用者必须具备 SE_RESTORE_NAME 和 SE_BACKUP_NAME 特权,并且在最近的 Windows 版本中必须是管理员。在 Windows 2008 Server 上,我能够使用具有 SE_RESTORE 和 SE_BACKUP 特权的非管理员用户来使用 LoadUserProfile,并使用“以管理员身份运行”的方式启动应用程序。 - Adi Roiban

1

我在ServerFault上问了一个非常相似的问题,并且我真的很喜欢那里得到的答案。简而言之,这些是步骤:

  • 创建Windows服务以创建配置文件
  • 创建自定义ICredentialsProvider并验证用户
  • 调用配置文件创建服务
  • 告诉Windows继续登录

似乎没有直接的方法来覆盖它,但这似乎相当聪明,很可能是唯一的解决方案。

由于没有人发表评论或留下答案,我会稍微改变我的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接