安全地访问注册表项
客户问题经常跟踪到执行以下操作的外部组件,例如第三方 设备安装应用程序:
删除关键注册表项。
修改关键注册表项的访问权限。
外部组件遇到的许多问题都是使用注册表项的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_Key 在 ulFlags 参数中设置CM_OPEN_CLASS_KEY_INTERFACE,或使用 SetupDiOpenClassRegKeyEx 并在 Flags 参数中设置DIOCR_INSTALLER。
仅使用 INF 指令修改保留供操作系统使用的注册表项。 有关详细信息,请参阅 INF 指令摘要。
类安装程序 和 共同安装程序 不能调用注册表函数来创建、更改或删除保留供操作系统使用的注册表值。
有关注册表项访问权限的详细信息,请参阅 注册表项安全和访问权限。