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

10

在服务中,如何确定特定用户的特殊文件夹路径(例如,“我的文档”)的最佳方法?SHGetFolderPath 允许您传递一个令牌,因此我假设有一种方法可以模拟感兴趣的文件夹所属用户。

是否有一种仅基于用户名就能实现这一点的方法?如果没有,那么需要用户账户的最小信息量是多少?我不想要求用户提供密码。

(这里有一个相关问题。)

4个回答

12

这并没有真正回答他的问题,除非你能提供一种获取用户文件夹路径的方法,而不是当前用户的路径。 - Nick

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

仅从阅读周围的信息来看,我猜想所讨论的用户必须以某种形式登录才能使此功能正常工作。我记得有一个页面说明在使此功能可用之前必须挂载用户注册表(这似乎是有道理的)。


3
我会加载用户的注册表,然后查找路径值。是的,这是一个次优解决方案,因为存在许多原因(如前向兼容性差等)。然而,像 Windows 中的许多其他事情一样,微软没有提供 API 方式来做你想做的事情,所以这是可用的最佳选项。
您可以使用 LookupAccountName 获取用户的 SID(不是 GUID)。您可以使用 LoadUserProfile 加载用户的注册表,但不幸的是,这也需要用户令牌,这将需要他们的密码。幸运的是,您可以使用 RegLoadKey 手动加载注册表到任意位置,读取数据并卸载它(我认为)。
是的,这很麻烦,而且很可能在未来的Windows版本中会出现问题。也许到那时微软会提供一个API来解决这个问题,将它回溯到旧版本的Windows中,并通过Windows更新自动分发...但我不会抱太大希望。
附言:本信息旨在补充您相关问题中提供的信息,包括免责声明。

-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函数,并列出了所有可能有用的特殊文件夹列表。

注意:微软不建议使用注册表键,因为它仅用于向后兼容。


这个程序在所有“最近”的Windows版本上都能运行吗(从2000开始)? - kgriffs
我不确定,但由于该函数受MS支持,应该可以工作。在实践中,我只阅读HKEY_CURRENT USER的信息,而不是其他信息。此外,您可以像读取INI文件一样读取注册表。 - m_pGladiator
我假设这个函数是有效的,但我想知道注册表键路径是否相同... - kgriffs
1
这里有一篇来自微软的雷蒙德·陈的文章,详细解释了为什么你不应该那样做。http://blogs.msdn.com/oldnewthing/archive/2003/11/03/55532.aspx - James Curran
我刚刚读了这篇博客文章。谢谢James Curran!我以前从不知道这个。现在微软的声誉在我心中比以前更低了。他们应该在注册表中放置一个注释,说明这些键已被弃用,就这样。但是微软就是微软... - m_pGladiator

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