我有一个程序可以读取和编写注册表文件,以便记住窗口位置等。当你只是作为管理员时,这非常简单,但当你只是系统中的用户时,这不是很多。
如果您有任何很酷的建议,我会使用高级安装程序。
编辑/更新:
问题1:如果不在HKEY_CURRENT_USER中,你在哪里放东西?
答案:当我把文件放在HKEY_CURRENT_USER下面时,它只会把它放在那个用户下面。因此,如果我以管理员身份安装程序,那么只有那个用户才能拥有这些文件。由于我使用的是高级安装程序,因此我不确定是否属于某些设置值。
Bogdan Mitrache声明1: 如果您愿意,还可以利用Windows Installer的自我修复支持(也由Advanced Installer支持)让安装程序为启动应用程序的每个用户在HKCU下编写默认设置,即使是由管理员安装。以下是文件示例,但它也适用于注册表:advancedinstaller.com/user-guide/qa-self-healing.html
响应:除了我有条件安装的问题之外,这是一个很好的解决方案。用户可以选择安装一个或另一个功能,其中两个使用这些注册表值。这可能就是为什么它不适合我。我会考虑在AI中逻辑意义上复制文件。
答案 0 :(得分:1)
处理此问题的正确方法是在HKEY_LOCAL_MACHINE
中存储默认值(例如在安装期间)(如果有的话),然后再存储用户特定的< / {> HKEY_CURRENT_USER
中的值。
当应用需要读取值时,请先检查HKEY_CURRENT_USER
,如果没有找到,请检入HKEY_LOCAL_MACHINE
(或使用硬编码默认值)。
当应用需要存储值时,只能将其存储在HKEY_CURRENT_USER
中。
是的,这确实意味着如果您的应用由管理员运行,默认情况下它将从管理员密钥中读取值,并将值存储在管理员密钥中。这是完全可以的,因为管理员当时是应用程序的用户。如果应用程序由非管理员运行,则值将相对于该用户而言。
在应用程序以管理员用户身份运行但需要在另一个用户的HKEY_CURRENT_USER
键中读取/存储值的情况下(例如,当非管理员用户登录到Windows并且应用程序是使用其他用户的登录名运行UAC提升),然后应用程序可以通过以下任一方式打开其他用户的HKEY_CURRENT_USER
键:
冒充其他用户,然后使用RegOpenCurrentUser()
。
使用LoadUserProfile()
加载其他用户的个人资料,RegOpenUserClassesRoot()
会返回已加载用户的HKEY_CURRENT_KEY
键的句柄(以及其他内容)。