10

.Netの専門家が私を助けてくれることを望んでいることに興味があります。

私はカスタム構成セクションを持っており、それを手に入れるためにこれを行います:

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

私はそれを開発マシン(Windows 7、64ビット、完全に最新のWindows)で実行し、正常に動作します。

そのコードを含むexeを取得し、それをマシン内のディレクトリに配置し、c:\users\public管理Windows Server 2008 R2者としてコマンドプロンプトを開き、実行すると、次のようになります。

System.Configuration.ConfigurationErrorsException:testSectionの構成セクションハンドラーの作成中にエラーが発生しました:要求が失敗しました。(C:\ Users \ Public \ configtest \ AppConfigTestConsoleApplication.exe.Config行10)---> System.Security.SecurityException:要求が失敗しました。

今、私はこれを行うためにそのコードを変更しました:

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

両方のマシンで正常に動作します。

だから、私は(私のアプリケーションが機能している限り)適度に満足していますが、私の頭の中の小さなグレムリンは混乱しているので、ここで尋ねます:

なぜそうなのですか?


再現する手順

Visual Studio2010でAppConfigTestConsoleApplicationという新しい.net4コンソールアプリケーションプロジェクトを作成し、の内容をProgram.cs次のように置き換えます。

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

次に、アプリケーション構成ファイルを追加し、内容を次のように置き換えます。

<?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>

コンパイルして実行すると、これが私が得た出力です。

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

プロセスモニター

Process Monitorを実行し、次のようにフィルターを設定しました。

プロセスモニターフィルター

そして、それはすべて次のいずれかである508のイベントを残しました:

  • 名前が見つかりません
  • これ以上のエントリはありません
  • パスが見つかりません
  • リーダーのみでファイルがロックされている
  • そのようなファイルはありません(C:\ Windows \ assembly \ NativeImages_v4.0.30319_32 \ mscorlib \ 93e7df09dacd5fef442cc22d28efec83 \ mscorlib.ni.dllおよびC:\ Users \ Public \ configtest \ AppConfigTestConsoleApplication.exe.configの場合は1回だけ)
  • バッファオーバーフロー(HKCU\コントロールパネル\デスクトップ\MuiCached \ MachinePreferredUILanguagesHKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ User Shell Folders \ Cacheの場合、

根本的な原因に到達するためにどのフィルターを設定するかについて、誰かがアドバイスを持っていますか?

4

3 に答える 3

10

アセンブリが「ブロック」されたとき([ファイルのプロパティ]タブの下)、これと同じ動作がありました。ファイルはzip形式で管理者に電子メールで送信されました。彼が添付ファイルを保存したとき、ブロックビットが追加されました...インターネットからファイルをダウンロードするときと同じように。ブロックをクリアした後、それはうまくいきました。

于 2013-01-16T14:30:14.010 に答える
6

ConfigurationManager.GetSection(String)

アプリケーション構成ファイル、ローカルユーザー構成ファイル、およびローミング構成ファイルをマージして取得した構成ファイルを取得します。


ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel)

userLevelパラメーターは、ユーザーレベルがないかどうかを示すことにより、開かれている構成ファイルの場所を決定します(構成ファイルはアプリケーションと同じディレクトリにあります)。

したがって、彼らは異なるファイルを開いています。ProcessMonitorを使用して、アクセスされているファイルと、例外が発生する理由とファイルを確認してください。

于 2012-11-23T12:24:26.453 に答える