2010年2月7日日曜日

アプリケーションのWindows7移行について

先日MS主催のセミナー『Windows7&Windows Server 2008 R2対応アプリケーションへの移行のための開発ポイント』に参加しました。
広範囲にわたる内容でしたが、気になった箇所と要点をざっとまとめてみました。


■Windows7への対応方法


Windows7はWindows Vistaがベースであり、完全互換を目標として開発されている。
Vistaでの検証済みアプリケーションは概ねWindows7でも動作する。
Windows7への対応はVistaへの対応方法とほぼ同じ。

*Windows7の強化ポイント
先進的なユーザーエクスペリエンス、総合検索など。
ビルトインアカウントのAdministratorは既定で無効。

*互換モード

OSが互換機能を提供。
ただし、.netやJavaのアプリケーションは適用外。

*Windows XPモード
Windows 7 Pro以上で利用可能。
Virtual PCを利用し仮想Windows XPで動作するアプリケーションのウィンドウだけをWindows7上に表示する。

*開発環境
Visual Studio 2008 SP1
Windows7 SDK
Windows Server 2008 R2 SDK
.net Framework 3.5 SP1
VB6ランタイムも含まれている

*Windows7のバージョン
Windows7のバージョンはメジャーバージョン=6、マイナーバージョン=1。
Vistaはメジャーバージョン=6、マイナーバージョン=0。

.netではEnvironment.OSVersionを使用して取得。

*フォルダ構成の変更(Vistaから)
Document and Settings, All Users, My Documents, Application Dataといったフォルダのパスが変更されている。
フォルダのパスは.netではSystem.Environment.GetFolderPathメソッドで取得する。

*フォルダーの接合点
旧来のパス(Document and Settingsなど)に書き込みを行うと、別のフォルダーへリダイレクトして書き込む。
読み込みは行われない。

*ユーザーアカウント制御(UAC)

管理者でも普段は標準ユーザーのトークン(=特権)しか持たず、必要に応じて
フルトークン(=管理者権限)を利用可能にする。
ただし、ビルトインのAdministrator(既定では無効)は常にフルトークンで動作

権限昇格が必要な場合はUACダイアログを必要に応じて表示する。
アプリケーションの発行元によってダイアログの帯の色が変わる。

Windows7ではUACの表示タイミングが4段階に変更。
UACダイアログの表示が最低限に改良。
インストール時も一度だけ表示される。

*シールドアイコン
権限昇格が必要な場合にボタンに表示(手動)。また、アプリケーションのアイコンに表示(自動)。

*権限昇格の方法
コンテキストメニューから管理者として実行する。
ファイルのプロパティで指定。
アプリケーションマニュフェストで指定・

*アプリケーションマニフェスト
実行ファイルの実行権限をアプリケーションマニュフェストに記述する。
管理者権限が必要な場合、アプリケーション起動時にUACダイアログが表示される。

ファイル名は「実行ファイル名.exe.mnifest」とし、実行ファイルと同じフォルダに配置するか実行ファイルに埋め込む。

Windows7からマニュフェストにCompatibilityセクションが追加され、
アプリケーションの対応OSが指定可能に。
指定がないとVista互換モードで動作する。

マニュフェストがない場合、ファイル名にsetup, installなどが含まれるとインストーラとして検知され
権限昇格ダイアログが表示される。

*インストーラの注意
ユーザー毎の設定はインストーラでは行わない。
アプリケーションの初回起動時に行う。
Windows Installerの使用を推奨。

管理者権限が必要な場合、別プログラムもしくはCOMオブジェクトとして分離する。
もしくはタスクやサービスを利用する。

*ファイルとレジストリの仮想化
権限のない特定のフォルダーやレジストリに書き込みを行った場合に
ユーザー別のフォルダ・レジストリに書き込むことにより互換性を保つ。
次回読み込む場合はユーザー別のフォルダ・レジストリから読み込む。

フォルダ:Program Files, レジストリ:HKLM\Softwareなどが対象
対象は32ビットの対話型アプリケーションで管理者権限で実行されていない場合。

*整合性レベル(IL)
高中低の3段階にレベルを分け、保護を行う。
たとえば、%WinDir%などは高ILの領域であり、
高ILのプロセスからは高ILの領域にアクセスできるが
中・低のプロセスからは高ILの領域にはアクセスできない。
このように、下位のILからの上位のILへのアクセスは禁止される。

