web-dev-qa-db-ja.com

VS2008セットアッププロジェクト:共有(すべてのユーザーによる)アプリケーションデータファイル?

仲間の人類とユリのパッドと外輪!

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

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

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

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

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

セットアッププロジェクトは「ユーザーのアプリケーションデータ」フォルダーを提供しますが、それはユーザーごとのフォルダーであり、まさに私が避けようとしているものです、はい、はい!

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

31

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

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

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

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

  3. カスタムフォルダの名前を「CommonApplicationDataFolder」に変更します。 (これは、結果のフォルダーに使用される名前ではありません。これは、フォルダーをまっすぐに保つためだけのものです。)

  4. フォルダーのDefaultLocationプロパティを "[CommonAppDataFolder] [Manufacturer]\[ProductName]"に変更します。単一の円記号の奇妙な使用を含め、アプリケーションフォルダのDefaultLocationプロパティとの類似性に注意してください。

  5. 「プロパティ」という名前のフォルダプロパティがあるという、とんでもない(しかし否定できない)事実を少しの間驚かせてください。

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

「共通アプリケーションデータ」フォルダに配置されたデータファイルは、「\ ProgramData\Manufacturer\ProductName」(Vistaの場合)または「\ Documents and Settings\All Users\Application Data\Manufacturer\ProductName」(XPの場合)にコピーされます。インストーラーが実行されます。

現在、Vistaでは、非管理者はここにあるファイルへの変更/書き込みアクセス権を取得していません。したがって、すべてのユーザーはファイルを読み取ることができますが、「\ ProgramFiles」でも読み取ることができます。では、Common Application Dataフォルダーの目的は何でしょうか。

20

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

  1. インストールされているアプリを呼び出すカスタムアクションを追加しました(または、別のプログラム/ dllを作成して、代わりに呼び出すこともできます)
  2. Argumentsプロパティを "Install"に設定します
  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セキュリティを有効にする」を使用すると、アプリの起動時にユーザーに望ましくないプロンプトが表示される可能性があることをどこかで読みました。上記のようにそれを行うと、これが起こるのを防ぎます。これが誰かに役立つことを願っています。私は数日前にこのようなものを見ることで恩恵を受けたかもしれないことを知っています!

10
ejwipp

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

Visual Studio2008とWindowsVistaを使用しています

6
Ove

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

[CommonAppDataFolder] [Manufacturer] [ProductName]

これがタイプミスであったかどうかはわかりませんが、Lymanは単一の円記号の奇妙な使用について言及しましたが、これは正しくないようです。

1
Tricky

私も同じ問題を抱えていました。セットアッププロジェクトは、ユーザーに、「現在のユーザーのみ」または「すべてのユーザー向け」のアプリをインストールするオプションを提供します。その結果、データベースファイルは、現在のユーザーまたはAll Usersアプリケーションデータフォルダーに保存されます。データベースへのアクセスに関して、アプリケーションが後でそれを取得できるように、この情報をどこかに書き込む必要があります。他に、どのアプリケーションデータフォルダを調べるかを知るにはどうすればよいでしょうか。

この問題を回避するには、アプリケーションが1人のユーザーにインストールされたか、すべてのユーザーにインストールされたかに関係なく、データベースをAll Users/Application Dataフォルダーにインストールします。もちろん、2人のユーザーがお互いのデータを上書きせずに同じコンピューターにアプリケーションをインストールすることはできないことを理解しています。しかし、これは非常に可能性が低いので、考慮したくありません。

私が得たパズルの最初のピース ここ

Form_Load(object sender, EventArgs e)
{
  // Set the db directory to the common app data folder
  AppDomain.CurrentDomain.SetData("DataDirectory", 
            System.Environment.GetFolderPath
           (System.Environment.SpecialFolder.CommonApplicationData));
}

次に、データソースにDataDirectoryプレースホルダーが含まれていることを確認する必要があります。この作品は ここ から来ました。 DataSetデザイナで、DataSetのプロパティを見つけ、Connectionノードを開き、ConnectionStringプロパティを次のように編集します。

Data Source=|DataDirectory|\YourDatabase.sdf

次に、上記のLyman Enders Knowlesの説明に従って、Common Application Data Folderをセットアッププロジェクトに追加し、データベースファイルをそのフォルダーに配置しました。

次に、上記のOveの提案に従いました。つまり、「ClickOnceのセキュリティ設定を有効にする」をオンにして、「これは完全信頼アプリケーションです。

その後、アプリケーションはVistaに正常にデプロイされ、データベースファイルは読み取りと書き込みの両方でアクセス可能になりました。

1
cdonner

私は以下のコンセプトが好きです、いくつかは上から取られました

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

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

  3. カスタムフォルダの名前を「CommonApplicationDataFolder」に変更します。 (これは、結果のフォルダーに使用される名前ではありません。これは、フォルダーをまっすぐに保つためだけのものです。)

  4. フォルダのDefaultLocationプロパティを「[CommonAppDataFolder] [Manufacturer] [ProductName]」に変更します。単一の円記号の奇妙な使用を含め、アプリケーションフォルダのDefaultLocationプロパティとの類似性に注意してください。

  5. 「プロパティ」という名前のフォルダプロパティがあるという、とんでもない(しかし否定できない)事実にちょっと驚いてください。狂犬病でいっぱいの赤ちゃん、誰がこのたわごとを思い付くのですか?

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

string userAppData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
string commonAppData = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 
1
Ahmad

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

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

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

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

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

0
carl