.NET Framework のノータッチ デプロイメント
July 2002
要約 : この記事では、Web サーバーを使用して Windows フォーム スマート クライアント のセットアップおよびアップデートを簡易化する画期的な新機能を紹介します。ここで説明する Task Management サンプル アプリケーションは、Visual Basic .NET の一部として提供されます。
目次
はじめに
Web サーバーを使用したノータッチ デプロイメント
サンプルのウォークスルー
Windows フォームの応答性を向上させるには
セキュリティ
マルチアセンブリ アプリケーション でのノータッチ デプロイメント
ノータッチ デプロイメントと XML Web サービス
オプション : セキュリティ ポリシー を設定する
クライアント要件
まとめ
はじめに
Visual Basic クライアント サーバー アプリケーション、または COM 登録を利用した Win32 アプリケーションのセットアップに携わったことがありますか? 企業のデスクトップ環境へ正しくインストールを行うにはすべてのユーザーのアプリケーションをアップデートするにはどうしたらいいのか、といった簡単な問題から、DLL バージョンの障害などの複雑な問題まで、さまざまな問題を解決する必要があります。
デスクトップ アプリケーションは、Web アプリケーションと比べて多くの利点があります。特に、以下のような利点を挙げることができます。
- より豊富なユーザー インターフェース (UI)
- 優れた応答性
- より優れたパフォーマンス
- オフライン実行機能
- エッジ リソースの有効活用 (クライアント マシン上での)
- ローカル アプリケーションと API の統合の容易性
これらの利点にもかかわらず、近年、Web アプリケーションが圧倒的な人気を得ています。デスクトップ アプリケーションと比べて、Web アプリケーションはセットアップとアップデートが容易にできるためです。
.NET Framework によって、マイクロソフトはセットアップとメンテナンスに関する Web アプリケーションのあらゆる利点をデスクトップ アプリケーションにもたらします。デフォルトで、.NET Framework を使って作られたアプリケーションは完全に 1 つ 1 つ独立しており、DLL を各自のプライベートなアプリケーション ディレクトリから取り出すため、DLL バージョンの問題は解消されます。DLL は複数のアプリケーションで共有が可能ですが、システムのレジストリを使う代わりに、共有された DLL が .NET Framework の グローバル アセンブリ キャッシュに格納され、これが DLL の多様なバージョンをホストし、どのバージョンがどのアプリケーションに対応するかを記録します。実際のアプリケーションの展開の際には、.NET Framework を使用することによって、システム管理者はリモート Web サーバー経由で Web アプリケーションと同様にアプリケーションをセットアップし、アップデートすることができます。これがノータッチ デプロイメントと呼ばれる技術です。このホワイトペーパーでは、この技術について説明します。
Web サーバーを使用したノータッチ デプロイメント
ノータッチ デプロイメントを実行すると、Windows フォーム アプリケーション、つまり .NET Framework の Windows フォーム クラス を使用して構築したデスクトップ アプリケーションをレジストリや共有システム コンポーネントを変更することなしにユーザーのマシン上で直接、ダウンロード、インストール、実行することができます。
ノータッチ デプロイメントのしくみ
.NET Framework のインストールは Internet Explorer 5.01 をフックし .NET アセンブリが要求されるのを待機する機能を提供します。要求が行われている間、実行可能アプリケーションがディスク上のアセンブリ ダウンロード キャッシュ と呼ばれる場所にダウンロードされ、IEExec と呼ばれるプロセスによって制約付きセキュリティ設定環境でアプリケーションが起動されます。
図 1 ノータッチ デプロイメントのしくみ
サンプルのウォークスルー
一連のタスク管理を可能にする、非常にシンプルな Windows フォーム アプリケーションがユーザーに提供されます。これらのタスクは、バグのトラッキング、IT チケットのトラブルシューティング、Outlook XP や Visual Studio .NET のものと同様の to-do リストなどで実行できます。
最初に、Visual Studio .NET 内のアプリケーションを開いてください。Task Management アプリケーションが Windows フォームおよび TaskMgmtWS と呼ばれる XML Web サービスを使って Visual Basic .NET 内で実行されます。TaskMgmntWS は、ADO.NET を介して Access データベースと通信し、タスクを保存します。
Task Management アプリケーションは TaskMgmtWS Web サービスを使って DataGrid ウインドウ コントロールをアップデートします。このアプリケーションを起動すると、ws と呼ばれる XML Web サービス オブジェクトのインスタンスが作成されます。そして、ウェブ メソッド GetTasks() が呼び出され、タスクの ADO.NET DataSet を取得します。タスクの DataSet は DataGrid ウィンドウ コントロール上で DataSource プロパティに割り当てられます。
' Web serviceを呼ぶ
Dim ws As localhost.Service1 = New localhost.Service1()
Dim ds As DataSet = ws.GetTasks()
' DataSetの結果をDataGridに接続します
DataGrid1.DataSource = ds
DataGrid1.DataMember = "Tasks"
アプリケーションが戻ると DataGrid がアップデートされ、アプリケーションは再描画されます。この時点で、ネットワークベースのアプリケーションに共通して見られる問題が起こります。最初のロード時にアプリケーションはネットワークを呼び出しますが、この呼び出しに時間がかかってしまうのです。
Windows フォームの応答性を向上させるには
アプリケーション全体の応答性を向上させるには、バックグラウンド スレッドを活用します。アップデートされたアプリケーションが起動すると、ワーカー スレッドを呼び出し、XML Web サービス オブジェクトのインスタンスを作成します。Web サービスのインスタンスが作成されると、MethodInvoker() を使って UI を安全にアップデートできます。
Form Load イベントのワーカー スレッドから見てみましょう。
' バックグラウンド ワーカー スレッドを使ってWebサービスを呼び
' アプリケーションで初期のフォームが読み込まれる間の
' 総合的な応答性を向上させます。
ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf GetTasksWebServiceBackground))
バックグランド スレッド内の Windows フォームのアップデート方法の詳細については、Knowledge Base の記事、Q318604 "Visual Basic 2005 または Visual Basic .NET を使って、 DataGrid にどのようにバックグラウンド スレッドでデータ連結を取り込むには。" を参照してください。
Windows フォーム が動作している間、バックグランド スレッドは XML Web サービスの呼び出しを行います。
Private Sub GetTasksWebServiceBackground(ByVal data As Object)
' Web serviceを呼ぶ
Dim ws As localhost.Service1 = New localhost.Service1()
m_ds = ws.GetTasks()
' Windows Form の DataGrid をアップデートする
Dim mi As New MethodInvoker(AddressOf UpdateDataGridForm)
Dim ia As IAsyncResult = BeginInvoke(mi)
Cursor = Cursors.Default
End Sub
アプリケーションを Web サーバー上で展開する方法を示すために、Task Management アプリケーションを Tasks Web Service Web フォルダに展開してみます。まず、build フォルダを TaskMgmtWS Web Service IIS 仮想ディレクトリに変更しましょう。具体的には、TaskManagement プロパティ ページ ダイアログ ボックスを開き、出力パスを "..\TaskMgmtWS\" に設定します。
Web サーバーに build の出力パスが設定されたので、再コンパイルするだけでアプリケーションをセットアップすることができます。アプリケーションが構築されたら、Internet Explorer を起動して https://localhost/TaskMgmtWS/TaskManagement.exe. をブラウズしてみましょう。.NET Framework がインストールされた Internet Explorer はアプリケーションを保存するように要求せずに起動を試みるはずです。Web ページ内のアプリケーションをダウンロードする機能が必要な場合は、プロトコル ハンドラ "file://" を使用します。
これでアプリケーションは HTTP を介してダウンロードされ、アセンブリ ダウンロード キャッシュにインストールされました。アプリケーションを起動する前に、セキュリティ ポリシーの確認を行い、ユーザーがアプリケーションを使用する権限があるかを調べます。
ここまでで、アプリケーションを Web サーバーから起動する方法を見てきました。次は、アプリケーションに変更を加え、アップデートがいかに簡単かを見てみましょう。DataGrid を選択し、自動フォーマット プロパティを使ってバックグランド スタイルをすばやく変更することができます。
次のステップでは、Web サーバー上の .exe ファイルをアップデートするためにアプリケーションを再構築します。ユーザーが Windows フォームにリクエストすると、アプリケーション コードが自動的にアップデートされます。.NET Framework は自動的にアセンブリのタイムスタンプをチェックして、再度ダウンロードが必要か、それとも単にユーザーのアセンブリ ダウンロード キャッシュから起動すればいいのかを調べます。
セキュリティ
コード アクセス セキュリティは、ノータッチ デプロイメントを介してダウンロードされる Windows フォーム アプリケーションからデスクトップを保護するのに重要な役割を果たします。このモデルは、各アプリケーションを対応する承認に一致させることによって機能します。ランタイムには、共通言語ランタイム (CLR) がアセンブリにエビデンスを収集します。エビデンスは、Internet Explorer ゾーンからきたコードの形で現れます。ローカル ディスク、イントラネット、インターネット、信頼済みサイト、制限付きサイトなどのコードの提供元の URL、秘密鍵の署名付きコード、コードのハッシュ値、認証コード発行者の署名など、さまざまです。このエビデンスを使って、共通言語ランタイムはアセンブリを適切なコード グループまたはカテゴリに割り当てます。各コード グループは認証セットを与えられており、ローカル ディスクの読み込みおよび書き込み、ネットワーク リソースへのアクセス、印刷、環境変数へのアクセスなど、アセンブリがどの認証を得るべきか指示します。
デフォルトで、.NET Framework は Internet Explorer ゾーン周辺に設定されたコード グループを有しています。たとえば、インターネット ゾーンからきたコードは権限が制約され、File IO アクセスを実行できない可能性もあります。
セキュリティ チェックが実際に行われている様子を示すために、実行可能な Task Management のツールバーには "Read Boot.ini" と呼ばれるボタンがあり、このボタンで C ドライブ上のファイルにアクセスできます。
簡単なテストをしてみましょう。"Read Boot.ini" ボタンをクリックし、アプリケーションが C ドライブのルートにあるファイルを要求した場合、何が起こるでしょうか。セキュリティ例外が発生し、アプリケーションは要求を実行しないはずです。
セキュリティ例外は、アプリケーションが TaskManagement.exe の要求したリソースへのアクセス権を持たないことを示すファイル入出力例外を返します。
マルチアセンブリ アプリケーション でのノータッチ デプロイメント
このサンプル アプリケーションでは、シングル アセンブリのロード方法について見てきました。.NET Framework には、Assembly オブジェクトの LoadFrom() を使ってマルチアセンブリ アプリケーションを "小分け" にして効果的にクライアントにロードさせる機能もあります。
Assembly クラスは LoadFrom メソッドを持っており、これを使って特定のアセンブリを初期化することができます。LoadFrom メソッドのパラメータには URL とファイル パス名の両方を使用できます。URL を指定すると、.NET Framework は目的のアセンブリがクライアント上に存在するかどうかを、アセンブリ ダウンロード キャッシュをチェックすることによって確認します。アセンブリがアセンブリ ダウンロード キャッシュ内にない場合は、Web サーバーからそのアセンブリを取得し、ダウンロード キャッシュにコピーが作成されます。これで、アセンブリ オブジェクトをコード内で使用する準備が整いました。
たとえば、TaskManagement の About Windows フォームが AboutForm.dll と呼ばれる別のアセンブリで実行されると、ユーザーの [About] ダイアログ ボックス閲覧の要求に応じるために、LoadFrom を使ってアセンブリを取り出します。この作業により、ユーザーがアプリケーションと対話した通りに、アプリケーションが必要としているコードを転送します。
ノータッチ デプロイメントと XML Web サービス
Web サーバーを介してアプリケーションが配布される際には、セキュリティによる制限が重要になります。ドメインは、そのドメインが依存する Web サービスに適合していなければなりません。たとえば、http://myserver/TaskManagement.exe から TaskManagement.exe を立ち上げると、http://myserver でのみ XML Web サービスを使うことができます。アプリケーションが、その他のサーバーから Web サービスを呼び出すことはセキュリティ上の理由から許可されません。
オプション : セキュリティ ポリシーを設定する
マシンの管理者は、セキュリティ設定を変更して既存のコード グループによりレベルの高い権限を与えたり、新規のコード グループを一から作成することができます。
操作する前に理解しておくべきことは、セキュリティ設定の変更は危険であり、決して設定をオフにしてはいけないことです。アプリケーション実行のために必要な場合を除いては、セキュリティ設定の変更は極力行わないでください。
マシンの管理者は、CasPol コマンド ライン ツール (%SystemRoot%\Microsoft.NET\Framework\v1.0.3705\CasPol.exe にあります) を起動して、ローカルホストから起動されたアプリケーションにローカル ディスクへのフル アクセスを許可することができます。
caspol -machine -addgroup All_Code -url https://localhost/* FullTrust -n TaskManagement
その結果、ファイルの入出力が許可され、アプリケーションは Boot.ini のコンテンツを返すことができます。
CasPol コマンド ライン ツールに加えて、.NET Framework Configuration Tool と呼ばれるグラフィカルな設定ツールが MMC (Microsoft 管理コンソール) スナップインを介して提供されます。スナップインを開き、[マイ コンピュータ] から、[ランタイム セキュリティ ポリシー] → [コンピュータ(Machine)] → [コード グループ] → [All_Code] の順でクリックして、[タスク管理] を開きます。[タスク管理] ウィンドウでは新規に作成されたコード グループを見ることができます。コード アクセス セキュリティによって実現された柔軟性と精度を確認するには、新規コード グループを設定してみてください。
さまざまなオプションを検討した後、上記の方法で作成したコード グループは以下のコマンドを実行して必ず削除してください。
caspol -remgroup TaskManagement
新規のコード グループは MMC ツールから削除することもできます。[タスク管理] ウィンドウを右クリックし、[ツールの削除] を選択すれば、コード グループから MSI ファイルを簡単に作成できます。システム管理サーバーもしくはグループ ポリシーを使用して企業全体に MSI ファイルを展開させることができます。
クライアント要件
- .NET Framework をサポートしているオペレーティング システム
- .NET Framework with SP1
- Internet Explorer 5.0.1 以上
- アプリケーション展開のための IIS Web サーバーへのアクセス
まとめ
ノータッチ デプロイメントは、Windows フォーム アプリケーションの優れた配布手段となります。アプリケーション開発者は、Web アプリケーションによって実現可能な、展開およびメンテナンス上の利便性を維持しながら、デスクトップ処理能力を最大限に活用することができます。