12

背景:
Web にアクセスして、それに関連付けられた DLL ファイル (サーバーにある、私たちが作成したもの) をダウンロードできるようにする必要があるメイン アプリケーションがあります。これらの DLL ファイルを「C:\Program Files\」のアプリケーション フォルダにダウンロードできる必要があります。以前は、必要System.Net.WebClientなファイルを Web からダウンロードしていました。

問題
過去にデータをダウンロードしてユーザーのハード ドライブにファイルを保存する際に、多くの問題が発生しました。多くのユーザーから、これが機能しないという報告が寄せられています。これは通常、プログラムのユーザー権限の問題が原因です。

プログラムのユーザー権限に問題がある場合、すべてのユーザーは Web 上の正確なファイルの場所にアクセスしてダウンロードし、適切な場所に手動で保存できます。

私はこれを、このファッションでダウンロード/インストールした他のすべてのプログラム (つまり、Firefox Pluign アップデート、Flash Player、JAVA、Adobe Reader など) と同じように機能させたいと考えています。これらはすべて問題なく動作します。

質問
ダウンローダ プログラムに Program Files フォルダへの特別な権限を与えるために使用する必要のあるコードはありますか? これでもできますか?使用すべきより良いクラスまたはライブラリはありますか? スレッドなどを使用してデータをダウンロードするなど、ファイルをダウンロードする別の方法はありますか?

ここで何か助けていただければ幸いです。もちろん、ライセンスの問題のため、Microsoft以外のサードパーティのアプリ/ライブラリにはできるだけ近づかないようにしたいと思っていますが、それでも提案は私の方法で送信してください.

繰り返しますが、他のプログラムには権利の問題とダウンロード機能があるようです。これと同じ能力が欲しい。

4

6 に答える 6

2

これを行う通常の方法は次のようになります。

  1. アプリケーションは、更新が必要であることを検出します。
  2. アプリケーションは、必要なファイルをダウンロードしてにインストールする別の(アップデーター)アプリケーションを起動しますProgram Files。このアップデータアプリケーションは、管理者権限で実行する必要があります(つまり、Vista / Win7でUACの昇格を求めるプロンプトを表示します)。これを確認する最も簡単な方法は、そのアップデータアプリケーションにアプリケーションマニフェストを追加することです

ユーザーがUACを有効にしている管理者である場合、ポイント2によりUACプロンプトが表示され、これを受け入れる必要があります(Firefox / Acrobat / etc。アップデーターにも同じことが当てはまります)。ユーザーが管理者でない場合は、管理者の資格情報の入力を求められます。(これは良いことであることに注意してください。すべてのユーザーにインストールされているアプリケーションをアップグレードできるのは、管理者だけです。)

アップデータアプリケーションを特別な方法で作成する必要はありませんSystem.Net.WebClient。以前と同じように使用できます。アプリケーションマニフェストは、への書き込みに必要な前提条件を要求することを保証しますProgram Files

この問題(Program FilesUACの昇格がないと管理者が書き込みできない)はオペレーティングシステムの機能であり、プログラミング言語の制限ではないため、「別のライブラリを使用する」だけではこの問題を解決できないことに注意してください。アプリケーションをVista/Win7で実行して書き込みを行うProgram Files場合は、 UACの昇格が必要になります。

于 2011-02-13T15:19:56.930 に答える
1

BITS サービスを確認します。

http://msdn.microsoft.com/en-us/magazine/cc188766.aspx

于 2011-02-11T19:58:58.383 に答える
0

それは本当にプログラムファイルにある必要がありますか?アプリケーションでも同様の問題が発生しました。インストールされていないアセンブリを解決するクラスを作成しました。最初に%usersprofile%のサブフォルダーからそれらをロードし、次にダウンロードを試みます。現在のアプリドメインのAssemblyResolveイベントにresolveメソッドを追加すると、これをシームレスに行うことができます。

    AppDomain.CurrentDomain.AssemblyResolve+= AssemblyResolve;
    public Assembly AssemblyResolve(object sender, ResolveEventArgs args)
    {
         //try to get locally

         //try to download
         return assembly;
    }
于 2011-02-13T15:10:12.407 に答える
0

Program Files ディレクトリへの書き込みには、Vista/Win7 で UAC 昇格 (ユーザーが有効にしている場合) が必要です。ユーザーに許可を求める方法については、次のコード サンプルを参照してください: http://msdn.microsoft.com/en-us/library/aa970890.aspx

ただし、重要なプログラム ファイルを誤って上書きするリスクがないように、より適切な場所に書き込むようにアプリを設計することを検討してください。

于 2011-02-11T19:55:13.530 に答える
0

http://netsparkle.codeplex.com/を試してみてはいかがでしょうか。非常に成功した Mac Sparkle フレームワークhttp://sparkle.andymatuschak.org/の移植。

于 2011-02-11T19:58:05.880 に答える
-2

やらないでください。

理論上は簡単にできます。管理者権限で実行される別のアプリを起動するだけです。構成でこれらをリクエストできます。アップデータ アプリでは、安全な (ssl) Web サイトに接続し、必要なものをすべてダウンロードするだけです。ダウンロードするファイルは暗号署名されている必要があります。

これは、ClickOnce または更新可能なその他の Web インストーラーを使用して簡単に解決することもできます。

すべきでないことは、検証されていないソースから安全でない DLL をダウンロードして実行することです。

于 2011-02-11T20:06:07.557 に答える