-
Notifications
You must be signed in to change notification settings - Fork 0
MS_ClickOnce
- 戻る(プログラムの配付技術)
- ClickOnce
- XBAP
- Windows Forms / WPF
「ClickOnce」(クリック ワンス)は、.NET Framework 2.0 に搭載された
Windows アプリケーションの配布・自動更新基盤で、
.NET Framework 1.x で提供されていた「ノータッチ デプロイメント」の
後継技術である。
「ノータッチ デプロイメント」は、セキュリティ、配布(キャッシュの仕組み、
DLL、Config ファイルの配布)、パラメータ受け渡しなどで発生する問題点の
対策が複雑であったため「.NET Framework 2.0」から
「ClickOnce」という新しい技術が登場した。
「ClickOnce」は、
- 「XCOPY」・「インストーラ」での配布や、自作の自動デプロイ・ツールから、
- ⇒「ノータッチ デプロイメント」⇒「ClickOnce」という歴史を経て、
以下のようなアプリケーションを配布・自動更新することをターゲットにしている。
- インターネット環境から不特定多数に向けて配信可能。
- 自動更新をサポートするため、頻繁な仕様変更・更新がある場合に有益。
- 中・小規模である(または画面側のみの配布)。
- ダウンロード&キャッシュサイズの関係上、
大規模なアプリケーションの展開は問題になりうる。 - ただし配布・更新時のダウンロード時間が問題となる場合は、
オンデマンド ダウンロードなどの造り込みにより性能改善することが可能である。
- ダウンロード&キャッシュサイズの関係上、
また、.NET Framework 3.0 からサポートされたWPFアプリケーションの
配布・自動更新も可能となっている。
- Web アプリケーション同様に、
リッチ クライアント アプリケーションの配布の手間が軽減される。 - 開発側がアプリケーションに必要な「アクセス許可」を設定し、
ユーザがこれを許可すれば、セキュリティ制限問題は発生しない。
この点「ノータッチ デプロイメント」の技術と比べて融通が利くようになった。
配布・更新基盤として、色々な選択肢を
検討する必要がある。
| 項番 | 種類 | 要件 |
|---|---|---|
| 1 | ランタイム | .NET Framework 2.0 以上 |
| 2 | OS | .NET Framework 2.0 以上が動作する OS |
| 3 | wwwブラウザ | Internet Explorer 5.01 以上 ※ ClickOnce ローダ( dfsvc.exe)の起動に ClickOnce をサポートする wwwブラウザが必要。※ Firefox などアドオンにより ClickOnce をサポートする wwwブラウザもあるが、サポート情報を探し難く、今後のサポート打ち切りなどの可能性もある。 |
補足(最新化:ブラウザ要件は解消した): 元ページが「今後のサポート
打ち切りの可能性」と懸念していたブラウザ依存は、その後解消された。
時期 出来事 2015〜 Chrome / Edge が NPAPI / ActiveX を廃止し、ClickOnce が起動できなくなる 2018 Edge (Chromium) 拡張として ClickOnce サポートが提供される 現在 Edge / Chrome とも、拡張 or 設定で .applicationを起動できるEdge では
edge://flagsの ClickOnce Support を有効にするか、
グループ ポリシーClickOnceEnabledで組織的に有効化できる。
加えて .NET Core 3.1 以降でも ClickOnce が復活しており
(.NET Framework専用ではなくなった)、
「もう使えない技術」ではなくなっている点は押さえておきたい。
「ClickOnce」では、インターネット環境から不特定多数に向けて配信される
Web アプリケーションのような利用を可能とするために、
インストールの垣根を下げる必要があり、
管理者権限が無くてもインストールが可能となっている。
-
このため、インストール先(正確にはキャッシュ領域)は、
%USERPROFILE%\Local Settings\Apps以下のディレクトリから
変更することはできなくなっている
(このためユーザ毎、別々にアプリケーションがストレージにキャッシュされる)。 -
リソースやデータの保存先のストレージもこの環境変数
USERPROFILE以下のディレクトリを使用するのが慣例となる。 -
「分離ストレージ」を活用すれば、
「ClickOnce アプリケーション」間のデータ保護も可能である。
サーバ要件(www サーバ、ファイル サーバなど)には、特別の要件は指定されていない。

