31

仲間の類人猿とスイレンとパドルホイール!

VS 2008 を使用して、C#/.NET/WPF で Windows デスクトップ アプリを開発しています。このアプリは、Vista および XP マシンにインストールして実行する必要があります。アプリをインストールするセットアップ/Windows インストーラー プロジェクトに取り組んでいます。

私のアプリでは、SQLCE データベース ファイル (.sdf) と、使用しているサードパーティ コントロールに関連するその他のデータベース タイプのファイルへの読み取り/変更/書き込みアクセスが必要です。これらのファイルは、PC 上のすべてのユーザー/ログイン間で共有する必要があり、いずれも管理者である必要はありません。もちろん、これは、ファイルをプログラム自体のインストール ディレクトリに入れることができないことを意味します (Vista が登場する前はよくあることでした)。

解決策は簡単だと思っていました。Vista と XP の両方に、この目的のための共有アプリケーション データ フォルダがあります。(Vista では「\ProgramData」、XP では「\Documents and Settings\All Users\Application Data」。) .NET Environment.GetFolderPath(SpecialFolder.CommonApplicationData) 呼び出しは、特定の PC 上のこれらのフォルダーへのパスを見つけるために存在します。 、 はい!

しかし、Shared-application-data フォルダーを Setup プロジェクトのターゲットとして指定する方法がわかりません。

セットアップ プロジェクトは "Common Files" フォルダーを提供しますが、これは共有プログラム コンポーネント (データ ファイルではない) を対象としており、通常は "\Program Files" の下にあり、"\Program files" の他のフォルダーと同じセキュリティ制限があります。はいはい!

Setup プロジェクトは "User's Application Data" フォルダーを提供しますが、それはユーザーごとのフォルダーであり、まさに私が避けようとしているものです。

VS 2008 セットアップ プロジェクトから、堅牢なクロス Windows バージョンの方法で shared-app-data フォルダーにファイルを追加することは可能ですか? 誰でも方法を教えてもらえますか?

4

7 に答える 7

20

私は自分の質問に対する答えを他の情報源から学びました。はい、はい! 悲しいことに、それは私の問題を解決しませんでした! それが私を作るのは何ですか-フィクサーアッパー? はいはい!

VS2008 セットアップ プロジェクトから Common Application Data フォルダーのサブディレクトリにデータを配置するには、次のようにします。

  1. ソリューション エクスプローラーでセットアップ プロジェクトを右クリックし、[表示] -> [ファイル システム] を選択します。

  2. [ターゲット マシンのファイル システム] を右クリックし、[特別なフォルダーの追加 -> カスタム フォルダー] を選択します。

  3. カスタム フォルダーの名前を「Common Application Data Folder」に変更します。(これは、結果のフォルダーに使用される名前ではありません。わかりやすいようにするためです。)

  4. フォルダーの DefaultLocation プロパティを "[CommonAppDataFolder][Manufacturer]\[ProductName]" に変更します。アプリケーション フォルダの DefaultLocation プロパティとの類似性に注意してください。これには、単一のバックスラッシュの奇妙な使用が含まれます。

  5. "Property" という名前のフォルダ プロパティがあるというばかげた (しかし否定できない) 事実に、しばらく驚かされます。

  6. フォルダーのプロパティ プロパティを「COMMONAPPDATAFOLDER」に変更します。

「Common Application Data」フォルダに配置されたデータ ファイルは、インストーラーが実行されます。

Vista では、管理者以外はここにあるファイルへの変更/書き込みアクセス権を取得できないことがわかりました。したがって、すべてのユーザーがファイルを読み取ることができますが、「\Program Files」でもそれを取得します。では、Common Application Data フォルダーのポイントは何でしょうか?

于 2008-10-01T20:02:58.470 に答える
10

