在服务内部,为特定用户确定特殊文件夹路径(例如“我的文档”)的最佳方式是什么? SHGetFolderPath允许你传入一个令牌,所以我假设有一些方法来模拟你感兴趣的文件夹的用户。如何获取特定用户的Windows“特殊文件夹”的路径?
有没有一种方法可以仅基于用户名来完成此操作?如果不是,那么用户帐户需要的最低信息量是多少?我宁愿不必要求用户的密码。
(这里是一个related question)
在服务内部,为特定用户确定特殊文件夹路径(例如“我的文档”)的最佳方式是什么? SHGetFolderPath允许你传入一个令牌,所以我假设有一些方法来模拟你感兴趣的文件夹的用户。如何获取特定用户的Windows“特殊文件夹”的路径?
有没有一种方法可以仅基于用户名来完成此操作?如果不是,那么用户帐户需要的最低信息量是多少?我宁愿不必要求用户的密码。
(这里是一个related question)
我会安装在用户的注册表配置单元并查找路径值。是的,这是一个次优的解决方案,因为提到的所有原因(穷人向前兼容性等)。然而,就像Windows中的许多其他事情一样,MS没有提供API方式来执行你想做的事情,所以它是最好的选择。
您可以通过使用LookupAccountName得到了用户的SID(不GUID)。您可以使用LoadUserProfile加载用户的注册表配置单元,但不幸的是,这也需要一个用户标记,该用户标记需要他们的密码。幸运的是,您可以使用RegLoadKey手动加载配置单元到任意位置,读取数据并卸载它(我认为)。
是的,这是一个痛苦,是的,它可能会打破未来版本的Windows。也许到那个时候,MS将提供一个API来完成它,将它移植到旧版本的Windows中,并通过Windows更新自动分发它......但我不会屏住呼吸。
P.S.这些信息旨在增强相关问题中提供的信息,包括免责声明。
该信息被存储在关键注册表中的“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函数并没有与可能是有益的所有特殊文件夹列表。
注:微软鼓励使用注册表项,因为它仍然存在只是为了向后兼容
请不要进入注册表中找到此信息。该位置可能会在未来的Windows版本中发生变化。改用SHGetFolderPath。
http://msdn.microsoft.com/en-us/library/bb762181(VS.85).aspx
编辑:它看起来像LogonUser将提供你所需要的其他用户的令牌。
你可以尝试调用ImpersonateLoggedOnUser()修改用户令牌另一个用户,然后递过来的SHGetFolderPath()。根据ImpersonateLoggedOnUser()的文档,您可以调用LogonUser()为特定用户获取令牌。
只需从阅读的时候,我猜有问题的用户必须以某种形式按顺序登录这个工作。我记得有一个页面声明用户的注册表配置单元必须被挂载才能工作(这是有道理的,我想)。
这是否适用于所有“近期”版本的Windows(2000年起)? – kgriffs 2008-10-13 16:21:08
我不确定,但由于该功能是由MS支持它应该工作。在实践中,我只读取HKEY_CURRENT USER的信息,而不是其他信息。你也可以像INI文件那样读取注册表 – 2008-10-13 16:24:55