Elimine una regla (permiso) de ‘Denegar’ de la clave ‘UserChoice’ en el Registro a través de c#

Estoy trabajando en asociaciones de archivos. He identificado que hay una clave llamada UserChoice en:

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

He podido leer y escribir en la clave UserChoice siempre que lo haya creado y que Windows todavía no lo haya creado. Sin embargo, si Windows ya ha creado la clave UserChoice, entonces debo ejecutarla como Administrador para obtener acceso a la clave. Mi objetivo final es eliminar la clave UserChoice.

He observado que Windows coloca una regla de denegación en la clave UserChoice que me impide eliminar esa clave. Si puedo eliminar esa regla, creo que podré eliminar la clave UserChoice. Aquí está el código que he probado:

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);
        }
    }
}

Cuando Windows crea la clave UserChoice, agrega una regla de seguridad para el usuario actual de Type Deny; permiso: Especial Esta regla no se hereda y se aplica solo a la clave UserChoice.

Con algunos problemas y ejecutándome como Administrador, puedo acceder a esa Regla de Registro de Acceso. Sin embargo, incluso ejecutándose como administrador, no puedo eliminar esta regla. He leído en algún lugar de mi investigación que no hay una forma programática de hacerlo. Puedo eliminar esta regla a través de RegEdit. También puedo eliminar la clave UserChoice usando el Administrador de tipos de archivos de NirSoft. Entonces asumo que hay alguna manera de hacer esto.

Resumen: ¿Hay alguna forma de que pueda eliminar la regla de denegación para poder eliminar la clave UserChoice?

Mejor respuesta
Su ejemplo de código y las revisiones sugeridas en el answer por @ali me llevaron a una solución para superar la configuración de seguridad que Windows coloca en la clave UserChoice que me permitió eliminar esa clave.

Mi solución supone que la clave UserChoice está presente en la sección HKEY_CURRENT_USER (HKCU). Si ese es el caso, el usuario posee la clave UserChoice y, por lo tanto, tiene los privilegios necesarios para cambiar la configuración de seguridad en esa clave y finalmente eliminarla. (Esto significa que el usuario no necesita ser miembro del grupo de administradores).

El parámetro extensionKey de este método es la clave principal de la clave 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);
}

Por favor indique la dirección original:Elimine una regla (permiso) de ‘Denegar’ de la clave ‘UserChoice’ en el Registro a través de c# - Código de registro