程序化的 Windows 用户配置文件创建
Posted
技术标签:
【中文标题】程序化的 Windows 用户配置文件创建【英文标题】:Programmatic Windows user profile creation 【发布时间】:2011-04-02 05:43:43 【问题描述】:我正在尝试做一些类似于提出这个问题的用户正在尝试做的事情:
HTTPS Request From a Credential Provider DLL
关于用户配置文件的组成部分,我找到了this。
Windows 可以识别和加载的最低配置文件是多少? 如何在 Windows 中创建和注册配置文件?我的目标是 Windows 7(专业版或企业版)。我更喜欢 Linux,所以在 Windows 上编程时我很无知,所以请温柔。
附:有没有一种方法可以让我在 Linux 上开始开发,然后在不使用 VM 的情况下在 Windows 上进行测试?
这就是我想要做的事情
我正在构建一个个人资料同步程序,供经常四处走动的人使用,这样他们就不必随身携带笔记本电脑了。这个问题解决了用户登录到新计算机的情况。可能的应用是:
经常在办公室之间出差的商务人士 每天使用不同计算机的学生 国外网吧用户 不喜欢在获得新计算机时复制文件的家庭用户我想尽可能提供最佳的用户体验,这意味着近乎即时的个人资料创建。漫游配置文件充其量是缓慢和错误的。让 Windows 创建配置文件并不是一个真正的选择,因为我需要进行自定义身份验证(我想出了这个)并且我需要从服务器复制设置。
我需要的是一种方法:
仅在用户登录时创建基本要素 如果配置文件已更新,则从云端更新设置 让用户在 30 秒内从登录屏幕开始工作(最好更快)这就是我想做的事情:
使用服务器验证用户 联系 Windows 服务以处理配置文件的创建/更新 Windows 服务将在创建配置文件时下载裸设置 设置已应用 用户已登录【问题讨论】:
【参考方案1】:首先,我建议您阅读this 关于用户配置文件的信息。
用户配置文件的主要思想很简单,并且从 Windows NT 的第一个版本(我的意思是 Windows NT 3.1)开始就保持不变:用户配置文件由本地计算机上存在的目录结构组成。用户配置文件中的一个文件(名为 hive)代表注册表的当前用户部分。用户对其用户配置文件具有完全访问权限,这一点很重要。访问权限不仅保存在文件系统中,还保存在注册表内部中。因此,要为用户创建配置文件,必须先创建用户帐户,因为注册表键文件的安全描述符部分必须包含用户的 SID(安全标识符)。
如果将创建新的用户配置文件,则用户配置文件的“原型”将用作模板。您可以在注册表中以Default
值在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
注册表项下找到模板的路径。您可以使用GetDefaultUserProfileDirectory 获取相同的信息。
要创建配置文件,应使用用户帐户登录以获取登录令牌(请参阅 LogonUser 和 LOGON32_LOGON_INTERACTIVE
标志以获取 dwLogonType
参数)然后使用 LoadUserProfile 将创建本地用户配置文件,如果用户不存在。如果用户有中心或roaming profile,则应填写输入PROFILEINFO 结构lpProfilePath
,使其指向服务器上用户的漫游配置文件路径。要获得路径,可以使用NetUserGetInfo 和dwLevel
等于4。这种方式非常古老,例如here 进行了描述。
因为来自 [LogonUser] 的登录令牌实际上只需要获取用户 SID,这是授予用户对其文件和注册表项的权限所需的,从 Vista 开始,微软引入了另一个简化且非常实用的 API CreateProfile,它取代了CreateUserProfileEx(仅存在于 Windows XP 上)。
我之前解释的所有内容只有在极少数情况下才真正需要。大多数情况下,仅当您使用 Windows 服务的用户帐户时。在标准情况下,用户配置文件将在计算机上在第一次交互式用户登录时自动创建。
如果您需要对计算机上的所有用户进行一些更改,例如在安装新软件之后,您可以通过多种方式进行更改,而无需创建用户配置文件。
如果您更准确地解释为什么需要创建用户配置文件,我可能会建议您使用其他方法来归档相同的目标。
【讨论】:
非常感谢您的快速回复!!我会把你的标记为正确的。我已经添加到我的问题中。你能给我的任何额外指导都会很有帮助。非常感谢您的详尽回答。 我必须等到明天才能奖励你的赏金。再次感谢! 只是一些笔记。 LOGON32_LOGON_INTERACTIVE 不是强制性的,它也适用于 LOGON32_LOGON_NETWORK。在所有现代 Windows 版本上,您都需要以管理员身份启动应用程序(模拟不起作用)。 @AdiRoiban:问题是关于用户配置文件的创建。使用LOGON32_LOGON_NETWORK
登录很快,但它并没有做很多生成配置文件可能需要的重要事情。例如交互式登录需要为断开连接的操作缓存登录信息的额外费用。这对于笔记本来说非常重要,尤其是对于具有 Windows 服务 的场景(请参阅问题的文本)。
感谢您的解释。 LoadUserProfile 的文档指出调用者必须具有 SE_RESTORE_NAME 和 SE_BACKUP_NAME 权限,并且在最近的 Windows 版本上必须是管理员。在 Windows 2008 Server 上,我能够以具有 SE_RESTORE 和 SE_BACKUP 权限的非管理员用户身份使用 LoadUserProfile,并使用“以管理员身份运行”启动应用程序。【参考方案2】:
我在 ServerFault 上问了一个非常 similar question,我真的很喜欢我得到的答案。换句话说,这些是步骤:
创建 Windows 服务以创建配置文件 创建自定义 ICredentialsProvider 并验证用户身份 调用配置文件创建服务 告诉 Windows 继续登录似乎没有直接的方法来覆盖它,但这似乎很聪明,而且很可能是唯一的解决方案。
由于没有人发表评论或留下答案,我将稍微改变一下我的问题。
【讨论】:
以上是关于程序化的 Windows 用户配置文件创建的主要内容,如果未能解决你的问题,请参考以下文章