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

时间:2008-08-03 20:35:02

标签: windows visual-studio registry installation

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

  1. 这是不可能的
  2. 这不是安装程序应该做的事情,而是应用程序应该做的事情(毕竟在安装后创建用户配置文件时会发生什么?)。
  3. 考虑到这一点,我仍然希望在应用程序中尽可能少地进行更改,所以我的问题是,是否可以为Visual Studio 2003安装项目中的每个用户添加注册表项?< / strong>

    此时,该项目列出了五个注册表根密钥(HKEY_CLASSES_ROOT, HKEY_CURRENT_USERHKEY_LOCAL_MACHINEHKEY_USERS和User / Machine Hive)。我对用户root密钥一无所知,也没有看过User / Machine Hive。任何人都可以告诉我他们是什么?也许他们可以解决我上面的问题。

4 个答案:

答案 0 :(得分:5)

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

话虽如此,可以通过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提供)

答案 1 :(得分:5)

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

这里是DRAGONS

假设Joe和Jane经常登录计算机,那么他们每个人都会有“注册表”。

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

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

你的应用程序然后摔倒或行为不正确,并且bob大声抱怨raynixon合并的那些蹩脚的产品。

正确答案是在您的应用中只有一些默认设置,如果找不到它们,可以将它们写入注册表。一般的好习惯是,您的应用程序永远不应该依赖于注册表,并且应该根据需要为任何注册表项创建内容,而不仅仅是HKCU,

答案 2 :(得分:1)

我已经在MSDN上使用此条目了解我的解决方案(不知道我以前怎么也找不到它)。

用户/机器蜂巢
当用户选择“Just Me”或HKEY_USERS配置单元或用户在安装期间选择“Everyone”时,在此配置单元下输入的子键和值将安装在HKEY_CURRENT_USER配置单元下。

Registry Editor Archive of MSDN Article

答案 3 :(得分:1)

尽管 MSDN article Archive of MSDN Article说的是User / Machine Hive,但它没有写入HKEY_USERS。如果你选择所有人,如果你选择Just Me和HKLM,它会写入HKCU。

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