【发布时间】:2008-10-13 16:09:48
【问题描述】:
在服务中,为特定用户确定特殊文件夹路径(例如“我的文档”)的最佳方法是什么? SHGetFolderPath 允许你传入一个令牌,所以我假设有一些方法可以模拟你感兴趣的文件夹的用户。
有没有办法仅基于用户名来做到这一点?如果不是,您需要为用户帐户提供的最少信息量是多少?我宁愿不需要用户的密码。
(这里是related question。)
【问题讨论】:
在服务中,为特定用户确定特殊文件夹路径(例如“我的文档”)的最佳方法是什么? SHGetFolderPath 允许你传入一个令牌,所以我假设有一些方法可以模拟你感兴趣的文件夹的用户。
有没有办法仅基于用户名来做到这一点?如果不是,您需要为用户帐户提供的最少信息量是多少?我宁愿不需要用户的密码。
(这里是related question。)
【问题讨论】:
请不要进入注册表查找此信息。在未来的 Windows 版本中,该位置可能会发生变化。请改用 SHGetFolderPath。
http://msdn.microsoft.com/en-us/library/bb762181(VS.85).aspx
编辑:看起来LogonUser 将为您需要的其他用户提供令牌。
【讨论】:
您可以尝试调用ImpersonateLoggedOnUser() 为另一个用户修改用户令牌,然后将其传递给 SHGetFolderPath()。根据 ImpersonateLoggedOnUser() 的文档,您似乎可以调用 LogonUser() 来获取特定用户的令牌。
仅通过阅读,我猜想相关用户必须以某种形式登录才能使其正常工作。我记得有一页说必须安装用户的注册表配置单元才能使其正常工作(我想这是有道理的)。
【讨论】:
我会挂载用户的注册表配置单元并查找路径值。是的,由于所有提到的原因(前向兼容性差等),这是一个次优的解决方案。但是,与 Windows 中的许多其他东西一样,MS 没有提供 API 方式来做您想做的事情,因此它是可用的最佳选择。
您可以使用LookupAccountName 获取用户的 SID(而非 GUID)。您可以使用LoadUserProfile 加载用户的注册表配置单元,但不幸的是,这也需要用户令牌,这将需要他们的密码。幸运的是,您可以使用 RegLoadKey 手动将配置单元加载到任意位置,读取数据并卸载它(我认为)。
是的,这很痛苦,是的,它可能会在未来的 Windows 版本中出现问题。也许到那个时候,MS 会提供一个 API 来做这件事,将它反向移植到旧版本的 Windows 中,并通过 Windows 更新自动分发它......但我不会屏住呼吸。
附:此信息旨在补充您在相关问题中提供的信息,包括免责声明。
【讨论】:
此信息存储在注册表项“HKEY_USERS\S-1-5-21-616815238-485949776-2992451252-3228\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders”中。
“S-1-5-21-616815238-485949776-2992451252-3218”是用户的 GUID。您需要获取此 GUID 才能找到对应的密钥并进行读取。
在this 示例中,他们使用您提到的 SHGetFolderPath 函数,并且有一个包含所有特殊文件夹的列表,可能会有所帮助。
注意:Microsoft 不鼓励使用注册表项,因为它仍然存在只是为了向后兼容
【讨论】: