我有一个程序,读取和写入registry文件,以记住窗口位置等。这是非常简单的,当涉及到只是作为pipe理员,而不是那么多,当你只是一个系统上的用户。
我使用高级安装程序,如果你有任何很酷的build议。
编辑/更新:
问题1:如果不在HKEY_CURRENT_USER中,你将把它放在哪里?
答:当我把这些文件放在HKEY_CURRENT_USER下时,它只会放在那个用户下面。 所以如果我要以pipe理员身份安装程序,那只有那个用户才有这个文件。 由于我使用高级安装程序,我不确定是否属于某些设置值。
来自Bogdan Mitrache的声明1:如果您愿意,也可以利用Windows Installer的自我修复支持(也由Advanced Installer支持),让安装人员为每个启动应用程序的用户在HKCU下编写默认设置,即使安装pipe理员。 这里是一个文件的例子,但它也适用于registry:advancedinstaller.com/user-guide/qa-self-healing.html
回应:这是一个很好的解决scheme,除了我有一个条件安装的问题。 用户可以select安装其中一个或另一个function,他们都使用这些registry值。 这可能是为什么它不为我工作。 我将在AI中以逻辑意义复制文件。
处理此问题的正确方法是在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()
来加载其他用户的配置文件, LoadUserProfile()
会返回一个到加载的用户的HKEY_CURRENT_KEY
键(除其他外)的句柄。
如果要访问另一个用户的HKEY_CLASSES_ROOT
键而不是HKEY_CURRENT_USER
,则可以使用RegOpenUserClassesRoot()
。