如何获取特定用户的Windows“特殊文件夹”的路径?

时间:2008-10-13 16:09:49

标签: c++ windows winapi

在服务中,确定特定用户的特殊文件夹路径(例如“我的文档”)的最佳方法是什么? SHGetFolderPath允许您传入令牌,因此我假设有一些方法可以冒充您感兴趣的文件夹的用户。

有没有办法只根据用户名执行此操作?如果没有,用户帐户所需的最小信息量是多少?我宁愿不需要用户的密码。

(这是related question。)

4 个答案:

答案 0 :(得分:11)

请不要进入注册表以查找此信息。在将来的Windows版本中,该位置可能会更改。请改用SHGetFolderPath。

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

编辑:看起来LogonUser将为您需要的其他用户提供令牌。

答案 1 :(得分:3)

您可以尝试调用ImpersonateLoggedOnUser()来修改另一个用户的用户令牌,然后将其传递给SHGetFolderPath()。根据ImpersonateLoggedOnUser()的文档,您可以调用LogonUser()来获取特定用户的令牌。

仅仅是阅读,我猜想有问题的用户必须以某种形式登录才能使其正常工作。我记得有一页说明必须安装用户的注册表配置单元才能使其正常工作(我认为这有点道理)。

答案 2 :(得分:2)

我会挂载用户的注册表配置单元并查找路径值。是的,由于提到的所有原因(前向兼容性差等),这是次优解决方案。但是,与Windows中的许多其他内容一样,MS没有提供API方法来执行您想要执行的操作,因此它是最佳选择。

您可以使用LookupAccountName获取用户的SID(而不是GUID)。您可以使用LoadUserProfile加载用户的注册表配置单元,但不幸的是,这还需要一个用户令牌,这将需要他们的密码。幸运的是,您可以使用RegLoadKey手动将配置单元加载到任意位置,读取数据并卸载它(我认为)。

是的,这很痛苦,是的,它可能会在未来的Windows版本中破解。也许到那个时候MS将提供一个API来实现它,将它反向移植到旧版本的Windows中,并通过Windows更新自动分发......但我不会屏住呼吸。

P.S。此信息旨在增强您相关问题中提供的信息,包括免责声明。

答案 3 :(得分:-3)

此信息存储在注册表中的密钥“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不鼓励使用注册表项,因为它仍然只是为了向后兼容