c ++ RegCreateKeyEx上的其他参数,用于保护注册表项

时间:2013-07-03 08:25:43

标签: c++ windows winapi registry

我想问一下,如何打开注册表项来保护它。在我阅读时,我应该使用RegCreateKeyEx而不是RegOpenKeyEx,但是应该如何打开,其他进程无法删除它。

我以前用过:

long lResult = RegOpenKeyEx(HKEY_CLASSES_ROOT, L"TypeLib\\{0971C3C0-FEA6-49BA-AFEA-7C898DBE175B}\\9.0\\HELPDIR", NULL, KEY_ALL_ACCESS, &hKey);

我应该如何重写它,使注册表受到保护。

1 个答案:

答案 0 :(得分:1)

注意:我同意上面的MSalters。我建议在删除你没有放在那里的注册表项时要非常小心。删除随机类型库的条目不一定是个好主意,除非你确定它们是不需要的 - 例如如果它们属于您尝试删除的可能不需要的软件。

您希望阻止您的软件删除密钥以重现错误,并允许您的软件继续其工作。 但是(至少)有三种可能的原因 ,因此您需要确保注册表清理程序可以处理 all 适当的。

可能阻止删除注册表项的内容

密钥是否仍然打开?

首先(并且最有可能),当任何句柄打开时,无法删除密钥。这是设计和文档。

但是,您可以删除密钥的所有值,删除自身未打开的子密钥,等等。

另请注意,您无法删除自己打开的钥匙,因此请确保自己没有打开手柄。

您可以使用SysInternals进程资源管理器来确定您的进程或任何其他进程是否已打开注册表项。

您是否有权限?

其次,您应该检查您是否有权删除密钥。可以设置权限,以便任何人都无法执行特定操作或任何操作,包括更改权限。例外情况是所有者可以随时更改权限,管理员可以将所有者更改为自己。

因此,如果您没有删除密钥的权限,并且不是所有者,那么您将需要“获取所有权”权限。然后,您可以获取所有权,更改权限以允许您删除密钥,然后将其删除。管理员通常具有“获取所有权”权限。

您可以使用RegEdit.exe检查注册表项的权限 - 前提是您有权查看权限!

此操作是否被安全软件阻止?

最后,系统中的任何操作都可以被反病毒程序等安全软件否决。这也将表现为拒绝访问错误。

如何防止删除注册表项

因此,为防止删除注册表项,您可以:

  • 创建一个打开密钥并保持打开状态的流程。
  • 更改拒绝所有用户删除权限的权限。
  • 安装拦截注册表调用的设备驱动程序(例如使用绕道)并且不允许删除密钥。