Delphi 2007 for Win32によるWindows Vista対応
ボーランド株式会社 Developer Tools Group 高橋智宏
Copyright (C) 2007, CodeGear. 本文書の一部または全部の転載を禁止します。

2アジェンダ• Windows Vista による影響• Delphi for Vista の新機能
• Vistaに対応するには
注：このプレゼンテーションは以下の資料を参考にしています[MSDN: Windows Vista Application Development Requirements for User AccountControl]
http://msdn2.microsoft.com/en-us/library/aa905330.aspx[Developer Best Practices and Guidelines for Application in a Least Privileged
Environment]
http://msdn2.microsoft.com/en-us/library/aa480150.aspx[Microsoft Windows Vista: 互換性に関するドキュメント]http://www.microsoft.com/japan/msdn/windowsvista/general/AppComp.aspx

1

3

Windows Vista

4

イノベーションと互換性• Windows Vista によるユーザー・エクスペリ
エンスの向上– セキュリティ– 信頼性– 使い易さ• 多くのアプリケーションはそのまま動作する• Windows Vista による改良点が互換性を損なうこともある

2

5

典型的な互換性の問題• 管理者権限での動作を想定している (セキュリティ上重要なリソースへのアクセス)• 古いOSの機能を利用している• OSのバージョンに強く依存している• 内部的なシステムコールやデータ構造を使用している• 潜在的な不具合• UIの描画に関する問題

6

ユーザーアカウント制御(UAC)• アプリケーションは管理者権限無しで動作する• 脆弱性が入り込む余地を軽減する– マルウェア, トロイ, ウィルス, rootキット• 問題点– インストーラが正しく動作しないものがある– 管理者権限での実行を想定して設計されているアプリ
ケーションがある– 管理者としての資格を調べるアプリケーションがある– 症状 (Silent failure、プロンプト、モーダルメッセージ)

3

7

ユーザーアカウント制御(UAC)• UACの下でも動作するようアプリケーションを修正する– 標準ユーザー権限で動作させる– 管理タスクはCOMオブジェクトまたは別の実行可能EXEを使用して行う– アプリケーションマニフェストでUAC権限レベルを指定する– リダイレクトが必要無いようにする• 実行時における対処法– アプリケーションが権限を昇格できるようにする– ファイルやフォルダに対するアクセス制御リスト(ACL)を外す

8

ユーザーアカウント制御(UAC)• セキュリティトークンは、ログイン中分離されています– 「ユーザートークン」と「管理者トークン」• シェルは「標準ユーザーのトークン」で動作しています (管理者であっても)• プロセスを生成する際には、毎回、明示的に「管理者のトークン」 が必要となります。
– これが「昇格（elevation）」と呼ばれるものです4

9

標準ユーザー から 管理者 への昇格

10

Windows Vista• デフォルトで、UAC が有効になっている• 新規に作成されるユーザーアカウントはすべて「標準ユーザー」として作成される• デフォルトで、「Secure Desktop(画面の暗転)」 上に、「昇格のプロンプト(Elevation Prompt)」が表示される• バックグラウンドアプリケーションに対する「昇格のプロンプト(Elevation Prompt) 」は、タスクバー上に最小化されて表示される• デフォルトで、新規インストール時、ビルトインの管理者アカウントは無効になっている• 新しいアクセス制御リスト(ACL)のデフォルト設定5

11

標準ユーザー• デフォルトでは、プロセスは標準ユーザー権限で起動する• 標準ユーザーが行えないこと– 「Program Files」フォルダ内のファイルに対する変更– 「Windows」または「System32」フォルダ内のファイルに対する変更– 「HKLM¥Software」以下にあるレジストリの変更– ローカルコンピュータの日時の変更– 「サービスアプリ」のインストールとアンインストール–…

• これまで推奨されてきたことが、ついに強制されるようになった！

12

UACのアーキテクチャ
New!
• ログイン中のアクセストークンの分離• インストーラの検出• ユーザーインターフェース
特権の分離(UIPI)• 仮想化• Secure Desktop（画面の暗転）

6

13ユーザーインターフェース特権の分離(UIPI)• 一般的なガイドライン – 「低い権限」では「高い権限」にアクセスできない• 低い権限のプロセスで出来ないこと– ウィンドウハンドルの検証– SendMessage や PostMessage– スレッドフックを利用したアタッチ– ジャーナルフックを利用したモニタリング– ダイナミックリンクライブラリ(DLL)を使ったインジェクション