[ClickOnce セキュリティ設定を有効にする] をオンにして [これは完全に信頼できるアプリケーションです] を選択する代わりに、セットアップ プロジェクトの [インストール] セクションにあるカスタム アクションを使用して、アプリの CommonAppDataDirectory のアクセス許可を変更することができます。これが私がしたことです:

  1. インストール中のアプリを呼び出すカスタム アクションを追加しました (別のプログラム/dll を作成し、代わりにそれを呼び出すこともできます)。
  2. Arguments プロパティを「インストール」に設定します。
  3. その引数をチェックするように Program.cs の Main を変更しました。

    static void Main(string[] args) { if (args != null && args.Length > 0 && args[0] == "Install") { ApplicationData.SetPermissions(); } else { // Execute app "normally" } }
  4. プログラムでアクセス許可を変更するための SetPermissions 関数を作成しました

    public static void SetPermissions() { String path = GetPath(); try { // Create security idenifier for all users (WorldSid) SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null); DirectoryInfo di = new DirectoryInfo(path); DirectorySecurity ds = di.GetAccessControl(); // add a new file access rule w/ write/modify for all users to the directory security object
    ds.AddAccessRule(new FileSystemAccessRule(sid, FileSystemRights.Write | FileSystemRights.Modify, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, // all sub-dirs to inherit PropagationFlags.None, AccessControlType.Allow)); // Turn write and modify on // Apply the directory security to the directory di.SetAccessControl(ds); } catch (Exception ex) { MessageBox.Show(ex.Message); } }

インストーラーは管理者権限で実行されるため、プログラムは権限を変更できます。「ClickOnceセキュリティを有効にする」と、アプリの起動時にユーザーに望ましくないプロンプトが表示される可能性があることをどこかで読みました。上記のように設定することで、これを防ぐことができます。これが誰かに役立つことを願っています。私は、数日前にこのようなものを見たことが役に立ったことを知っています!

于 2010-12-08T21:12:45.360 に答える
6

私はそれをこのように解決しました。データベースファイル(.sdf)は、アプリケーションがインストールされているフォルダー(Application Folder)と同じフォルダーに保存しました。メインプロジェクトのプロパティウィンドウの[セキュリティ]タブで、[ClickOnceセキュリティ設定を有効にする]をオンにし、[これは完全信頼のアプリケーションです]を選択して、セットアップを再構築して実行しました。その後、セキュリティの問題はありません

VisualStudio2008とWindowsVistaを使用しています

于 2009-01-29T04:05:43.120 に答える
1

私は下のコンセプトが好きで、上から取ったものもあります

  1. ソリューション エクスプローラーでセットアップ プロジェクトを右クリックし、[表示] -> [ファイル システム] を選択します。

  2. [ターゲット マシンのファイル システム] を右クリックし、[特別なフォルダーの追加 -> カスタム フォルダー] を選択します。

  3. カスタム フォルダーの名前を「Common Application Data Folder」に変更します。(これは、結果のフォルダーに使用される名前ではありません。わかりやすいようにするためです。)

  4. フォルダーの DefaultLocation プロパティを "[CommonAppDataFolder][Manufacturer][ProductName]" に変更します。アプリケーション フォルダの DefaultLocation プロパティとの類似性に注意してください。これには、単一のバックスラッシュの奇妙な使用が含まれます。

  5. "Property" という名前のフォルダ プロパティがあるというばかげた (しかし否定できない) 事実に、しばらく驚かされます。狂犬病でいっぱいの赤ちゃん、誰がこんなたわごとを思いついたの?

  6. フォルダーのプロパティ プロパティを「COMMONAPPDATAFOLDER」に変更します。

string userAppData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
string commonAppData = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 
于 2012-05-18T18:12:05.497 に答える
1

これは VS2005 を使用して機能しましたが、DefaultLocation を変更する必要がありました。CommonAppDataFolder を区切るために「\」を追加しました。

[CommonAppDataFolder]\[Manufacturer]\[ProductName]

これがタイプミスかどうかはわかりませんが、Lyman は 1 つのバックスラッシュの奇妙な使い方について言及していましたが、これは正しくないようです。

于 2008-12-17T11:36:33.430 に答える
0

これがあなたの場合に役立つかどうかはわかりません。

ただし、アプリの構成ファイルにプライベート セクションを追加すると、

アプリでチェックインする追加のフォルダーを指定できます。

あなたが言っていることが、マシン上の他のフォルダーにインストールできるようにしたいということであれば、それは問題です。基本的に、MS がこのようなものを制限した理由は、ユーザーが何をインストールしているのかを知らないマシンから悪意のあるコードを遠ざけるためです。

したがって、別のディレクトリが必要な場合、これは機能しません。この修正により、アプリ内でファイルを検索する場所を指定できるようになります......

于 2008-11-12T19:39:13.490 に答える