2011年1月14日金曜日

Windows 2000/XP と Windows Vista/7 はどこが違うのか?


弊社リビッグでは Windows 2000/XP 対応のUSBキーWindows認証ソフト MxLogon、そして、Vista/2008/7対応の MxLogon4Vista を自社開発してきました。その開発から Windowsの大きな変化が見えてきました。

Windows NT から Windows XP までログオン認証は GINA という方式で
カスタマイズ/拡張できました。Vistaからは GINA と非互換の Credential
Provider (CP) という方式が採用されています。



GINAの実体は WinLogonというプログラムから呼び出される関数を含むDLL です。名前の通りWinLogonがログオンに必要な共通処理を行います。WinLogonが大枠の処理をおこない、ユーザインターフェース表示や資格情報入力を受け付ける部分は GINA 関数が行うという仕組みです。

CPの実体も WinLogonから呼び出される DLL ですが、関数ではなくCOMコンポーネントを実装しています。大枠の処理を行うWinLogonが処理過程で COMインタフェースを呼び出します。ここまでは実装手段以外、GINAと大差はありません。大きく異なるのは CP にはユーザインターフェースを表示する必要はない(表示することはできない)という点です。ユーザインターフェースは WinLogonが表示します。 CP WinLogonにユーザインターフェース(UI)要素の種類や数を知らせて、データとしてUI要素を提供します。受け取ったWinLogon UI を表示します。これが可能なのは、UIの構成はWindows側で決めており、利用可能なUI要素が限定されているためです。GINAのような自由度はありません。

まとめ

-     拡張方法の標準化とコンポーネント機能の限定化
UIを標準化することにより、コンポーネント機能が限定されました。コンポーネントが処理を行える範囲が狭まったためシステム全体の安定性が高まります。

-     オブジェクト指向
OS はオブジェクトの集まりとなり、拡張コンポーネントもオブジェクトとなりました。

GINA DLLWinLogonによってOS起動時にメモリにロードされます。一度読み込まれると、そのままずっとロードされたままです。OS が起動している間、GINAでタイマー処理などをバックグランドで実行することができます。ハードウェアー処理も GINA で行えます。CAD( Ctrl+Alt+Delete ) キーが押されると、メモリー上のGINA内の関数が呼び出されます。 このようにGINAOSの一部として機能するため、開発が非常に面倒です。GINAを変更したら、どんな小さな変更であってもWindowsを再起動しなければなりません。また、GINAに不具合があるとシステム全体に影響します。Windowsが実行中に、GINAのエラーでシステムが停止することもあります。

一方、CPは WinLogonによって必要な時だけロードされ、使い終わったら解放されます。メモリーにずっととどまることはありません。CPはバックグランド処理を行えません。このため、システム全体に影響するような問題を起こすことはありません。開発もかなり楽になります。変更したらDLLを置き換えて、ログオフするだけでテストできます。

まとめ

―拡張コンポーネントの局所化
  システム全体に影響するようなコンポーネントの使い方をしません。コンポーネントのエラーによる不安定化が回避されます。


GINAは多くの機能を実装しなければなりません。例えば、Windows終了時にアップデートが存在するか確認するのはGINAの役目です。Windows標準のGINAの処理と同等の機能を実現するのは至難の業です。そこで、拡張GINA Windows標準GINAの機能を実装するためにGINAチェーンという手法を用います。 すべての GINA は同じ関数を持ちますので、GINA1Aという関数から GINA2Aという関数を呼び出すことが可能です。これが GINAチェーンです。例えば、拡張GINAの関数すべてが何もしないで、Windows標準GINA内の対応関数を呼び出せば、スタブGINA が完成します。GINAチェーンを用いる場合、拡張GINA作成の難しさは Windows標準GINAとどのように連携させるかという点です。独自の処理+連携を実現しなければなりません。しかし、“独自でWindows標準GINAの機能を実現するよりもまし“のため、その手法に頼らなければなりません。

