通过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的当前用户添加安全规则;许可:特别.此规则不是继承的,仅适用于UserChoice键.

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

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

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

我的解决方案假设UserChoice密钥存在于HKEY_CURRENT_USER(HKCU)配置单元中.如果是这种情况,则用户拥有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);
}
点赞