【问题标题】:Windows: How can I find the LocalAppData directory for each user on a particular machine?Windows:如何找到特定机器上每个用户的 LocalAppData 目录?
【发布时间】:2009-03-25 13:23:29
【问题描述】:

首先,一些背景:

我们的产品需要通过在 NOTES.INI 文件中添加或更新一行来与 Lotus Notes 客户端集成。

如果我们正在处理 Notes 的单用户安装(即,如果机器上有多个 Windows 用户,他们都将使用相同的 Notes 配置),我们不会遇到问题。在这种情况下,Notes 安装目录中有一个 NOTES.INI 文件。

但是,在 Notes 的多用户安装下(每个 Windows 用户都有自己的 Notes 配置),每个用户都有自己的 NOTES.INI 文件存储在用户的 LocalAppData 目录中 - 例如C:\Documents and Settings\Username\Local Settings\Application Data\Lotus\Notes。

所以问题来了: 如果我们的产品安装在多用户安装 Notes 客户端的机器上,我们需要能够更新该机器上每个用户配置文件中的 NOTES.INI 文件。

我们可以通过在用户登录时运行一个程序来执行此操作,该程序检查该用户的 NOTES.INI 文件是否已更新,如果没有,则更新它。但是,我们的应用程序的卸载过程需要能够为机器上的所有用户撤销这些修改。

因此问题是:假设我们的代码以本地管理员权限运行,是否有某种方法可以遍历每个用户的配置文件并找到他们的 LocalAppData 目录,以便我们进行必要的更改?

任何建议都非常感谢:-)

编辑 2009-03-25 16:52 GMT:
看起来我有一个可能的方法(感谢 Martin C):

对于 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList 的每个子项: 如果它是“真实”用户(以某种方式确定): 记住子键名——这是用户的 SID 读取 ProfileImagePath 值 如果用户的注册表配置单元尚未加载(即没有具有适当 SID 的 HKEY_USERS 的子项): 启用 SE_BACKUP_NAMESE_RESTORE_NAME 权限 使用 RegLoadKey 从 ProfileImagePath\NtUser.dat 加载配置单元 尝试依次使用以下每个注册表项查找用户的 LocalAppData 文件夹: HKEY_USERS\\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell 文件夹 HKEY_USERS\\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell 文件夹 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell 文件夹 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell 文件夹 如有必要,在结果路径中展开环境变量(大概只是将 %USERPROFILE% 展开为我们之前得到的 ProfileImagePath) 使用路径查找用户的 NOTES.INI 文件并进行适当的更改 如果我们必须加载配置单元: 使用 RegUnLoadKey 卸载蜂巢

我可能可以将其编码,但它似乎有点脆弱,并且可能会出现多种错误。 有人有更“官方”的方法吗?

【问题讨论】:

    标签: windows lotus-notes


    【解决方案1】:

    可以枚举子键

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
    

    每个子项都包含“ProfileImagePath”,它将指向配置文件的基本路径。根据操作系统版本和语言设置,您可以确定 LocalAppData 的位置(注意,它取决于语言!)。

    编辑:进一步发展的可能起点是

    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
    

    不幸的是,这可能因用户而异,并且 HKEY_USERS 仅包含已加载配置文件的用户的密钥。您可以尝试以某种方式加载配置文件(如果尚未加载到 HKEY_USERS,也许可以以某种方式附加用户的注册表?)。

    【讨论】:

    • 谢谢 - 这是一个好的开始。我们的应用程序已本地化为 14 种语言,因此我们肯定需要能够支持非英语版本的 Windows。有什么方法可以询问操作系统它认为当前语言中的“本地设置”和“应用程序数据”应该是什么?
    • 您可以查看“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders”并使用“Local AppData”键。我不知道这是否会因用户而异,但这可能是一个开始。请注意,尤其是“我的文档”可能会被组策略重定向。
    • 嗯...根据support.microsoft.com/kb/297060,只要您的访问令牌启用了 SE_RESTORE_NAME 权限,就可以使用 RegLoadKey 加载用户的注册表配置单元。
    • 令人鼓舞的是,“用户外壳文件夹”键实际上记录在此处:technet.microsoft.com/en-us/library/cc787260.aspx
    • 好的,我刚刚发现这种方法存在一个相当严重的问题。 Vista 上的 Windows Installer 4.0 没有为自定义操作提供 SE_BACKUP_NAME 权限,因此这种方法在 Vista 上不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 2012-04-17
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多