• いくつかのリソースは依然としてプロセス間で共有される– デスクトップウィンドウ（実際にデスクトップ表面を覆っているもの）– 読み込み専用の共有メモリとしてのデスクトップヒープ– グローバル atom テーブル– クリップボード

14

仮想化／リダイレクト• 仮想化は互換性のためにある – 機能ではありません• アプリケーションマニフェストにUAC情報を設定することで無効化できる！

7

15「Shield」 - アイコン
• クリックして次の手順に移行するのに「昇格(elevation)」を必要とする場合に、コントロー
ルに付加する• １つのステータスしか持たない(例：ホバリングやDisable状態などは無い)

16「Shield」の例

8

17Windows リソース保護(WRP)• システムを保護する: ファイル／フォルダ／レジストリキー• OSだけが保護されたリソースを更新できる• 問題点– システムのバイナリリソースの置き換え– システムのレジストリキーへの書き込み• 絶対にWindowsシステムのファイルやレジストリキーを置き換えない• 絶対にMicrosoftの再配布パッケージをリパッケージしない

18

アプリケーションの更新• アプリケーションの更新には管理者権限が必要• 問題点:– 標準ユーザーは管理者権限を持たない– アプリ更新プログラムとして、別のEXEを使用する• 対処法:– 更新プログラムは、マニフェスト付きの別プロセスにすべき– MSIを使ったパッチ適用– ClickOnce技術を使用する

9

19

サービスアプリの分離 サービスアプリは独自のセッション(セッション0)で動作します ユーザーアプリはサービスアプリとセッションを共有することは出来なくなりました 問題点– サービスアプリはユーザーのデスクトップやアプリケーションと直接対話することはできない– ユーザーとの対話を行うサービスは、UIに表示されないためハングアップするかもしれません– セッションやグローバルな名前付きのオブジェクトの作成

20サービスアプリの分離 (続き) アプリケーションを修正する– サービスアプリはUIを使用しないようにすべき– ユーザーアプリはセッション0での動作を想定すべきではない– ユーザーアプリは「Fast User Switching」をサポートするか否か– サービスアプリとオブジェクトを共有するユーザーアプリは、グローバルなオブジェクトを使用すべき– グローバルな名前付きのオブジェクトはセッション0で作成する

 OSによる対処法– セッション0でのUI表示がある場合には、現在のユーザーに対して通知が行われる

10

21

Internet Explorer の保護モード
 Internet Explorer は、極めて低い権限で動作します– IE は、ユーザーのファイルやレジストリキーを変更できません！
– ファイルやレジストリへの書き込みは、IEだけに見える場所へとリダイレクトされます– ウィンドウメッセージはブロックされます 問題点– 外部プロセスとデータを共有しているコントロールは動作しない– ユーザーの許可を求める新しいプロンプト

22Internet Explorer の保護モード(続き)– 対処法– マニフェスト付きのOCXのインストーラを使用する– 外部プロセスと通信する場合はCOMオブジェクトを使用する– サイトを信頼済みサイトの一覧に追加する– IEの保護モードを無効にする(低MIC)

11

23

バージョンチェック アプリケーションがOSの特定のバージョンをチェックしている– 依存関係のチェックのため– 製品のマーケティング上の制約のため

 症状はアプリケーションごとに異なる– インストールや起動が失敗する(Silent failure)– 「サポートされないOSです」等のメッセージが表示される

 対処法– アプリケーションは、サポートOSの最小バージョンを決定しておくべき24

USER／GDI／DPI• 新しいディスプレイドライバモデルと、DesktopWindow Manager(DWM)• テストが必要な新しい領域– サムネイル– Flip 3D– ドラッグアンドドロップ– アプリケーションがポップアップ表示するもの– 高DPI– スクリーンの回転– マルチモニタのサポート– 新しいUIテーマ

12

25

その他
• シェルの変更– 「マイ ドキュメント」フォルダの構造が変更された – そのパスをハードコードしているアプリケーションは動作しない
かもしれません– Fast User Switching(高速ユーザー切り替え)• 「Full text search API」の変更• 「IIS 7」の変更• バックアップソフト向け「ボリュームシャドウコピーサービス(VSS)」のWriterの変更• 新しい「Server core edition」はほとんどUIを必要としなくなりました26

