Visual Studio 安装项目 - 每个用户注册表设置

21

我正在尝试维护一个在Visual Studio 2003中的安装程序项目(是的,它是一个遗留应用程序)。我们目前遇到的问题是,我们需要为计算机上的每个用户编写注册表条目,并将它们放在HKCU中。它们需要在HKCU而不是 HKLM 中,因为它们是默认用户设置,并且会根据用户而改变。我感觉:

  1. 这是不可能的
  2. 这不是安装程序应该做的事情,而是应用程序应该做的事情(毕竟如果在安装后创建用户配置文件会发生什么?)。

考虑到这一点,我仍然希望尽可能少地更改应用程序,因此我的问题是:是否有可能在Visual Studio 2003安装程序项目中为每个用户添加注册表项?

目前,该项目列出了五个注册表根键(HKEY_CLASSES_ROOT,HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS和User/Machine Hive)。我对用户根键一无所知,也没有看到过User/Machine Hive。有人能告诉我它们是什么吗?也许它们可以解决上述问题。

4个回答

6

首先,是的,这是属于应用程序的内容,正如您所指定的那样:新用户配置文件创建后会发生什么?当然,如果您使用的是域,可能会在创建时将一些内容放入注册表中,但这并不是真正的用例。应用程序应该检查是否有设置,如果没有,则使用默认设置。

话虽如此,通过HKEY_USERS Hive更改其他用户的密钥是可能的。

我没有使用Visual Studio 2003安装项目的经验,因此这里是一些(完全无关的)VBScript代码,可能只是给您一个想法:

const HKEY_USERS = &H80000003
strComputer = "."
Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
strKeyPath = ""
objReg.EnumKey HKEY_USERS, strKeyPath, arrSubKeys
strKeyPath = "\Software\Microsoft\Windows\CurrentVersion\WinTrust\Trust Providers\Software Publishing"
For Each subkey In arrSubKeys
    objReg.SetDWORDValue HKEY_USERS, subkey & strKeyPath, "State", 146944
Next

(代码由Jeroen Ritmeijer提供)


6
我猜想因为您想要为所有用户设置它,所以您正在使用某种共享计算机,该计算机可能在域下运行? 注意 假设Joe和Jane定期登录计算机,那么他们将各自拥有“注册表”。
然后,您将安装您的应用程序,安装程序将采用巨大的黑客和令人讨厌的事情为他们设置HKCU下的项目。
然后,Bob会来并登录(他和其他500个人在域中拥有帐户,因此可以这样做)。他从未在这台计算机上使用过,因此他没有注册表。他第一次登录时,Windows会为他创建一个,但他不会有您的设置。
您的应用程序然后崩溃或行为不当,Bob会大声抱怨来自raynixon公司的劣质产品。
正确的答案是在您的应用程序中设置一些默认设置,如果找不到它们,则可以将它们写入注册表。通常最好的做法是,您的应用程序不应依赖于注册表,并且应根据需要创建任何注册表条目,而不仅仅是HKCU。

3
我在MSDN的这篇文章中找到了一部分解决方案(之前不知道为什么找不到)。
用户/机器注册表
在此注册表下输入的子键和值将在用户选择“只有我”或者在安装过程中用户选择“所有人”时被安装到HKEY_CURRENT_USER注册表下或者HKEY_USERS注册表下。 注册表编辑器 MSDN文章存档

2

尽管 MSDN 文章 MSDN 文章的存档 中提到了用户/机器注册表,但它实际上并没有写入 HKEY_USERS。如果您选择 Just Me,则会写入 HKCU;如果选择 everyone,则会写入 HKLM。

因此,我将使用用户/机器注册表,并在应用程序中检查注册表条目是否在 HKCU 中。如果不存在,则从 HKLM 复制它们。我知道这可能不是最理想的方法,但改动最少。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接