删除顽固的注册表项

问题描述 投票:0回答:4

说明

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

  1. 取得所有权。

  2. 添加组。

  3. 删除密钥。

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

问题

我想编写一个简单的C#代码,该代码将循环并删除所有键。我已经找到了一些代码示例,但就我而言,任何OpenSubKey调用都会因错误而失败:System.Security.SecurityException:不允许请求的注册表访问。如果任何OpenSubKey函数调用失败,如何更改所有权?还有其他可用来声明所有权然后删除注册表项的命令吗?

谢谢您的支持

c# registry registrykey
4个回答
2
投票

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

由于您忘记了执行此操作,因此正在抛出System.Security.SecurityException作为提醒。如异常消息所述,您无权修改/删除注册表项。

要解决该问题,必须使用管理特权执行C#应用程序。您可以手动执行此操作,也可以对您的应用程序单击add a manifest,这将导致它自动要求管理特权。


0
投票

这是答案的一半。

knowledge base article说明如何获取您无权访问的密钥的所有权。

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

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

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

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


0
投票

为了清楚起见,当您谈论以管理员模式运行它时,请右键单击并以管理员身份运行-这是提升的特权,仅通过双击就不会发生。即使您以管理员身份登录,也必须右键单击并以管理员身份运行才能提升权限。

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

在我们清除权限问题之前,您可能也无法运行CCleaner。但是,您可以进入安全模式并运行sfc / scannow和chkdsk-sfc修复了一个类似的问题,但是可能有风险,因此请自担风险,但是看起来很有希望,在尝试其他方法之前,我可能已经进行过scannow 。安全模式+ sfc / scannow

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

祝你好运!


0
投票

使用此查询并通过SQl删除它。

EXECUTE master..xp_regdeletevalue'hKey','Key Name','String Value'

谢谢

© www.soinside.com 2019 - 2024. All rights reserved.