Windows 7 Windows 7提升的注册表访问

Windows 7 Windows 7提升的注册表访问,windows-7,installation,uac,registry,Windows 7,Installation,Uac,Registry,我正在为我们的应用程序安装程序。安装程序会对HKEY_CURRENT_USER\Software\Company\AppName注册表项进行一些更改,然后应用程序会在第一次运行时查找该注册表项。然后,应用程序根据找到的注册表项执行不同的操作 这非常有效,除非您尝试在windows 7(可能还有Vista,我还没有测试过)上以用户帐户(即非管理员)的形式安装应用程序 当用户尝试安装应用程序时,Windows将提升为管理员帐户的凭据。这意味着在注册表中对HKCU所做的任何更改都是在管理员注册表中进行

我正在为我们的应用程序安装程序。安装程序会对HKEY_CURRENT_USER\Software\Company\AppName注册表项进行一些更改,然后应用程序会在第一次运行时查找该注册表项。然后,应用程序根据找到的注册表项执行不同的操作

这非常有效,除非您尝试在windows 7(可能还有Vista,我还没有测试过)上以用户帐户(即非管理员)的形式安装应用程序

当用户尝试安装应用程序时,Windows将提升为管理员帐户的凭据。这意味着在注册表中对HKCU所做的任何更改都是在管理员注册表中进行的,而不是在启动用户注册表中进行的。因此,当应用程序在用户帐户下首次启动时,密钥对应用程序不可见

我们不能成为安装程序需要与其安装的应用程序进行通信的唯一用户。是否无法可靠地使用注册表来执行此操作

我们不能依赖用户在安装应用程序后启动应用程序,因此将信息作为命令行参数传递不是可行的解决方案。我能看到的唯一方法是让安装程序以原始用户的身份调用一个实用程序,该实用程序获取或设置注册表项本身;这似乎是一个有点愚蠢的箍必须跳过


编辑:应用程序在使用密钥后需要删除密钥,因此我不能将它们放在HKEY_LOCAL_机器中。

如果您需要应用程序的信息供所有用户使用,请使用HKEY_LOCAL_机器配置单元

编辑-2个备选方案:

  • 更改注册表的安全性 允许用户编辑/删除的键 他们,
  • 使用目录(而不是注册表)来存储 数据

有两种推荐方法可满足您的需求:

  • 使用每用户安装,该安装 不需要管理员 特权。您将能够使用 HKEY_当前用户,但您的产品 并非为所有用户安装

  • 使用需要管理员权限的每台计算机安装。在这种情况下,您需要重新设计应用程序,以便它从配置文件中读取其设置。HKEY_当前_用户仅应在保存用户特定设置时使用,而不应用于全局应用程序设置


  • 基本上,如果您的应用程序是每台机器的,它应该使用HKEY_LOCAL_机器或配置文件。如果是每个用户,您可以使用HKEY_CURRENT_user。任何其他组合都有局限性,无法按您需要的方式工作。

    编辑后添加到原始问题:应用程序需要在使用密钥后删除密钥,所以我不能将它们放在HKEY_LOCAL_机器中。除此之外,这是一个很好的建议。出于价值考虑,微软通常会修改其建议,以反对在注册表中保存用户设置和配置数据。如果您不必将它放在注册表中,为什么不使用不需要特殊访问权限的XML或INI文件呢?等等,他们有吗?那么,注册表还有什么用呢(许多人认为注册表不再适用于任何东西。它在几年前构思时是一个合适的设计,但可能已经过时,其问题似乎已经压倒了它的好处。此外,就注册表仍在使用的程度而言,它只用于Windows,而不是用于转储用户数据的应用程序。关于注册表的现代有用性还有很多其他问题,但是在网络上到处散布着更多的错误信息。这只是一个需要考虑的问题,并在UAC等方面变得更为重要。