我怎样才能得到一个特定用户的Windows“特殊文件夹”的path?

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

有没有办法做到这一点只基于用户名? 如果不是,那么用户帐户所需的最小信息量是多less? 我宁愿不必要求用户的密码。

(这是一个相关的问题 。)

我将挂载用户的注册表配置单元并查找路径值。 是的,这是一个次优的解决方案,因为所有提到的原因(穷人向前兼容性等)。 然而,就像Windows中的许多其他事情一样,MS没有提供一种API来实现你想做的事情,所以这是最好的选择。

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

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

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

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

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

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

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

只是从阅读的角度来看,我猜测用户必须以某种形式登录才能工作。 我记得一个页面,说明用户的注册表配置单元必须安装,以便这个工作(这是有道理的,我想)。

此信息存储在注册表中的注册表项“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才能找到相应的密钥并读取它。

在这个例子中,他们使用你提到的SHGetFolderPath函数,并且有一个包含所有特殊文件夹的列表,这可能是有帮助的。

注意: Microsoft不鼓励使用注册表项,因为它仍然只是为了向后兼容