ClickOnce について


(2007/12/25 更新:.NET Framework 3.5 の新機能を追記)

こんにちは。

Microsoft On を通して、クリックワンス (ClickOnce) に関していろいろをご質問を受けますので、ご質問事項とその回答を以下にまとめました。(当コンテンツは適宜更新していきます。)

[質問] ノータッチデプロイメントとの違いは何ですか?

[回答]
.NET Framework 1.1 をベースとしているノータッチデプロイメントでは、IE のキャッシュの仕組みを使用してアセンブリを配置するという仕組みが使用されてきました。
このため、以下の課題がありました。

1. インストーラによるインストールオペレーションを通していないため、ローカル・リソースへのアクセスが制限される
2. オフライン実行はできない

上記の点を改善した .NET Framework 2.0 における配置テクノロジーが ClickOnce になります。

[質問] では、ClickOnce においてセキュリティはどう考えられているのでしょうか

[回答]
SDK に付属 (Visual Studio の再領布可能なパッケージに含まれています) している .NET Framework 2.0 構成ツールでみていただくとわかりますが、2.0 から新しく「信頼されたアプリケーション」 という ClickOnce 独自のセキュリティの概念が存在しています。仕組み(内部動作)の詳細は省略しますが、セキュリティの設定方法には、完全信頼と部分信頼という2つの設定方法があり、後者の場合には .NET Framework 標準のコードアクセスセキュリティでどの範囲のアクセス許可を必要とするか定義をします。ClickOnce で配布される際は、完全信頼の場合は (クライアントが完全に信頼する証明書が添付されていない場合には) 必ずユーザにプロンプトを表示して意志決定をさせ、部分信頼の場合には、定義した範囲がそのゾーンのコードアクセスセキュリティの範囲外のとき(つまり、そのゾーンでプログラムを実行した場合に許可されるアクセス権の範囲を超えた動作をする場合)にプロンプトを表示します。通常、ClickOnce でアプリケーション開発者が何も設定せずに発行すると、発行を許可された ClickOnce アプリケーションは、証明書の仕組みに基づいて完全信頼の仕組みが利用され、ClickOnce 独自の「信頼されたアプリケーション」という箇所に登録され、完全信頼 (無制限) されます。よってアプリケーション開発者は、セキュリティの乱用を防ぎたい場合は、Visual Studio のプロジェクトのプロパティ画面で部分信頼のための設定をおこないます。

上述のような方法で安全性を確保しているのですが、このセキュリティを「どう考えるか」という点については、これは私見ですが、つぎのような側面も持っているという点は念頭においておくべきかもしれません。
そもそも .NET Framework のコードアクセスセキュリティの考え方(発想)として、ユーザが許可すればユーザが有するすべての権限を保持してしまうという従来の「ユーザ主導」のセキュリティの考え方(OSのセキュリティなどはこの典型でしょう)から脱した概念になりますが(例えば IE のセキュリティ設定、Java のセキュリティ(もともとサンドボックスと呼んでいたもの)などでも同様の発想に基づいていると思いますが、ネットワークごしにアプリケーションを使うという時代における新しいセキュリティの考え方でしょう)、ClickOnce では、上述のような仕組みから、このセキュリティの「あるべき」概念と、ノータッチデプロイメントが有していた不便さという2つの関係にはさまれた関係に位置しているテクノロジーと言えるかもしれません。ClickOnce はスマートクライアント向けのテクノロジーで、証明書に基づく確認画面の表示はおこなわれますが、インターネット上などから不必要に ClickOnce アプリケーションを乱用するような使い方(=そうしたことが頻繁におこなわれてしまうような文化)は避けるほうが望ましいかもしれません。
尚、ClickOnce の配置時のセキュリティのカスタマイズの詳細については、ITrustManager 実装に関する記事等をご参照ください。

[質問] アセンブリが大きいので、差分更新をしたいと思っています。ClickOnce で差分更新をおこなうにはどうしたら良いですか

[回答]
ClickOnce は、特に指定しなくとも、内部的に差分更新をおこなっています。ですから、頻繁にコメントを変更する、など、不必要にソースの更新とリビルドはおこなわないように留意してください。

[質問] どんなブラウザでも動作するのですか

[回答]
可否という意味では、内部実装の方法(拡張子と起動アプリケーションの関係)とブラウザの機能などについてちゃんとご説明する必要がありますが、さしあたり、何の設定もおこなわず動作するブラウザは IE のみとお考えください。

[質問] サーバ上のアセンブリの物理的更新とは別に配布(更新)するタイミングを操作できますか

