3

アプリケーションの実行時にアプリケーションの構成を更新する必要がある .NET 4 でアプリケーションを作成しています。これを行うコードは次のとおりです。

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings["MySetting"].Value = "my value";
config.Save();

私の App.Config は次のようになります...

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="MySetting" value="my old value"/>
  </appSettings>
</configuration>

このアプリケーションをローカル ドライブで実行すると (したがって、プログラムの実行時に構成ファイルもローカル ドライブに配置されます)、このコードは機能します。ただし、アプリケーションがネットワーク共有 (実際には Z:) 上の構成ファイルを使用して実行されている場合、コードは次のconfig.Save();行の例外で失敗します...

System.InvalidOperationException が処理されませんでした
  Message=メソッドは予期しないエラー コード 1 で失敗しました。
  ソース= mscorlib
  スタックトレース:
       System.Security.AccessControl.NativeObjectSecurity.CreateInternal (ResourceType resourceType、ブール値 isContainer、文字列名、SafeHandle ハンドル、AccessControlSections includeSections、ブール値 createByName、ExceptionFromErrorCode exceptionFromErrorCode、オブジェクト exceptionContext) で
       System.Security.AccessControl.FileSystemSecurity..ctor (ブール isContainer、文字列名、AccessControlSections includeSections、ブール isDirectory) で
       System.Security.AccessControl.FileSecurity..ctor (文字列 fileName、AccessControlSections includeSections) で
       System.Configuration.Internal.WriteFileContext.DuplicateTemplateAttributes (文字列のソース、文字列の宛先) で
       System.Configuration.Internal.WriteFileContext.DuplicateFileAttributes (文字列のソース、文字列の宛先) で
       System.Configuration.Internal.WriteFileContext.Complete (文字列ファイル名、ブール値の成功) で
       System.Configuration.Internal.InternalConfigHost.StaticWriteCompleted (文字列 streamName、ブール値の成功、オブジェクトの writeContext、ブール値の assertPermissions) で
       System.Configuration.Internal.InternalConfigHost.System.Configuration.Internal.IInternalConfigHost.WriteCompleted (文字列 streamName、ブール値の成功、オブジェクト writeContext、ブール値の assertPermissions) で
       System.Configuration.Internal.InternalConfigHost.System.Configuration.Internal.IInternalConfigHost.WriteCompleted (文字列 streamName、ブール値の成功、オブジェクト writeContext) で
       System.Configuration.Internal.DelegatingConfigHost.WriteCompleted (文字列 streamName、ブール値の成功、オブジェクト writeContext) で
       System.Configuration.UpdateConfigHost.WriteCompleted (文字列 streamName、ブール値の成功、オブジェクト writeContext) で
       System.Configuration.MgmtConfigurationRecord.SaveAs (文字列のファイル名、ConfigurationSaveMode saveMode、ブール値の forceUpdateAll) で
       System.Configuration.Configuration.SaveAsImpl (文字列のファイル名、ConfigurationSaveMode saveMode、ブール値の forceSaveAll) で
       System.Configuration.Configuration.Save() で
       Z:\repos\project\MyProj\Program.cs:line 61 の MyProj.Program.Main() で
       System.AppDomain._nExecuteAssembly (RuntimeAssembly アセンブリ、文字列 [] 引数) で
       System.AppDomain.nExecuteAssembly (RuntimeAssembly アセンブリ、文字列 [] 引数) で
       System.Runtime.Hosting.ManifestRunner.Run (ブール値の checkAptModel) で
       System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly() で
       System.Runtime.Hosting.ApplicationActivator.CreateInstance (ActivationContext アクティベーション コンテキスト、文字列 [] アクティベーションカスタムデータ) で
       System.Runtime.Hosting.ApplicationActivator.CreateInstance (ActivationContext アクティベーション コンテキスト) で
       System.Activator.CreateInstance (ActivationContext アクティベーション コンテキスト) で
       Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone() で
       System.Threading.ThreadHelper.ThreadStart_Context (オブジェクトの状態) で
       System.Threading.ExecutionContext.Run (ExecutionContext executionContext、ContextCallback コールバック、オブジェクトの状態、ブール値の ignoreSyncCtx) で
       System.Threading.ExecutionContext.Run (ExecutionContext executionContext、ContextCallback コールバック、オブジェクトの状態) で
       System.Threading.ThreadHelper.ThreadStart() で
  内部例外:

これは .NET の何らかのセキュリティ上の問題であると考えていますが、そのセキュリティを無効にする方法がわかりません。

構成ファイルが保存されているネットワーク共有は、実際には VirtualBox 共有ドライブです。ホスト システムは Linux で、共有ドライブは Ext4 ファイル システムにマップされます。

App.configファイルと同じディレクトリにあるテキストファイルに正常に書き込むことができるため、これは単なるファイルシステムの書き込みの問題ではないと思います(.NETが背後で何かファンキーなことをしていない限り、少なくとも同じディレクトリだと思います一時ディレクトリを使用するようなシーン)。

File.WriteAllText("Text.txt", "Testing");
4

2 に答える 2

0

これはコード アクセス セキュリティの問題のようです。ここに良い投稿があります: http://www.sellsbrothers.com/Posts/Details/1519

基本的に、ネットワークドライブからアプリケーションを実行すると、デフォルトで「イントラネット」の信頼レベルが与えられ、構成ファイルを変更できないと思います。

したがって、基本的には、次のようにして、そのドライブの信頼レベルを上げる必要があります。

caspol -q -machine -addgroup 1 -url file://z:/* FullTrust -name "Z Drive"

ネットワークドライブにアクセスできないため、確認できません。

于 2012-10-30T08:59:43.080 に答える