【问题标题】:How can I get the path of a Windows "special folder" for a specific user?如何获取特定用户的 Windows“特殊文件夹”的路径?
【发布时间】:2008-10-13 16:09:48
【问题描述】:

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

有没有办法仅基于用户名来做到这一点?如果不是,您需要为用户帐户提供的最少信息量是多少?我宁愿不需要用户的密码。

(这里是related question。)

【问题讨论】:

    标签: c++ windows winapi


    【解决方案1】:

    请不要进入注册表查找此信息。在未来的 Windows 版本中,该位置可能会发生变化。请改用 SHGetFolderPath。

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

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

    【讨论】:

    • 不过,这并不能真正回答他的问题,除非您可以提供一种方法来获取当前用户以外的用户的文件夹路径。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      附:此信息旨在补充您在相关问题中提供的信息,包括免责声明。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 这是否适用于所有“最新”版本的 Windows(2000 以上)?
        • 我不确定,但由于 MS 支持该功能,它应该可以工作。在实践中,我只为 HKEY_CURRENT USER 阅读信息,而不是为其他人阅读信息。您也可以像 INI 文件一样读取注册表
        • 我认为该功能有效,但我想知道注册表项路径是否相同...
        • 这是来自 Microsoft 的 Raymond Chen 的一篇文章,详细说明了为什么不应该这样做。 blogs.msdn.com/oldnewthing/archive/2003/11/03/55532.aspx
        • 我刚刚从博客中阅读了这篇文章。谢谢詹姆斯柯伦!我从来不知道这一点。而且MS现在对我的声誉比以前低。他们应该在注册表中注明这些键已被弃用,仅此而已。但是 MS 是 MS……
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-22
        • 2011-04-21
        • 1970-01-01
        相关资源
        最近更新 更多