在服务内部,确定特定用户的特殊文件夹路径(例如“My Documents”)的最佳方法是什么?SHGetFolderPath
允许您传入一个令牌,因此我假设有某种方法可以模拟您感兴趣的文件夹所在的用户。
是否有一种方法可以只基于用户名来完成此操作?如果没有,您需要为用户帐户提供的最少信息量是多少?我宁愿不必要求用户提供密码。
(Here是一个related question。)
在服务内部,确定特定用户的特殊文件夹路径(例如“My Documents”)的最佳方法是什么?SHGetFolderPath
允许您传入一个令牌,因此我假设有某种方法可以模拟您感兴趣的文件夹所在的用户。
是否有一种方法可以只基于用户名来完成此操作?如果没有,您需要为用户帐户提供的最少信息量是多少?我宁愿不必要求用户提供密码。
(Here是一个related question。)
4条答案
按热度按时间3df52oht1#
请不要进入注册表查找此信息。在Windows的未来版本中,该位置可能会更改。请改用SHGetFolderPath。
http://msdn.microsoft.com/en-us/library/bb762181(VS.85).aspx
编辑:看起来LogonUser将为您需要的其他用户提供令牌。
pb3s4cty2#
您可以尝试调用ImpersonateLoggedOnUser()来修改另一个用户的用户令牌,然后将其传递给SHGetFolderPath()。根据ImpersonateLoggedOnUser()的文档,您似乎可以调用LogonUser()来获取特定用户的令牌。
仅仅通过阅读,我就猜到这个用户必须以某种形式登录才能使其工作。我记得有一个页面声明必须安装用户的注册表hive才能使其工作(我想这是有道理的)。
1yjd4xko3#
我会挂载用户的注册表配置单元并查找路径值。是的,这是一个次优的解决方案,因为所有提到的原因(向前兼容性差等)。但是,像Windows中的许多其他东西一样,MS没有提供API方式来做你想做的事情,所以它是最好的选择。
您可以使用LookupAccountName获取用户的SID(而不是GUID)。您可以使用LoadUserProfile加载用户的注册表配置单元,但不幸的是,这也需要用户令牌,这将需要他们的密码。幸运的是,您可以使用RegLoadKey将配置单元手动加载到任意位置,读取数据,然后卸载它(我认为)。
是的,这是一个痛苦,是的,它可能会在未来的Windows版本中崩溃。也许到那时,微软将提供一个API来做这件事,把它移植到旧版本的Windows中,并通过Windows更新自动分发它......但我不会屏住呼吸。
注:本信息旨在补充您在相关问题中提供的信息,包括免责声明。
osh3o9ms4#
此信息存储在注册表的注册表项“HKEY_USERS\S-1-5-21-616815238-485949776-2992451252- 3228\软件\Microsoft\Windows\当前版本\资源管理器\用户 shell 文件夹”中。
“S-1-5-21-616815238-485949776-2992451252-3218”是用户的GUID。您需要获取此GUID以查找相应的密钥并读取它。
在this示例中,他们使用了您提到的SHGetFolderPath函数,并且有一个包含所有特殊文件夹的列表,这可能会有所帮助。
**注意:**Microsoft不鼓励使用该注册表项,因为它仍然存在只是为了向后兼容