特定用户的 SHGetFolderPath()

发布于 2024-07-26 03:52:12 字数 698 浏览 10 评论 0原文

我正在寻找一种获取特定用户的本地应用程序数据文件夹的好方法,而无需输入该用户的登录详细信息。

SHGetFolderPath() 可以接受我想要获取其本地 appdata 文件夹的任何用户的访问令牌,但要获取访问令牌,您必须提供用户的密码。 另外,根据文档,这不是<= Windows 2000 支持。

注册表项 HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell 文件夹 包含 AppData 值,该值包含当前用户的本地 appdata 文件夹的位置...所以我可以从技术上为特定用户安装 HKCU 配置单元并访问该值; 然而,微软似乎强烈反对使用这个密钥,而且我听说它有时也会不准确。

具有讽刺意味的是,在 Windows 上,管理员帐户可以轻松访问和修改任何用户的 appdata 文件夹中的所有数据,只要他们打开资源管理器并浏览到正确的位置...但似乎没有一种简单的方法可以以编程方式获取特定用户的 appdata 文件夹的位置。

那么我还有其他选择吗? 现在,访问注册表(喘息)似乎是最好的选择,但如果可能的话,我想使用官方的东西,并且微软不会阻止。

任何建议,将不胜感激。

I'm looking for a good way to get the local application data folder for a specific user -- without having to enter the login details for that user.

SHGetFolderPath() can accept an access token for whatever user I want to get the local appdata folder for, but to get an access token, you have to provide the user's password. Also, according to the docs this isn't supported on <= Windows 2000.

The registry key HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folder contains the AppData value, which contains the location of the local appdata folder for the current user... so I could technically mount the HKCU hive for the specific user and access this value; however, Microsoft seems to strongly discourage the use of this key, and I've heard that it can occasionally be inaccurate as well.

Ironically, on Windows, an administrator account can easily access and modify all of the data in any user's appdata folder, if they just open up Explorer and browse to the correct location... but there doesn't seem to be an easy way to programmatically get the location of the appdata folder for a specific user.

So do I have any other options? Right now, accessing the registry (gasp) seems like the best option, but I'd like to use something official and not discouraged by Microsoft, if possible.

Any suggestions would be appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

九命猫 2024-08-02 03:52:12

没有记录的方法可以在没有令牌的情况下执行此操作,但最好的选择是:

  1. 查找配置文件:HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList(Win9x 上的%windir%\Profiles)
  2. AdjustTokenPrivileges for SE_RESTORE_NAME
  3. RegLoadKey NTUSER.DAT(9x 上为 USER.DAT)
  4. 查询 ...\CurrentVersion\Explorer\User Shell 文件夹

请注意,要检查的正确注册表项是 User Shell 文件夹而不是 Shell 文件夹(您可能必须展开路径),请参阅 Shell文件夹键的漫长而悲伤的故事详细信息

我还想指出,如果可能的话,您应该将数据存储在程序文件或公共文件夹中,然后在程序运行时复制到配置文件中每个用户的第一次

There is no documented way to do this without the token AFAIK, but your best bet is to:

  1. Find the profile: HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList (%windir%\Profiles on Win9x)
  2. AdjustTokenPrivileges for SE_RESTORE_NAME
  3. RegLoadKey NTUSER.DAT (USER.DAT on 9x)
  4. Query ...\CurrentVersion\Explorer\User Shell Folders

Note that the correct registry key to check is User Shell Folders and not Shell Folders (And you might have to expand the path), see The long and sad story of the Shell Folders key for details

I also want to point out that if possible, you should store the data in programfiles or the common folders and then copy into the profile when your program runs for the first time for each user

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文