[回答]
方法は複数ありますが、例えば、ソリューションエクスプローラを右クリックして、[プロパティ] を選択し、プロジェクトのプロパティ画面を表示してください。ここに表示されている [発行するバージョン] を変更しなければ、実際にアセンブリを変更しても、更新はおこなわれません。ですから、例えば、このバージョン番号を管理して、配布・更新のタイミングを操作することができます。

[質問] 更新のタイミングを毎回アプリケーションが起動する際ではなく、別のタイミングで実行できますか

[回答]
上述した発行の設定画面(プロジェクトのプロパティ)で、更新タイミングをさまざまに変更することができます。
また、もっと柔軟に変更したい場合には、コードを使って、更新をさせることができます。コードの詳細は、以下の Article (「10行ですばり」の ClickOnce) を参照してください。

http://www.microsoft.com/japan/msdn/thisweek/300x10/

また、コードで更新する際は、規定の更新を解除するため、発行の設定画面の [アプリケーションの更新を確認する] チェックボックスを外し、[更新場所] に URL を記載して発行してください。

[質問] 更新の際に表示されるメッセージ(ダイアログボックス)を抑制できますか

[回答]
初回の発行時の警告メッセージは一般には抑制できません。(厳密には、証明書を完全に信頼されたものとして所定の方法で登録することで抑制されます。ですが、この証明書の登録行為は、プロンプトを抑制する目的「だけ」のために乱用しないでください。)
更新(2回目以降)時のメッセージは、上述のコードによる更新をおこなうことで抑制されます。但し、コードによる更新は余計なコード実装(ビジネスロジック本体以外のロジック)が混在しますので、是非は慎重にご判断ください。

[質問] 発行されたファイルはクライアント上の何処にインストール(配置)されているのですか

[回答] ClickOnceでダウンロードされるモジュールは、各ユーザのフォルダ (Document and Settings 下の各ユーザフォルダ) の Local SettingsApps の階層の下にフォルダが作成され、保存されます。
ですから、利点としては、アドミン権限が必要ない場合でも発行可能というメリットがありますが、逆にデメリットとしては、1台のマシンを複数ユーザで共有している場合(共有PCなど)はユーザごとにインストールされてディスクを消費するという課題はあります。

[質問] アプリケーションのサイズ(容量)が膨大なため、初回のみ CD-ROM などネットワークを使わずにインストールをおこない、2回目以降 の更新で ClickOnce を使いたいと思っています。このようなことは可能ですか

[回答]
可能です。ClickOnce では、発行ウィザードで、発行先として(CD、DVD などの)メディア用のインストールを指定できます。ClickOnce の発行ウィザードで、発行先として所定のローカルフォルダなどを指定し、表示されるインストール方法の指定で、[CD-ROM または DVD-ROM から] を選択して発行します。ウィザードの途中で [次の場所からアプリケーションの更新を確認する] のチェックボックスが表示されますのでここにチェックを付け、更新場所として 2 回目以降の更新で使用する所定の URL (もしくは共有フォルダなど) を指定してください。
発行された setup.exe を含むディレクトリはポータブルで、発行後に移動できます。初回はここからインストールをすることで、以降のアプリケーションの更新時は、上記で指定した URL に更新を確認するようになります。
なお、アプリケーション開発者は、以降の更新モジュールを上記で指定した URL に発行するようにしてください。

[質問] 容量が大きいため、必要な dll を使う場合のみ順次ダウンロードさせることはできないでしょうか

[回答]
可能です。以下の MSDN の記事を参考にしてください。

http://msdn2.microsoft.com/ja-jp/library/ms228997(VS.80).aspx

http://msdn2.microsoft.com/ja-jp/library/ms228997.aspx

[質問] Office アプリケーション (VSTOで作成したマネージ実装) で ClickOnce を使うことはできますか

[回答]
Office の .NET アセンブリは起動方法が非常で特殊で、現状(VSTO v2)の仕組みではできません。
ご所望の仕組みは、次期の Visual Studio (コードネーム Orcas) で実装される予定です。

[質問] .NET Framework 1.1 で作成したアセンブリで ClickOnce を使うことはできますか

[回答]
.NET Framework ではセキュリティ関連や起動の仕組みが ClickOnce 用に拡張されているため、そのまま .NET Framework 1.1 の CLR 上で起動するようにすることは不可能ですが、.NET Framework 2.0 のランチャーを作成することで実装可能(回避可能)のようです。詳細は、以下に詳しい方法が掲載されておりますですのでご参照ください。
尚、セキュリティ上の理由からいくつかの制限を受けるようですのでご留意ください。

http://vsug.jp/tabid/123/Default.aspx?PageContentMode=1

[質問] 難読化したアセンブリで ClickOnce を使うことはできますか