削除されたコンポーネント• 以下の機能は利用できなくなりました– FrontPageサーバーの拡張– POP3 サーバー
– Macintosh向けのサービス– カーネルモードプリンタドライバ– WinHelp (HTMLヘルプ と .CHMファイル はサポートされます)– ビデオオーバーレイ

13

27

プログラムの「互換性」タブ

28

設計の指針
 ユーザー固有のデータは、ユーザーのフォルダ／ファイル／レジストリキーに格納する– アプリケーションを標準ユーザーで動作するように設計する– 「C:¥ProgramData」か「%UserProfile%」に書き込む– レジストリの値は「HKCU」に書き込む– アプリケーションのインストールには「MSI」を使用する

 必要があるまで不用意にファイルやレジストリを書き込みモードでオープンしない

14

29

参考情報• ドキュメント– Windows Vista Application Development Requirementsfor User Account Control Compatibility– Developer Best Practices and Guidelines for Application
in a Least Privileged Environment– http://www.microsoft.com/japan/msdn/windowsvista/general/AppComp.aspx• ツール– Microsoft Standard User Analyzer(SUA)• Windows Vista Logo Program– http://microsoft.mrmpslc.com/InnovateOnWindowsVista/30

Delphi 2007 の新機能15

31

テーマ
• XPManユニットはプロジェクトオプションに置き換わりました32

新しいコンポーネント• TTaskDialog– 新しい TaskDialogIndirect APIをラップ• TFileOpenDialog– 新しい IFileOpenDialogインターフェースをラップ• TFileSaveDialog– 新しい IFileSaveDialogインターフェースをラップ• フォームデザイナ上での「ダイアログのテスト」メニュー(プレビュー機能)が追加

16

33

新しいプロパティ• TCustomForm.GlassFrame– グラス効果のウィンドウフレームを、フォームのクライアント領域へも拡張して使用できる– 「SheetOfGlass」プロパティをTrueに設定する必要がある(デフォルトはFalse)

34

新しい関数
• TaskMessageDlg– MessageDlgに相当するもの。Vista以外のOS上で呼び出された場合は、従来のMessageDlgが呼び出されます。

Vista上

XP上

17

35

新しいグローバル変数• UseLatestCommonDialogs– Trueに設定されていた場合、TOpenDialog／
TSaveDialog／TOpenPictureDialog／
TSavePictureDialog／MessageDlgを使用すると、最新のVista環境に合ったダイアログが表示される (アプリケーションがVistaで動作している場合)– Falseに設定すると、これまでの動作と同じになる– デフォルトはFalse(OFF)36

新しい例外• EPlatformVersionException
ビルド時

Vista上XP上(例外が発生)

18

37

Windows API に関する変更• UxThemes – 新規
• DwnApi – 新規
• ActiveX – アップデート• Windows – アップデート• Messages – アップデート• CommCtrl – アップデート• ShlObj – アップデート

38

DBX4(dbExpress Ver4)• 新しいDelphiデータベースドライバフレームワーク• DBX4の目標– BDPとDBXのドライバテクノロジーを１つに統合する– ADO.NET 2.0 のサポート– UNICODEのサポート– DBX VCL コンポーネントを単一ソースにする– DBXドライバの「共通」の実装部分のソースコードを提供– DBXドライバの開発をアウトソースすることを可能にする

19

39

TDBXフレームワーク• ドライバフレームワークは完全にDelphiだけで記述されている• ポインタ(Pointer)型ではなく、強く型付けされたデータ型によるアクセス• TDBXドライバフレームワークは単一ソースである。
単一のソースコードにより、ネイティブなdcc32コンパイラと マネージドdccilコンパイラによるコンパイルが可能• TDBXのドライバ、コネクション、コマンド、リーダーなどは、抽象基本クラスを使用している• 例外ベースのエラー処理

40

TDBX と Delphi for Win32• 既存のDBXアプリケーショ
ンは、最小限の変更で動作する• UNICODEのサポート• ソースコードが付属• 100% Delphiで記述• DBXドライバの仕様をサードパーティーベンダーに公開

20

41

42

互換性
• dbExpressを使用しているほとんどのVCLアプ
リケーションは、変更せずにコンパイル&実行ができる• デュアルインターフェースを実装したドライバ• ドライバアダプター• パッケージの利用• ユニットのインターフェースの互換性• MySQL用の新しいDBXドライバ

21

43