「ClickOnce」の機能を利用するには、
-
Visual Studioで作成したプログラムを「発行」して生成した
「配布用フォルダ」を www サーバ上に配置し、 - 配置した「配布用フォルダ」内の『インストール Web ページ』を IE で表示する。
- この『インストール Web ページ』のリンク先には、
「ClickOnce アプリケーション」を配置するためのリンクが含まれる。 - このリンクを押下してリンク先のレスポンスを受ける。
- ランタイムの『ClickOnce ローダ(
dfsvc.exe)』は、
「ClickOnce アプリケーション」の配置情報を読み取り、
実行プログラムをローカル ディスクの『ClickOnce キャッシュ領域』に
ダウンロードする。 - プログラムを起動する。
- 『完全信頼』の場合は、単独で(通常の EXE と変わりなく)動作する。
- 『部分信頼』の場合は、
『ClickOnce ホスト(AppLaunch.exe)』にホストされた状態で実行される。
| ファイル | 役割 |
|---|---|
配置マニフェスト(.application) |
どのバージョンを配置するか。更新設定・アクセス許可 |
アプリケーション マニフェスト(.manifest) |
構成ファイルの一覧とハッシュ |
「セキュリティ ゾーン」に基づいた限定された「アクセス許可」が適用される。
| 項番 | 配置場所 | セキュリティ ゾーン |
|---|---|---|
| 1 | Web からの実行 | インターネット ゾーン |
| 2 | Web からのインストール | インターネット ゾーン |
| 3 | ネットワーク ファイル共有からのインストール | イントラネット ゾーン |
| 4 | CD-ROM からのインストール | 完全信頼 |
- 「ClickOnce アプリケーション」は、
必要な、設定された「アクセス許可」をクライアントに要求する。 - 要求された「アクセス許可」が「セキュリティ ゾーン」の「アクセス許可」を
上回っている場合は、「アクセス許可」の付与を求める
[セキュリティ警告]画面がユーザに対して表示される。
「配置オプション」には、『インストール モード』『配置場所』の 2 つがある。
どのオプションを選択しても配布の基本的な動作は同じ。
「ローカル ユーザ環境からのオフライン実行」が
| モード | オフライン実行 | キャッシュ |
|---|---|---|
| オンライン モード | 許されていない | インストール(保存)されない。オンラインからの起動しかできない |
| オンライン/オフライン モード | 許されている | インストールされ、オフラインでも実行可能 |
「配布用フォルダ」を、次の 3 種類から選択することができる。
- インターネット/イントラネットなどの Web 上(HTTP URL)
- ネットワーク上でのファイル共有(UNC パス)
- CD-ROM/DVD-ROM などのローカル デバイス上(ディレクトリ・パス)
「発行」後に「配布フォルダ」を移動する場合は、
プロジェクトのプロパティの[発行]タブにある、
[発行場所]と[インストールの URL]の両方のテキスト ボックスに
URL を入力することで対応できる。
「ClickOnce アプリケーション」は、『完全信頼』『部分信頼』の
どちらかのセキュリティ設定で動作する。
「セキュリティ制限」を受けずに、単独で(通常の EXE と変わりなく)動作する。
- .NET Framework が提供する『ClickOnce ホスト(
AppLaunch.exe)』に
ホストされた状態で動作する。 - これにより、アセンブリの出所に対応する「セキュリティ制限」
(サンドボックスと呼ばれるセキュリティ・モデル)を受け動作する。 - かつて『部分信頼』には、
コード・アクセス・セキュリティが使用されていた。
補足(部分信頼は廃止された): 「かつて」と書かれているとおり、
コード アクセス セキュリティ (CAS) によるサンドボックスは
.NET Framework 4 で非推奨となり、以降のセキュリティ境界としては
サポートされない(Microsoft は「CAS はセキュリティ境界ではない」と明言)。
.NET Core 以降には CAS 自体が存在しない。現在の ClickOnce は実質「完全信頼」のみと考えてよい。
サンドボックスが必要なら、OS 側の仕組み
(AppContainer / UWP / MSIX)を使うことになる。
管理者権限を持つ ClickOnce アプリケーションを実行することはできない。
ClickOnce では、
requireAdministratorまたはhighestAvailableの
実行レベルは使用できません。
ここにはハックがあり、管理者権限を持つ新しいプロセスを開始することはできる。
アクセス許可を構成する。
- プロジェクトのプロパティの[セキュリティ]ページに、
[ClickOnce セキュリティ設定を有効にする]チェック ボックスがある。 - 『完全信頼』/『部分信頼』を選択し、
部分信頼の場合はゾーンと各アクセス許可を選択する。 - [アクセス許可の検出]は静的な検出であり、
実行時に動的にロードされるアセンブリが必要とする「アクセス許可」は検出できない。
「コード サイニング証明書」による『署名』を行う。
- 『発行ウィザード』を実行後、「コード サイニング証明書」が自動生成され、
その証明書によって『署名』される。 - 開発時の証明書は自己署名なので、
-
certmgr.exeで「信頼されたルート証明機関」・「信頼された発行元」ストアに
インストールすることで、警告画面が表示されなくなる。 - 本番では、信頼されたルート証明機関に
コード サイニング証明書を発行してもらい、利用する。
-
- 配置場所(「配布用フォルダ」の「発行場所」)
- 『インストール モード』
- 発行するバージョン番号
- インストーラに含める必須コンポーネント
(必須コンポーネントのインストールにはインストール権限が必要)
「分離ストレージ」とは、主に『部分信頼』の「セキュリティ制限」を受ける
アプリケーションからアクセス可能な唯一のストレージとして用意されており、
また、種々のアプリケーションから利用できないよう分離される。
- 正確にはキャッシュ領域は、
%USERPROFILE%\Local Settings\Appsになる。 - プロジェクト出力に「埋め込まれたリソース」として追加された
app.configや、独自定義ファイル、
または、業務データの保存先はココに格納される。
ClickOnce では定義ファイルの配布・自動更新が問題となることがある。
以下、問題点の一例である。
-
app.configの書き換え後は、「再発行」して自動更新を行う必要がある。 -
app.config、user.configの設定変更については、
ファイル直接の書き換えも可能であるが、保存先のディレクトリには
ランダムな乱数値(ハッシュ)が含まれるため、
ユーザ(もしくは設定プログラム)による*.configファイル直接の
書き換えが難しい。- このため、設定変更に伴う
*.configの「再発行」が必要になる場合がある。 - また、
*.configの設定値は、「再発行」の後、
ディレクトリが変更されるため初期値に戻される。
- このため、設定変更に伴う
このような問題があるため、*.config ファイルではなく、
独自定義ファイルを使用した方が管理面で利便性が高くなる。
| 方式 | メリット | デメリット |
|---|---|---|
| 埋め込まれたリソース | 配布・自動更新対象になる。フォルダ権限を意識しなくてよい | テキストエディタで編集不可(設定変更時は再発行が必要)。読込 API が特殊(Assembly.GetManifestResourceStream) |
| ファイルとして配布 | テキストエディタで編集可能 | 配布・自動更新対象にならない。配置位置への読込権限が必要 |
| プログラムにより初期設定 | 配布・自動更新対象になり、かつ編集も可能 | 作り込みが必要(初期設定・更新時のデータ引継) |
補足(現在の定石): 上表の 3 番目、
「埋め込みリソースをテンプレートとして持ち、
初回起動時に%APPDATA%へ書き出す」というのが今も最も筋がよい。
更新時のマージ(新しい設定項目の追加)まで作り込めば、
運用で困ることはほぼなくなる。なお、
%USERPROFILE%\Local Settings\Apps配下(ClickOnce キャッシュ)に
業務データを置いてはならない。更新のたびにパスが変わり、消える。
- データ アクセス:可能(Silverlightや
Windowsストアアプリでは不可能だが) - プリンタ出力:可能
- プリンタ・ドライバのデプロイ:必須コンポーネント(
*.msi)に含めて
インストールできるが、インストール権限が必要になる。
System.Deployment.Application 名前空間により、次のような動作を追加できる。
- バージョン番号の表示
- 自動更新(更新されたバージョンがないかをサーバに問合せ、更新を行う)
- オンデマンドでアセンブリをダウンロード
「ClickOnce アプリケーション」は、
「1 つ前のバージョンにロールバック」することも可能。
- [プログラムの追加と削除]→ 対象アプリの[変更と削除]
- [ClickOnce の保守]ダイアログで
[アプリケーションを以前の状態に復元します。]を選択
ロールバックした後は、元のバージョンに戻せなくなる。
この場合、アンインストールするか、サーバ側の「配布用フォルダ」を更新するまで、
バージョン アップができないので注意が必要。
一度スキップすると 7 日間ほど更新のダイアログが表示されなくなる
(ClickOnce の仕様)。
サーバの更新後は最新のプログラムを使用する必要がある場合は
以下のいずれかの対応をする。
-
publish.htmから起動する。そうすれば自動更新される。 - オフライン実行を不可能にする。
ショートカットからの起動が無ければ更新キャンセル不可能。 - ClickOnce Deployment API を使用して、
アプリケーション自身が更新を確認する作りにする。 -
更新の必須化
「アプリケーションに最低限必要なバージョン」を指定しておくことで、
それよりも古いバージョンのアプリケーションを実行不可とする
(キャンセルできない)。
補足(実務では 4 が最も確実): 「最低限必要なバージョン」
(minimumRequiredVersion)は
ユーザがスキップできないため、
セキュリティ修正の強制適用に使える唯一の手段である。
業務システムでは既定でこれを設定しておくのが望ましい。
IE 以外のブラウザのサポート状況について(執筆当時の状況)。
| ブラウザ | 当時 |
|---|---|
| Firefox | Microsoft .NET Framework Assistant アドオン。2016年に無効化 |
| Chrome | Microsoft 純正の Plugin が無い |
| Microsoft Edge(旧) | ClickOnce や No-Touch Deployment が動作しない |
補足(現在の状況): 前掲のとおり、
Chromium 版 Edge / Chrome では ClickOnce を起動できるようになった。
ブラウザ 現在 Edge (Chromium) edge://flagsの ClickOnce Support、またはポリシーClickOnceEnabledで有効化Chrome 拡張機能(Microsoft 提供の ClickOnce Helper 等)で対応 Firefox 非対応 IE 2022年6月にサポート終了 ただし、現在の Windows アプリ配布の主流は MSIX である。
ClickOnce MSIX 管理者権限 不要 不要 クリーンなアンインストール △(残骸が出ることがある) ○(コンテナ化) Microsoft Store 配布 × ○ 差分更新 △ ○(ブロック単位) .NET 以外のアプリ × ○(Win32 も可) 既存の ClickOnce 資産は維持で構わないが、
新規は MSIX を第一候補とするのが現在の判断である。
-
ClickOnce - Wikipedia
https://en.wikipedia.org/wiki/ClickOnce -
連載 ClickOnceの真実 - @IT
http://www.atmarkit.co.jp/ait/articles/0603/11/news018.html
-
ClickOnce のセキュリティと配置 | Microsoft Learn
https://learn.microsoft.com/visualstudio/deployment/clickonce-security-and-deployment -
.NET デスクトップ アプリの ClickOnce(.NET Core 3.1 以降)
https://learn.microsoft.com/visualstudio/deployment/quickstart-deploy-using-clickonce-folder -
MSIX ドキュメント
https://learn.microsoft.com/windows/msix/
Tags: 移行, .NET開発, 配付技術, セキュリティ, Windows Forms, WPF
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。