通过C#从注册表中的“UserChoice”键中删除“拒绝”规则(权限)

我正在研究文件关联。 我已经确定在UserChoice中有一个名为UserChoice的键:

 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\[ext]. 

我已经能够读取和写入UserChoice密钥,只要创建它并且它尚未由Windows创建。 但是,如果Windows已经创建了UserChoice密钥,那么我需要以管理员身份运行才能访问密钥。 我的最终目标是删除 UserChoice键。

我注意到Windows在UserChoice键上放置了拒绝规则,这阻止我删除该键。 如果我能成功删除该规则,我相信我将能够删除UserChoice密钥。 这是我尝试过的代码:

 public static void ShowSecurity(RegistryKey regKeyRoot, string user) { RegistrySecurity security = regKeyRoot.GetAccessControl(AccessControlSections.All); foreach (RegistryAccessRule ar in security.GetAccessRules(true, true, typeof(NTAccount))) { if (ar.IdentityReference.Value.Contains(User) && ar.AccessControlType.ToString().ToLower() == "deny") { security.RemoveAccessRuleSpecific(ar); regKeyRoot.SetAccessControl(security); } } } 

当Windows创建UserChoice键时,它为Type Deny的当前用户添加安全规则; 许可:特别 。 此规则不是inheritance的,仅适用于UserChoice键。

随着管理员的一些混乱和运行我能够访问RegistryAccessRule 。 但是,即使以管理员身份运行,我也无法删除此规则。 我在研究中的某处读到,没有一种编程方式可以做到这一点。 我可以通过RegEdit删除此规则。 我还可以使用NirSoft的文件类型管理器删除UserChoice密钥。 所以我假设有一些方法可以做到这一点。

简介:有没有办法可以删除拒绝规则,以便删除UserChoice密钥?

您的代码示例和@ali在答案中建议的修订引导我找到一个解决方案,用于克服Windows在UserChoice键上放置的安全设置,这使我能够删除该密钥。

我的解决方案假定UserChoice密钥存在于HKEY_CURRENT_USERHKCU )配置单元中。 如果是这种情况,则用户拥有 UserChoice密钥,因此具有更改该密钥的安全设置并最终将其删除的必要权限。 (这意味着用户不需要是Administrators组的成员。)

此方法的extensionKey参数是UserChoice键的父键。

 static void DeleteUserChoiceKey(RegistryKey extensionKey) { const string userChoiceKeyName = "UserChoice"; using (RegistryKey userChoiceKey = extensionKey.OpenSubKey(userChoiceKeyName, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.ChangePermissions)) { if (userChoiceKey == null) { return; } string userName = WindowsIdentity.GetCurrent().Name; RegistrySecurity security = userChoiceKey.GetAccessControl(); AuthorizationRuleCollection accRules = security.GetAccessRules(true, true, typeof(NTAccount)); foreach (RegistryAccessRule ar in accRules) { if (ar.IdentityReference.Value == userName && ar.AccessControlType == AccessControlType.Deny) { security.RemoveAccessRuleSpecific(ar); // remove the 'Deny' permission } } userChoiceKey.SetAccessControl(security); // restore all original permissions // *except* for the 'Deny' permission } extensionKey.DeleteSubKeyTree(userChoiceKeyName, true); } 

快速思考。 如果您在更改规则之前取得regKey的所有权,它是否有效

 public static void ShowSecurity(RegistryKey regKeyRoot, string user) { regKeyRoot.OpenSubKey("", RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.ChangePermissions); RegistrySecurity security = regKeyRoot.GetAccessControl(AccessControlSections.All); security.SetGroup( new NTAccount("Administrators") ); security.SetOwner( new NTAccount("ali") ); //Your account name security.SetAccessRuleProtection(true, false); regKeyRoot.SetAccessControl(security); //--------- foreach (RegistryAccessRule ar in security.GetAccessRules(true, true, typeof(NTAccount))) { if (ar.IdentityReference.Value.Contains(User) && ar.AccessControlType == AccessControlType.Deny ) security.RemoveAccessRuleSpecific(ar); } regKeyRoot.SetAccessControl(security); }