1

描述

一个驱动程序在注册表中留下了一团糟(即使我从系统中卸载了它)。如果我检查安全设置,它不会在“组或用户名”中显示任何内容。当我检查所有者时,它只显示“无法显示当前所有者。”。当我想删除注册表项时,我必须:

  1. 取得所有权。

  2. 添加组。

  3. 删除密钥。

问题是每个注册表都有几个子键,我必须在每个键上重复这个过程。继承权限选项在注册表编辑器中不起作用。是的,我正在管理员模式下运行注册表编辑器。

问题

我想编写一个简单的 C# 代码来循环和删除所有键。我找到了一些代码示例,但在我的情况下,任何 OpenSubKey 调用都会失败并出现错误: System.Security.SecurityException:不允许请求的注册表访问。 如果任何 OpenSubKey 函数调用失败,我该如何更改所有权?是否有任何其他命令可以让我声明所有权然后删除注册表项?

谢谢你的支持

4

3 回答 3

2

正如您知道以管理员身份运行注册表编辑器以确保您拥有修改/删除注册表项的适当权限一样,您需要对您的 C# 应用程序执行相同的操作。

因为你忘了这样做,所以System.Security.SecurityException被抛出作为提醒。正如异常消息所说,您没有修改/删除注册表项的权限。

要解决此问题,您必须以管理权限执行您的 C# 应用程序。您可以手动执行此操作,也可以将清单添加到您的应用程序中,使其自动要求管理权限。

于 2013-03-10T11:11:45.713 回答
0

要清楚,当您谈论以管理员模式运行它时,您右键单击并以管理员身份运行 - 这是提升的权限,只需双击即可。即使您以管理员身份登录,您也必须右键单击并以管理员身份运行才能获得提升。

我通过写信给 CURRENT_USER 而不是 LOCAL_MACHINE 解决了我的问题,现在我发现您的问题实际上并没有通过提升和授予来解决。您存储在注册表中的安全描述符可能已被 AWOL 驱动程序的垃圾写入或发生的任何事情损坏。这意味着您将无法做很多事情,包括修复自己或新用户。

在我们清除权限问题之前,您可能也无法运行 CCleaner。但是,您可以启动到安全模式并运行 sfc /scannow 和 chkdsk - sfc 修复了一个人的类似问题,但它可能有风险,所以风险自负,但它看起来很有希望,我可能已经完成了 scannow 在我尝试其他任何事情之前. 安全模式 +sfc/scannow

我会备份数据并尽快擦除它。我确实找到了有关损坏安全描述符问题的各种操作系统的说明-对于 Win 8 和 7,因此您应该没有问题,并且看起来它们需要安全模式

祝你好运!

于 2014-04-20T06:09:30.153 回答
0

这是一半的答案。

这篇知识库文章解释了如何获得您无权访问的密钥的所有权。

简而言之,您需要启用“获取所有权”权限并打开具有WRITE_OWNER访问权限的密钥。然后,您可以设置所有者。

请注意,这仅在您以管理员身份运行代码时有效。

但是,我不知道您是否可以在 C# 中使用内置函数执行此操作,或者您是否需要使用互操作来调用本机 API。如果是后者,使用 C/C++ 可能会更快。

或者您可以使用SubInAcl工具。它可以获取文件、注册表项等的所有权。

于 2013-03-10T11:35:28.650 回答