2008-10-13 68 views
10

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

有没有一种方法可以仅基于用户名来完成此操作?如果不是,那么用户帐户需要的最低信息量是多少?我宁愿不必要求用户的密码。

(这里是一个related question

回答

2

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

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

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

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

-3

该信息被存储在关键注册表中的“HKEY_USERS \ S-1-5-21-616815238-485949776-2992451252-3228 \软件\微软\的Windows \ CurrentVersion \ Explorer \ User Shell Folders“。

的 “S-1-5-21-616815238-485949776-2992451252-3218” 是用户的GUID。您需要获取此GUID才能找到相应的密钥并读取它。

this例如他们使用你提到SHGetFolderPath函数并没有与可能是有益的所有特殊文件夹列表。

注:微软鼓励使用注册表项,因为它仍然存在只是为了向后兼容

+0

这是否适用于所有“近期”版本的Windows(2000年起)? – kgriffs 2008-10-13 16:21:08

+0

我不确定,但由于该功能是由MS支持它应该工作。在实践中,我只读取HKEY_CURRENT USER的信息,而不是其他信息。你也可以像INI文件那样读取注册表 – 2008-10-13 16:24:55

3

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

只需从阅读的时候,我猜有问题的用户必须以某种形式按顺序登录这个工作。我记得有一个页面声明用户的注册表配置单元必须被挂载才能工作(这是有道理的,我想)。

相关问题