21

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

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

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

而且,目前该项目列出了五个注册表根键(HKEY_CLASSES_ROOT, HKEY_CURRENT_USERHKEY_LOCAL_MACHINEHKEY_USERS和 User/Machine Hive)。我对用户根密钥一无所知,也没有见过用户/机器配置单元。谁能告诉我它们是什么?也许他们可以解决我上面的问题。

4

4 回答 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提供)

于 2008-08-03T20:48:47.263 回答
6

我猜是因为你想为所有用户设置它,你在某种共享计算机上,它可能在域下运行?

这里是龙

假设 Joe 和 Jane 定期登录计算机,那么他们将各自拥有“注册表”。

然后您将安装您的应用程序,安装程序将使用巨大的黑客和恶心的东西来为他们在 HKCU 下设置项目。

然后,鲍勃会出现并登录(他和其他 500 人在域中拥有帐户,因此可以这样做)。他以前从未使用过这台电脑,所以他没有注册表。他第一次登录时,windows 会为他创建一个,但他不会有你的设置。

然后,您的应用程序会崩溃或运行不正确,并且 bob 会大声抱怨 raynixon 公司的那些蹩脚产品。

正确的答案是在您的应用程序中只保留一些默认设置,如果找不到它们,它可以将它们写入注册表。一般的良好做法是,您的应用程序永远不应该依赖注册表,并且应该根据需要为任何注册表条目创建东西,而不仅仅是 HKCU,无论如何

于 2008-08-03T21:17:33.557 回答
3

我正在使用 MSDN 上的这个条目来解决我的解决方案(不知道我以前怎么找不到它)。

用户/机器配置
单元 当用户选择“Just Me”或 HKEY_USERS 配置单元或用户在安装过程中选择“所有人”时,在此配置单元下输入的子键和值将安装在 HKEY_CURRENT_USER 配置单元下。

MSDN 文章的注册表编辑器存档

于 2008-08-03T20:45:27.350 回答
2

尽管MSDN 文章 Archive of MSDN Article 中 提到了有关用户/机器 Hive 的内容,但它并没有写入 HKEY_USERS。相反,如果您选择 Just Me,它会写入 HKCU,如果您选择所有人,它会写入 HKLM。

所以我的解决方案是使用用户/机器配置单元,然后在应用程序中检查注册表项是否在 HKCU 中,如果没有,则从 HKLM 复制它们。我知道这可能不是最理想的方法,但它的变化最少。

于 2008-08-03T22:34:06.380 回答