Pourquoi ne l'aide ConfigurationManager.GetSection cause “SecurityException: échec de la Demande”, mais ConfigurationManager.OpenExeConfiguration ne l'est pas?

J'ai quelque chose curieuse que je suis en espérant un .Net expert peut m'aider avec.

J'ai une section de configuration personnalisée et à mettre la main dessus je fais ceci:

var s = (TestConfigurationSection)ConfigurationManager
    .GetSection("testSection");

- Je exécuter que sur ma machine de développement (Windows 7, 64 bits, Windows complètement jusqu'à ce jour) et il fonctionne très bien.

Je prends le fichier exe avec ce code et je l'ai mis dans un répertoire à l'intérieur de c:\users\public sur un Windows Server 2008 R2 machine, ouvrez une invite de commande en tant qu'administrateur, exécutez-le et j'obtiens:

Système.La Configuration.ConfigurationErrorsException: Une erreur s'est produite de la création du gestionnaire de section de configuration pour testSection: échec de la Demande. (C:\Users\Public\configtest\AppConfigTestConsoleApplication.exe.Config ligne 10) ---> Système.De sécurité.SecurityException: échec de la Demande.

Maintenant j'ai changé le code pour faire cela:

var config = ConfigurationManager.OpenExeConfiguration(
    ConfigurationUserLevel.None);
var s = (TestConfigurationSection) config
    .GetSection("testSection");

et il fonctionne très bien sur les deux machines.

Donc, je suis moyennement content (pour autant que mon application fonctionne) mais que peu de Gremlin dans ma tête est confus donc je demande ici:

Pourquoi est-ce le cas?


Étapes pour reproduire

Créer un nouveau .net 4 projet d'application de Console appelée AppConfigTestConsoleApplication dans visual studio 2010 et de remplacer le contenu de Program.cs avec les éléments suivants:

using System;
using System.Configuration;

namespace AppConfigTestConsoleApplication
{
    public class TestConfigurationSection : ConfigurationSection
    {
        [ConfigurationProperty("someSetting")]
        public int SomeSetting
        {
            get { return (int) this["someSetting"]; }
            set { this["someSetting"] = value; }
        }
    }

    internal class Program
    {
        private static void Main()
        {
            try
            {
                var s = (TestConfigurationSection) ConfigurationManager
                    .GetSection("testSection");
                Console.WriteLine("First Method worked: " + s.SomeSetting);
            }
            catch (Exception ex)
            {
                Console.WriteLine("First method failed");
                Console.WriteLine(ex.ToString());

                if (ex.InnerException != null)
                {
                    var eex = ex.InnerException as SecurityException;
                    Console.WriteLine("Action: '{0}'", eex.Action.ToString());
                    Console.WriteLine("Demanded: '{0}'", eex.Demanded.ToString());
                    Console.WriteLine("RefusedSet: '{0}'", eex.RefusedSet);
                    Console.WriteLine("GrantedSet: '{0}'", eex.GrantedSet);
                }

                try
                {
                    var config = ConfigurationManager.OpenExeConfiguration(
                        ConfigurationUserLevel.None);

                    var s = (TestConfigurationSection) config
                        .GetSection("testSection");

                    Console.WriteLine("Second Method worked: " 
                        + s.SomeSetting);
                }
                catch (Exception x)
                {
                    Console.WriteLine("Even the second method failed!");
                    Console.WriteLine(ex.ToString());
                }
            }
        }
    }
}

Puis ajouter un fichier de configuration d'application et remplacer le contenu par le suivant:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>  
    <section
      name="testSection"
      type="AppConfigTestConsoleApplication.TestConfigurationSection, AppConfigTestConsoleApplication"
      requirePermission="false"
      allowDefinition="Everywhere" />  
  </configSections>
  <testSection someSetting="10"></testSection>
</configuration>

De compiler et d'exécuter et c'est le résultat que j'ai obtenu:

C:\Users\Public\configtest>AppConfigTestConsoleApplication.exe
First method failed
System.Configuration.ConfigurationErrorsException: An error occurred creating the configuration section handler for testSection: Request failed. (C:\Users\Public\configtest\AppConfigTestConsoleApplication.exe.Config line 10) ---> System.Security.SecurityException: Request failed.
at System.RuntimeMethodHandle.PerformSecurityCheck(Object obj, RuntimeMethodHandleInternal method, RuntimeType parent, UInt32 invocationFlags)
at System.RuntimeMethodHandle.PerformSecurityCheck(Object obj, IRuntimeMethodInfo method, RuntimeType parent, UInt32 invocationFlags)
at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.ConstructorInfo.Invoke(Object[] parameters)
at System.Configuration.TypeUtil.InvokeCtorWithReflectionPermission(ConstructorInfo ctor)
at System.Configuration.RuntimeConfigurationRecord.RuntimeConfigurationFactory.CreateSectionImpl(RuntimeConfigurationRecord configRecord, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentConfig, ConfigXmlReader reader)
at System.Configuration.RuntimeConfigurationRecord.RuntimeConfigurationFactory.CreateSectionWithRestrictedPermissions(RuntimeConfigurationRecord configRecord, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentConfig, ConfigXmlReader reader)
at System.Configuration.RuntimeConfigurationRecord.CreateSection(Boolean inputIsTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentConfig, ConfigXmlReader reader)
at System.Configuration.BaseConfigurationRecord.CallCreateSection(Boolean inputIsTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentConfig, ConfigXmlReader reader, String filename, Int32 line)
--- End of inner exception stack trace ---
at System.Configuration.BaseConfigurationRecord.EvaluateOne(String[] keys, SectionInput input, Boolean isTrusted, FactoryRecord factoryRecord, SectionRecordsectionRecord, Object parentResult)
at System.Configuration.BaseConfigurationRecord.Evaluate(FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult, Boolean getLkg, Boolean getRuntimeObject, Object& result, Object& resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSection(String configKey)
at System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection(String sectionName)
at System.Configuration.ConfigurationManager.GetSection(String sectionName)
at AppConfigTestConsoleApplication.Program.Main()
Action: 'Demand'
Demanded: '<PermissionSet class="System.Security.PermissionSet"
version="1"
Unrestricted="true"/>
'
RefusedSet: ''
GrantedSet: ''
Second Method worked: 10

Moniteur De Processus

J'ai couru Le Moniteur De Processus et définir le filtre de la sorte:

Pourquoi ne l'aide ConfigurationManager.GetSection cause “SecurityException: échec de la Demande”, mais ConfigurationManager.OpenExeConfiguration ne l'est pas?

Et que gauche 508 événements qui sont en une seule:

  • NOM N'EST PAS TROUVÉ
  • PLUS D'ENTRÉES
  • CHEMIN D'ACCÈS INTROUVABLE
  • FICHIER VERROUILLÉ AVEC SEULEMENT LES LECTEURS
  • AUCUN FICHIER (juste une fois pour C:\Windows\assembly\NativeImages_v4.0.30319_32\mscorlib\93e7df09dacd5fef442cc22d28efec83\mscorlib.ni.dll et C:\Users\Public\configtest\AppConfigTestConsoleApplication.exe.config)
  • DÉBORDEMENT de la mémoire TAMPON (pour HKCU\Control Panel\Desktop\MuiCached\MachinePreferredUILanguages, HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Cache,

Quelqu'un aurait-il des conseils peut-être sur ce filtre permettant d'obtenir à la cause racine?

+1 pour les détails
Obtenez de l'intérieur SecurityException pour la ConfigurationErrorsException et de vidage de ses propriétés, en particulier de l'Action, a Exigé, RefusedSet et GrantedSet. Qui vous donnera plus de renseignements sur ce qui se passe.
Il y a un bug connu de la version 4.0 lors de l'exécution sur un partage réseau, mais qui ne semble pas être le cas ici. Il pourrait être la peine d'essayer de le correctif de toute façon: support.microsoft.com/kb/2580188
merci. J'ai ajouté les propriétés de l'exception de sécurité pour l'application de test et de mise à jour de la sortie - ne semble pas comme il est aidant.
non, il n'ajoute pas beaucoup de fond. Il semble que l'assemblée n'est pas entièrement confiance dans le serveur. La version de .NET vous aide? Semble être la même chose que stackoverflow.com/questions/6666740/....

OriginalL'auteur kmp | 2012-11-23