0

exe と同じディレクトリに配置されている middle.config というファイルがありますが、このファイルの値を更新する必要があります。つまり、ファイルにアクセスするには C:\Program Files (x86)\ ディレクトリに移動する必要があります。.config ファイルとして名前が付けられていますが、通常の .config ファイルのスキーマには従いません。次のようになります。

<configuationSettings>     
  <middleSettings      
   groupName="XYZ"     
   forkName="SomeDbName"     
   dbServerName="123.123.123.123"     
   cnnTimeoutSeconds="30"     
   cmdDefaultTimeoutSeconds="30"     
   cmdMediumTimeoutSeconds="60"     
   cmdLongTimeoutSeconds="480"     
   />     
 <userKeys>     
   <Assemblies value="C:\assemblies\" />     
 </userKeys>     
 <friendlyDbName value="NiceData"/>     
</configuationSettings>     

Xml を使用してコンテンツを読み取って操作することはできますが、ファイルを保存しようとすると、「権限がありません」というエラーがスローされます。ファイルを移動できません。この従来のスキーマに固執しているため、ConfigurationManager.OpenExeConfiguration を使用して通常の .config ファイルのように扱うことができません。このスキーマでセクションまたはグループを定義できません (とにかくできませんでした)。すべてのユーザーは、ローカル マシンの管理者です。

このファイルが保護されたディレクトリにあるときに、このファイルを上書きまたは削除して置き換えるにはどうすればよいですか (権限エラーに関する私の仮定)? それに失敗した場合、ConfigurationManager.OpenExeConfiguration を使用してこのスキーマにアクセスする方法はありますか。

{ここから編集開始}

このシナリオには、AB、および鉱山Cの 3 つのアプリケーションがあります。アプリケーションAは他のアプリケーションを認識していません。非常に多くのデータベースに接続でき、最後のアプリケーションAセッションで使用された最後のデータベースの場所へのポインター情報を含む単一のファイル「middle.config」をドロップします。アプリケーションB、これをインポート/エクスポート アプリケーションと呼びましょう。最後のアプリケーションAデータベースの場所でのみ動作します。アプリケーションBは、データベース ポインター情報について「middle.config」ファイルを読み取り、そのデータベースに対してコンソール コマンドを実行します。データベースの選択した部分の一括ダンプまたは一括インポートを実行します。

これは、インポート/エクスポート アプリケーションBを使用してデータのブロックを取得し、データベースに返すアプリケーションCを構築することになったときの状況でした。したがって、アプリケーションCが 任意のデータベースに対してアプリケーションBを使用するには、アプリケーションBが正しいデータベースを見つけるように、アプリケーションCが「middle.config」ファイルを変更する必要があります。アプリケーションCは新しく、他の 2 つはレガシーです。これを機能させる方法を見つけるか、ユーザーに強制的に Application Aを起動させ、目的のデータベースを指定してから、 Application Aを閉じます。これは非常に不便です。

{編集はここで終了}

4

5 に答える 5

3

プログラム ファイル ディレクトリにデータ ファイルを書き込むことはお勧めできません。これには昇格した権限が必要です。構成ファイルを更新するためだけにプログラムに昇格されたアクセス許可を与えると、最小特権のプリンシパルと衝突します。

コンピューティング環境の特定の抽象化レイヤーでは、すべてのモジュール (サブジェクトに応じてプロセス、ユーザー、またはプログラムなど) が、その正当な目的に必要な情報とリソースのみにアクセスできなければなりません。

構成ファイルを更新するためだけに、プロセスに昇格されたアクセス許可を与える (多くの有害なことを実行できるようにする) ことは、「正当な目的」ではありません。MS が推奨する方法は、そのタイプのデータを別の場所に書き込むことです。

代わりに、構成ファイルをApplicationData フォルダーのサブフォルダーに保存することを検討してください。

于 2012-06-08T15:58:51.743 に答える
0

別の角度から、これを見てください:カスタム セクションを app.config に書き込む

リンクされた記事は非常に役立つことがわかりました。ただし、すべての質問に答えられるかどうかはわかりません。

于 2012-06-08T17:04:49.753 に答える
0

保護されたディレクトリに関するあなたの仮定は正しいです。Program Files には、標準ユーザーとして実行されているプロセスによる変更を防止するアクセス制御リストがあり、Vista 以降では、管理者特権で実行されていない管理者プロセスによる変更も防止します。標準の構成クラスを使用してファイルにアクセスしても、これを回避することはできません。

ファイルを絶対に移動できない場合 (インストール後に Program Files に書き込むのは悪い考えだと Eric J. が言っているのは正しいです)、構成ファイル編集プログラムにマニフェストを埋め込むことができます。起動時の UAC プロンプト。もちろん、最善の解決策には、a) 標準の構成スキーマを使用すること、および b) ユーザー データをユーザーが書き込み可能な場所に保持することが含まれますが、従来の理由でそれが不可能な場合もあります。

残念ながら、ConfigurationManager に非標準のスキーマを読み取らせる方法を知りません。

于 2012-06-08T16:05:48.453 に答える
0

ロジックを別のプロセスに移動し、現在のアプリケーションから管理者権限で起動します。

于 2012-06-08T16:54:41.697 に答える
0

アプリがインストールされている場所の下のファイルに書き込むのではなく、現在のユーザー用に AppData の場所フォルダーの下に独自の場所を作成することをお勧めします (特に、非常に厳密な Program Files の下の場合)。アプリケーションの管理者として実行します。

于 2012-06-08T16:11:57.350 に答える