CPは限定された機能だけを実装するだけです。共通処理はすべてWinLogon側がやってくれます。Windows標準CPと同等の機能を拡張CPで実現できます。そのため GINAチェーンのような手法は不要です。また、複数のCPを同時に利用できるような仕組みになっています。複数のCPが利用できるということは、それに関連した新しい機能があるということで、実際に他のCPを無効にしたり、有効にするにはといったGINAでは考慮する必要のなかった機能が必要です。

まとめ

-     整理された共通機能
Windows NTで導入されたログオン拡張方式のGINAにはいろいろな機能が求められていますが、複数のGINA間で共通処理がどれで、本当にGINAだけでやるべき処理はどれなのか、整理されていませんでした。CP方式では共通機能が整理され、CPには本当にCPだけで行うべき処理を行わせるようになっています。これにより不安定化の原因だったり、GINA開発を困難の原因だったGINAチェーンが不要になりました。


GINAOSが起動中ロードされつづけるため、バックグランド処理ができます。CPはバックグランド処理ができません。その部分はWindowsサービス として実装することになりますが、Vista/7ではWindowsサービスの実行のされ方が変わりました。 セッション 0 分離というもので、すべてのサービスがセッション 0 で動きます。 XPまではコンソールにログインした最初のセッション内でサービスが動いていました。ユーザプログラムとサービスが共存しているため、特権レベルで動作するWindowsサービスをユーザプログラムプログラムが狙うことができました。サービスを専用のセッションに分離することでセキュリティが高まります。
XPまでは Windowsサービスがユーザプログラムと同じセッションにあるため、UI を表示することができました(Fast User Switchでユーザ切り替えしたときは例外)Vista/7ではサービスが異なるセッションにあるため、ユーザセッションに UIを表示できません。 XPまでは Windowsサービスがユーザプログラムに入力を渡すことができましたが、Vista/7ではできません(同じセッションのユーザプログラム間のデータ受け渡しにも制限ができました)。セキュリティリスクを軽減するため、他のプログラムを操作することが難しくなっています。

Vista/7は複数のセッションをサポートするようになりました。XPまでは、ログインしたらセッションを他のセッションに切り替える仕組みがありませんでした( XPでは Fast User Switch が追加されましたが OS の基本設計レベルで想定されていたものではないはずです - サービスが異なるセッションで異なる動きをしていました)。 Vista/7では、複数のセッションが同時に存在できます。複数のセッションを利用するために、セッション間の行き来する機能が追加されています。

まとめ

-互換性よりセキュリティ、安定性を追求
 CPGINAと互換性はありません。サービスも大きく変わりました。Vista/7ではいままでのバージョンアップと比較して、おもいきったセキュリティ、安定性を追求した方針がとられているようです。NTからずっと互換性にこだわってきた Windows が、Linuxの安定性に迫るワークステーションに変貌したような気がします。

-     マルチユーザワークステーション
 シングルユーザだったWindowsが本当にマルチユーザワークステーションになりました。

Windows 7Vistaを洗練したもので、ほぼ同じ OS と考えられます。XPと比較するとVista は以上のような違いがあり、よく考えられた OS と弊社では見ていました。XPと比較してVistaは安定しており(不安定になる設計が見直されている)セキュリティも根本的な対応がとられているLinuxに近づいたマルチユーザワークステーションと思いましたが、一般的には、XPとの比較は、起動/ログインして使えるようになるまで時間やアプリケーションプログラムとの相性など表面的な部分での評判が悪く、厳しい評価を受けました。思い切った変更をしたOSであるため、弊社では表面的な部分は許容できると考えていました、一般的には厳しい評価が下されました。7はVistaで指摘された表面的な問題点を改善した Vistaで目指したOSの洗練されたものになっていると考えます。

Windowsの進化という面からみた最新 Windowsは以上のなったと考えます。Linuxとの比較では、取り巻く文化や思想が根本的に違いますので、まった別の視点から観察する必要がありますので、機会があったら投稿したいと思っています。

Windowsについて良い側面ばかりを書いていますが、マイクロソフトとは特別関係はありません。開発側からみた率直な意見だとお考えください。