2013-03-10 124 views
0

说明删除顽固的注册表项

一名司机留在注册表中(甚至当我卸载它从系统中)一个烂摊子。如果我检查安全设置,它将不会在“组或用户名”中显示任何内容。当我查看所有者时,它只显示“无法显示当前所有者”。当我想要删除注册表项时,我必须:

  1. 取得所有权。

  2. 添加组。

  3. 删除密钥。

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

问题

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

谢谢大家的支持

+1

您必须以管理员身份运行您的应用程序。看到这个问题:http://stackoverflow.com/questions/2818179/how-to-force-my-net-app-to-run-as-administrator-on-windows-7 – 2013-03-10 11:09:54

+1

你已经找到了一个很好的理由**不**写一个程序来做到这一点。这并不是说你不能使它工作,而是调试它是如此危险。发生在我们最好的人身上,像[Paul DiLascia](http://www.microsoft.com/msj/1299/comtoys/comtoys.aspx),滚动到“来自地狱的可怕轶事”。 – 2013-03-10 12:08:32

回答

2

正如你知道运行注册表编辑器作为管理员,以确保你有适当的权限来修改/删除注册表项,你需要做同样的事情为您的C#应用​​程序。

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

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

0

这是一半的答案。

这个knowledge base article解释了如何取得您无权访问的密钥的所有权。

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

请注意,这只适用于以管理员身份运行代码的情况。

但是,我不知道您是否可以使用内置函数在C#中执行此操作,或者您是否需要使用interop来调用本机API。如果是后者,使用C/C++可能会更快。可以使用SubInAcl工具。它可以获取文件,注册表项等的所有权。

+0

这不到答案的一半。正如您在开始时链接注释的知识库文章所述,除非您拥有访问权限,否则无法获得密钥的句柄。如果没有处理,你就无法取得所有权。所以你仍然无处可去。如果您可以在没有第一次访问权限的情况下获得所有权,那将会是一个巨大的安全漏洞。 – 2013-03-10 11:38:50

+0

什么?文章说,你通常无法获得句柄,然后继续说“这个问题的解决方案是......”。管理员可以**总是取得所有权,即使他们没有权限。这是Windows安全模型的核心。知识库文章介绍了如何做到这一点。再读一遍。 – arx 2013-03-10 11:41:08

+1

同意成为管理员。这是管理员权限的重点。问题是他没有使用管理权限运行应用程序。 – 2013-03-10 11:42:07

0

要清楚你右击,当你谈论在管理员模式下运行它以管理员身份运行 - 这是提升的权限,它不会简单地双击发生。即使您以管理员身份登录,您也必须右键单击并以管理员身份运行才能升级。

我的问题我固定通过写CURRENT_USER,而不是现在LOCAL_MACHINE我看到你的问题实际上不是由仰角和给予解决。存储在注册表中的安全描述符可能被来自AWOL驱动程序的垃圾写入或发生的任何事情破坏。这意味着你无法做很多事情,包括修复自己或新用户。

您可能无法运行CCleaner,直到我们清除权限问题。然而,你可以启动到安全模式并运行SFC/SCANNOW和CHKDSK - SFF固定一个人的问题相似,但它可能是有风险的,所以在自己的风险,但它看起来很有前途,我可能已经做了scannow之前,我尝试了其他任何事情。安全模式+ SFC/SCANNOW

我会备份数据,并消灭它尽快快得多。我没找到各种OS说明,腐败的安全描述符的事 - 为Win 8和7,所以你不应该有问题,看起来像他们将需要安全模式

祝您好运!