-1

我想问一下,如何打开注册表项来保护它。正如我所读到的,我应该使用RegCreateKeyEx而不是RegOpenKeyEx打开应该是什么样子,其他进程无法删除它。

我曾经使用:

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

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

4

1 回答 1

1

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

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

什么可能会阻止删除注册表项

钥匙还开着吗?

首先(也是最有可能的),一个键在任何句柄打开时都不能被删除。这是设计和文档中的。

但是,您可以删除键的所有值,删除本身未打开的子键,等等。

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

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

你有权限吗?

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

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

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

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

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

如何防止删除注册表项

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

  • 创建一个打开密钥并保持打开状态的进程。
  • 更改权限以拒绝所有用户的删除权限。
  • 安装一个设备驱动程序来拦截注册表调用(例如使用 detours)并且不允许删除密钥。
于 2013-07-04T09:06:05.850 回答