DBX4のUNICODEサポート• InterBase 2007
• Oracle 10g• SQL Server 2000/2005• MySQL 4.1/5.0

TntWare Delphi Controls のTntDBGridコンポーネント
http://www.tntware.com/delphicontrols/unicode/44

デリゲートドライバ• TDBXTrace– フレームワークレベルのトレース機能– フレームワークの利用状況を示すDelphiコードを出力する• TDBXPool– コネクションプール機能• デリゲートドライバのチェイン(連結)

22

45

新しいビルドエンジンの概観•

プロジェクトファイルの変更– .bdsproj から .dproj へ•••••

MSBuildがベース
ビルドを記述するための完全にオープンで一般的なXML ファイル形式
カスタマイズと拡張が可能
開発者は(タスクやロガーの)マネージドコードを記述することによりビルドの拡張が可能
拡張された Delphi 2007 for Win32のビルドは、マルチプロダクトおよびマルチプラットフォームを同時にサポート

46

新しいビルドエンジンは• プロジェクト(ビルド)設定を複数持てる– リリース用, デバッグ用 など• ビルド処理の前後のイベントで、コマンドを実行できる

23

47

Vistaに対応する

48

Delphi – 行うこと…
• アプリケーションをテストする – 問題を確認する• アプリケーションを、標準ユーザー／管理者／その複合形態で検証する• アプリケーションマニフェストを追加する• 機能を再設計– ユーザーアプリは、正しい場所にデータを書き込むべき– 管理者の機能は、別の実行ファイルに分離する• ユーザーインターフェースの再設計– ボタンに「Shield」アイコンを追加する• インストーラの再設計• 繰り返しテストする• 必要があればアプリケーションに署名する (Authenticode)

24

49

「Standard User Analyzer」ツールを使ってテストする• SUAは、アプリケーション内で行っている問題のある処理を発見するのに役立つ50

アプリケーションマニフェスト
マニフェストファイルの例

25

51

RCファイルをRESファイルにコンパイル

52

Requested Execution Level• XPManユニットへの参照をすべて削除する• 別のレベルを指定した独自のマニフェストを使用する

26

53

<requestedExecutionLevel /> の説明• level=”asInvoker”– プロセスを作成するユーザーと同じトークンを使用してプロセスを起動する• level=”highestAvailable”– 管理者は、昇格への同意を求められる。しかし、もしユーザーに管理者権限が無い場合は、標準ユーザーとして起動される• level=”requireAdministrator”– 管理者は、昇格への同意を求められる– 標準ユーザーは、「管理者への昇格」のためのログイン・ダイアログが表示される– 管理者権限で起動する

54

Windows XP での注意！
• 不正なフォーマットのマニフェストは、Windows XP上で「ブルースクリーン」を引き起こすことがある• KB921337 を参照してください– http://support.microsoft.com/kb/921337

27

55

再設計
• ファイルやレジストリキーは、書き込みフラグ付きでオープンしない• データやログファイルは、 SHGetFolderPath関数を使用して正しい場所に保存する– CSIDL_PERSONAL { My Documents }– CSIDL_APPDATA { Application Data, new for NT4 }– CSIDL_LOCAL_APPDATA { non roaming, user¥Local
Settings¥Application Data }– CSIDL_COMMON_APPDATA { All Users¥Application Data }– CSIDL_MYPICTURES { My Pictures, new for Win2K }– CSIDL_COMMON_DOCUMENTS { All Users¥Documents }– …

56

SHGetFolderPath関数の利用

28

57

RunAsAdminの実装• 別プロセスを「プロンプト」付きで起動する• 「lpVerb」に「runas」を使用する• ShellExecuteEx関数に渡す親ウィンドウハンドルで、「プロンプト(elevation)」の表示場所が変わる

58

RunAsAdminの実装

29

59

「Shield」 SetElevationRequiredState関数の実装例• ボタンコントロールをパラメータに渡して呼び出すと、「Shield」アイコンが追加／削除される• BCM_SETSHIELDメッセージまたは、Button_SetElevationRequiredStateマクロを使用

60

Authenticodeを使って署名する
••
•
•
•

それほど重大ではない感じのプロンプトが表示される
http://winqual.microsoft.com/ にて登録する証明書を購入する (ベリサイン社などから)実行ファイルに署名する (Makecert.exe と Signtool.exe)
クラッシュした際のログ情報にアクセスするために、アプリケーションを「winqual」に登録する

30

61

Thank you31