[回答]
できます。以下、難読化には、Visual Studio に標準で付属している Dotfuscator を想定しています。
Dotfuscator で難読化したアセンブリは、ご存知の通り、Visual Studio のビルドプロセスとは別にビルド(コンパイル)され、アセンブリが作成されます。また、Visual Studio による標準的な ClickOnce 作成手順では、その過程で、アセンブリ固有の署名がおこなわれたマニフェスト(アプリケーションマニフェスト、デプロイマニフェストの双方)が作成されます。同質問を達成するには、ここの作成をクリアする必要があります。以下に、その手順を記載します。(同手順は、CSK 大地さんにより検証された情報をもとに記述しています。)

  1. プロジェクトの発行で、通常どおりに ClickOnce のアプリケーションを発行します。この際、プロジェクトプロパティの [発行] のオプションで、「".deploy" ファイル拡張子を使用する」のチェックを外しておきます。
  2. Dotfuscator を起動し、発行されたアセンブリ(.exe:実行可能ファイル)から難読化されたアセンブリを作成(ビルド)します。
  3. 難読化されたアセンブリを元のアセンブリと置き換えます。
    (無論、この段階では、ClickOnce でのインストール時にエラーが発生し、ダウンロードできません。)
  4. Visual Studio 2005 コマンドプロンプトを起動し、mageui と入力して Mage ツール(マニフェストの作成ツール) を起動します。
  5. アプリケーション マニュフェスト ファイル(.exe.manufest)を作成します。
  • [File]-[New]-[Application Manifest] をクリックします。
  • [Name] パネルでアプリケーション名とバージョンを入力します。(PublicKeyToken はあとで設定しますのでブランクのままでOKです。)
  • [Files] パネルの [Application directory] で先ほどのアセンブリが保存されているフォルダを指定して [Populate] ボタンをクリックします。アセンブリが [Application files] に表示されます。([File Type] には、起動ファイルを意味する [Entry Point] が表示されています。)
  • [Permissions Required] パネルの Permission set type(アクセス許可セット)を [FullTrust] にします。
  • マニフェストファイルを保存します。
    この際、署名ダイアログが表示されるので、[New] ボタンをクリックして、キーペアファイル (.pfx) を作成して署名します。
  • ClickOnce アプリケーションの発行時に作成されたアプリケーション マニュフェスト ファイルを上書き保存します。
  • つぎに、デプロイメント マニュフェスト ファイル(.application)を作成します。
    • [File]-[New]-[Deployment Manifest] をクリックします。
    • [Name] パネルで、デプロイのアプリケーション名とバージョンを入力します。 アプリケーション名は、通常、[アプリケーション名].application になります。
    • [Description] パネルへ、発行者名と製品名(通常はアプリケーション名と同じです)を入力します。
      ここで設定した名前が、スタートメニューの表示に使用されます。
    • [Deployment Option] パネルの [Start Location] に、デプロイメント マニフェスト ファイルの URL を入力します。(通常は、http://[マシン名]/[AppName]/[AppName].application です。)
    • 配置方法にあわせ、[Update Options] パネルの内容を変更します。
      [Application Reference] パネルで、先ほど作成したアプリケーション マニュフェスト ファイルへの参照を設定します。([Select Manifest] ボタンをクリックするとファイル選択ダイアログが表示されます。)
    • ファイルの保存をすると、署名ダイアログが表示されるので、先ほど作成したキーペアファイルを選択して、署名を行います。
      保存先として、ClickOnce アプリケーションの発行時に作成されたデプロイメント マニュフェスト ファイル(通常は [AppName].application と [AppName].[Version].application の双方)を上書き保存します。

    ClickOnce の手動編集に関しては http://msdn2.microsoft.com/ja-jp/library/xc3tc5xx(VS.80).aspx をご参照ください。また、この手動による ClickOnce の実施方法は、Visual Studio が配置済み (及び既にダウンロード済み) の別のバージョンに対して実施すると配置に関する情報が一致せずにうまく動作しない場合がありますので(経験上)、フレッシュなモジュールを対象に実施してください。

    [質問] 利用者にアンインストールと再インストールをさせずに、ClickOnceのアプリケーション配布で使用している Web サーバを廃止し、新しい Web サーバへ移行させることはできますか

    [回答]
    (同手順は、CSK 大地さんにより戴いた情報です。)
    ClickOnce では、発行場所のサーバとインストール元のサーバをわけて発行することができますので、この方法を使って、下記の手順で移行することができます。(この手順では、旧サーバの廃止前に利用者は1回以上はアプリケーションを実行する必要があります。尚、初回のインストール時でも旧サーバの URL へアクセスして新サーバの URL へ接続されますし、ユーザーがインストール済みのアプリケーションのバージョンのロールバックを行った場合でも、自動更新チェック時は新サーバへ接続されるようになります。)

    1. Visual Studio 2005 を使って、旧サーバへ[プロジェクトのプロパティ] - [発行]タブの以下のプロパティを設定して発行します。
      • [発行場所]
        旧サーバの URL (例: http://oldserver/ApplicationName)
      • [インストールの URL]
        新サーバの URL (例: http://newserver/ApplicationName)
      • [更新] - [更新場所]
        新サーバの URL (例: http://newserver/ApplicationName)
    2. Visual Studio 2005 を使って、新サーバへ[プロジェクトのプロパティ] - [発行]タブの以下のプロパティを設定して発行します。
      • [発行場所]
        新サーバの URL(例: http://newserver/ApplicationName)
      • [インストールの URL]
        設定なし
      • [更新] - [更新場所]
        設定なし

    この手順以降、バージョンアップ時には、新サーバの URL へ通常どおりの方法で発行してください。

    [質問] Windows Vista ( 及び IIS7 ) で ClickOnce は使えますか

    [回答]
    使えます。
    但し、普通に発行をおこなうと、FrontPage Server Extensions が入っていないというエラーが表示されます (IIS 6.0 ではインストールをおこなわなくても、IIS 6.0 のコンポーネントとして機能が存在していました)。よって、IIS 6.0 関連の以下の互換ツールが必要です。
    以下の通り設定をおこなってください。(この情報は Windows Vista RC1 及び IIS 7.0 と Visual Studio 2005 で検証しています。今後 Update される可能性がありますので、ご利用のバージョンに注意してください。)

    • Windows コンポーネントの追加と削除の画面で、[IIS 6 Management Compatibility] 関連の機能一式をインストール (及び、入っていない場合にはFront Page Server Extension をインストールして設定) してください。
    • Visual Studio 2005 を管理者権限で起動してください。スタートメニューから Visual Studio 2005 をマウスで選択し、マウスの右ボタンをクリックして [管理者として実行] を選択します。
    • プロジェクトの新規作成、もしくはプロジェクトを開いて発行をおこないます。

    この方法で、Windows Presentation Foundation (WPF) のアプリケーションも ClickOnce できます。

    [質問] 参照先のアセンブリ (物理的な PE ファイル) や設定ファイルなど、複数のファイルをインストールさせることはできますか

    [回答]
    まず、まったく独自に分割して作成したアセンブリや、まったく独自な形式の外部ファイルについては、Visual Studio によって自動で ClickOnce 発行に含めることはできません。自身でマニフェストを設定する必要があります。(上記の手動でマニフェストを作成する方法を参照してください。)
    Visual Studio の機能を使用して、ソリューション内でアセンブリを分割し(ソリューション内で別プロジェクトとして作成して参照設定しておき)、さらにアプリケーション構成ファイル (App.config) などを作成した場合には、Visual Studio が判断し、それぞれのファイル (アセンブリや構成ファイル) についても自動でデプロイファイルとこれらに関するマニフェストの情報が作成され、ClickOnce によってデプロイされるのが確認できます。
    アプリケーション独自の外部ファイルは、これと同等の仕組みを自身で作成する必要があります。

    [質問] ClickOnce でダウンロード可能なアプリケーションそのものを製品などの形で顧客に提供したいのですが (顧客サイドで ClickOnce 配布を可能にしたい) 、顧客側でマニフェストの再作成・再署名が必要になってしまいます。
    これを不要にする方法はありませんか

    [回答]
    .NET Framework 3.5 (Visual Studio 2008) よりこのような ClickOnce アプリケーションの配布が可能となりました。詳細は、以下の MSDN の記事をご参照ください。

    http://msdn2.microsoft.com/ja-jp/library/bb384246.aspx

     


    Comments (3)

    1. 今週は、高知市の四国情報管理センター様向けの Microsoft On ワークショップを開催してまいりました。セッション終了後、参加者の皆さんには詳細なコメントをアンケート用紙に書いていただきまして、大変参考になりました。ありがとうございます。…

    2. 今週は、高知市の四国情報管理センター様向けの Microsoft On ワークショップを開催してまいりました。セッション終了後、参加者の皆さんには詳細なコメントをアンケート用紙に書いていただきまして、大変参考になりました。ありがとうございます。…

    3. 今週は、高知市の四国情報管理センター様向けの Microsoft On ワークショップを開催してまいりました。セッション終了後、参加者の皆さんには詳細なコメントをアンケート用紙に書いていただきまして、大変参考になりました。ありがとうございます。…

    Skip to main content