2

次のコードは、WindowsXPおよびWindows7で機能します。

var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings.Remove(key);
config.AppSettings.Settings.Add(key, value);
config.Save(ConfigurationSaveMode.Modified); // fails here

しかし、Windows 8でパスへのアクセスが拒否されたというエラーが発生します。に変更しようとしましConfigurationUserLevelPerUserRoamingAndLocalが、何も実行されません。

App.Config(具体的には、Windows8では[application_name].exe.config)を更新できるようにするには、何をする必要がありますか?

アプリを実行しようとしているユーザーには、デフォルトのWindows8特権があることを追加する必要があります。それが何であるか正確にはわかりませんが、かなり低いです。これが機能するためには、これを上げる必要がありますか?

編集: ログに記録されたエラー:

<Message>Access to the path 'C:\ProgramData\Path\AppName.exe.config' is denied.</Message>
<StackTrace>   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
   at System.Configuration.Internal.WriteFileContext.ValidateWriteAccess(String filename)
   at System.Configuration.Internal.WriteFileContext.Complete(String filename, Boolean success)
   at System.Configuration.Internal.InternalConfigHost.StaticWriteCompleted(String streamName, Boolean success, Object writeContext, Boolean assertPermissions)
   at System.Configuration.Internal.InternalConfigHost.System.Configuration.Internal.IInternalConfigHost.WriteCompleted(String streamName, Boolean success, Object writeContext, Boolean assertPermissions)
   at System.Configuration.Internal.InternalConfigHost.System.Configuration.Internal.IInternalConfigHost.WriteCompleted(String streamName, Boolean success, Object writeContext)
   at System.Configuration.Internal.DelegatingConfigHost.WriteCompleted(String streamName, Boolean success, Object writeContext)
   at System.Configuration.UpdateConfigHost.WriteCompleted(String streamName, Boolean success, Object writeContext)
   at System.Configuration.MgmtConfigurationRecord.SaveAs(String filename, ConfigurationSaveMode saveMode, Boolean forceUpdateAll)
   at System.Configuration.Configuration.SaveAsImpl(String filename, ConfigurationSaveMode saveMode, Boolean forceSaveAll)
   at System.Configuration.Configuration.Save(ConfigurationSaveMode saveMode)
   at MyNamespace.Infrastructure.ConfigurationManager.WriteToAppSettings(String key, String value) in C:\Path\To\App\AppName\Infrastructure\ConfigurationManager.cs:line 76
</StackTrace>
4

2 に答える 2

4

例外メッセージを投稿できますか?

Win 8 Pro、VS 2012でコードをテストしたところ、正常に動作します。

var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings.Remove("my_new_key");
config.AppSettings.Settings.Add("my_new_key", "my new value");
config.Save(ConfigurationSaveMode.Modified); 

の設定ファイルを生成します

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="my_new_key" value="my new value" />
    </appSettings>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>

昇格された特権が必要な場合は、アプリケーションが実行されているユーザーと、構成ファイルが存在するファイル/ディレクトリに設定されているアクセス許可によって異なります。

デフォルトのプロジェクトの場所%homepath%\ document \ visual studio 2012 \ projects \を使用する場合、exe.configファイルを編集するために昇格された特権でアプリケーションを実行する必要はありません。

ファイルが他の場所にある場合は、そのファイルの権限を確認し(右クリック->プロパティ->セキュリティタブ)..アプリケーションを実行しているユーザー(おそらくあなたのアカウント)が書き込みを行っているかどうかを確認する必要があります特権。

これは、NTFSファイルのアクセス許可に関する優れた説明です。 http://www.techrepublic.com/article/windows-101-know-the-basics-about-ntfs-permissions/6084446

于 2012-12-04T11:07:37.207 に答える
1

キーを削除するには、次のようにしてください。

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

AppSettingsSection appSettings = (AppSettingsSection)config.GetSection("appSettings");
appSettings.Settings.Remove("ConnectionString");
appSettings.Settings.Add("ConnectionString", "");

config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection(config.AppSettings.SectionInformation.Name);

またはキー値を変更するには:

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
KeyValueConfigurationCollection settings = config.AppSettings.Settings;

settings["KeyName"].Value = "newkeyvalue";

config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection(config.AppSettings.SectionInformation.Name);
于 2012-12-04T11:09:26.717 に答える