*ユーザーインターフェース特権の分離(UIPI)
上位権限のプロセスを、デスクトップ上の下位権限のプロセスからの
ウィンドウメッセージなどによる攻撃から保護する。
スレッドフック、PostMessage、ハンドルによるアクセス、DLLの注入など

*Internet Explorerの保護モード
保護モードをオンにすると、IEのプロセスは下位ILで動作する。
上位ILのプロセスや保護されたフォルダへはアクセスできない。

*セッション0の分離
Windows XPでは最初にログインしたユーザーとサービスが同じセッションとなっていたが、
VistaとWindows7では完全に分離される。
システムプロセスとサービスはセッション0で、ユーザーはセッション1以降を使用する。
このため、サービスからウィンドウを表示することができない。

*Windowsリソース保護
保護されたファイル・レジストリの更新が行われた場合、アクセスエラーを表示しない
(関数の戻り値は成功を返す)がリソースの変更はできない。
条件:インストーラの実行権限がマニュフェストで定義されておらず、
管理者権限で動作している場合。(ファイル名にsetupが含まれる場合など)

*Unicode対応
Shift-JISに含まれない文字が存在しうる。
JIS2004のサポートにより、サロゲートペア文字(1文字が32ビット)が含まれるようになった。
1文字16ビットを仮定してはいけない。

*LCIDの指定
標準のソート方法がユーザーごとに変更できるため、
必要な場合はロケールID(LCID)を明示的に指定する。

*フォント
Windows7対応フォントは言語属性を持ち、
フォントの選択ダイアログでは文字入力の言語と一致したフォントのみが表示される。

*高DPIへの対応
Windows7では高解像度(高DPI)がユーザー別に設定可能に。
従来のアプリケーションはDPI仮想化により拡大表示できる。

■64ビットへの対応

Windows7は32ビットと64ビットに対応
Windows Server 2008 R2 は64ビット専用

*64ビットのメリット
広大なメモリ空間とアドレス空間。
レジスターの効率的利用など

*WOW64
Windows on Windows 64
Win32 x86アプリをそのまま動作させることができる。
レジストリ・システムファイル・環境変数を32ビットと64ビットで分離し共存

システムファイルは%windir%\syswow64にリダイレクトされる

32ビットアプリケーションがレジストリにアクセスする場合、WOW6432Nodeにリダイレクトされる。
例:HKLM\Software → HKLM\Software\WOW6432Node

*WOW64の制限
同一プロセスで32ビットと64ビットの混在はできない。
たとえば、32ビットプロセスは64ビットのDLLをロードできない。
混在させるにはアウトプロセスCOMやRPC、共有メモリなどを使用する

*開発環境
VS2008は32ビットアプリケーションの開発とリモートデバッグをサポート。
32ビット版・64ビット版・任意(Any CPU)の作成をサポート。

.net Frameworkの64ビット版には32ビットと64ビットの両方が含まれる。
(.net Framework2.0以降は64ビット対応)

*VB6で作成したプリケーション
32ビットで動作させるならそのまま動作可能。
64ビットで移行させる場合は.net Frameworkへ移行が必要。

*移植に関する注意
P/Invoke, COMを使用する場合、ポインターのサイズを使用している場合は修正が必要。
StructLayout属性などにより構造体のアライメントを変更している場合は確認が必要。

■Windows2008 R2 への対応


Windows 7と同一カーネルを使用しており、Windows7 +αで対応可能。
新機能にはHyper-V 2.0、IIS7.5などがある。

*仮想化
Hyper-V2.0とリモートデスクトップ仮想化に対応。
プログラム・セッションごとのIPアドレスの仮想化に対応。

*IIS 7.5
アプリケーションプールごとに32ビット・64ビットを選択可能。
Server Core上でのASP.NETをサポート。
FTP/WebDAVの統合。
PowerShellによる管理に対応。

*注意点
既定でインストールされない機能が多い。
IISのビルトインアカウント名が変更に。
IIS5 互換モードは廃止。
クエリー文字列長さの制限が2048バイトに。
実行するアカウント名がアプリケーションプール名に。(従来のNetworkServiceへの変更も可能。)

*サーバコア
.net Frameworkをサポート。
WOW64 32ビットアプリケーションをサポート。(既定ではインストールされない)
ただし、サーバコアでの.net Frameworkは画面表示などの機能を除いたサブセット版。

*Power Shellの強化
新しいAPIとコマンドレットに対応。
リモートおよびバックグラウンドジョブに対応。
スクリプトのデバッグ。
国際化対応など。

0 件のコメント:

コメントを投稿