安全地访问注册表项

客户问题经常跟踪到执行以下操作的外部组件,例如第三方 设备安装应用程序

  • 删除关键注册表项。

  • 修改关键注册表项的访问权限。

外部组件遇到的许多问题都是使用注册表项的KEY_ALL_ACCESS访问权限引起的。 从 Windows Server 2003 开始, SetupDiCreateDevRegKey 仅授予KEY_READ和KEY_WRITE访问权限,而不授予KEY_ALL_ACCESS。 从 Windows Vista 开始,将强制实施其他KEY_ALL_ACCESS限制。

请遵循以下准则安全地访问注册表项:

  • 仅使用 SetupAPI配置管理器 函数和其他受支持的设备相关 API 打开设备注册表项,尤其是设备 的硬件密钥软件密钥

    这些函数可解决访问权限限制导致的常见问题。

  • 在不同版本的 Windows 之间,注册表项的位置和格式可能会更改。 不要假设用于设备和驱动程序安装的位置、格式或注册表项或值的含义。

    有关注册表项和树的详细信息,请参阅 设备和驱动程序的注册表树和密钥

  • 请勿使用注册表直接访问或修改设备的内部设置。

  • 仅请求每个任务所需的最低访问权限,如下所示:

    • KEY_SET_VALUE

    • KEY_CREATE_SUB_KEY

    • KEY_QUERY_VALUE

    • KEY_ENUMERATE_SUB_KEYS

  • 请勿在注册表中直接打开设备安装程序类键。 与任何注册表项一样,设备安装类键的位置和名称可能会在 Windows 版本之间更改。 有关如何正确访问设备安装程序类键的信息,请参阅 打开设备安装类的注册表项

  • 请勿在注册表中直接打开设备接口类键。 与任何注册表项一样,设备接口类键的位置和名称可能因 Windows 版本而异。

    若要安全地打开设备接口类密钥,请使用 CM_Open_Class_KeyulFlags 参数中设置CM_OPEN_CLASS_KEY_INTERFACE,或使用 SetupDiOpenClassRegKeyEx 并在 Flags 参数中设置DIOCR_INSTALLER。

  • 仅使用 INF 指令修改保留供操作系统使用的注册表项。 有关详细信息,请参阅 INF 指令摘要

  • 类安装程序共同安装程序 不能调用注册表函数来创建、更改或删除保留供操作系统使用的注册表值。

有关注册表项访问权限的详细信息,请参阅 注册表项安全和访问权限