EternalWindows
GINA / GINAの位置づけ

ユーザーが対話的にWindowsを使用する場合、 システムはそのユーザーが本当にWindowsを使用してもよいかを確認するために、認証を行わなければなりません。 既定では、この認証方式はユーザー名とパスワードの入力をベースにしたものですが、 場合によってはこれを変更したいことがあるかもしれません。 たとえば、スマートカードによる認証や、 ユーザーの音声や指紋を基にした認証を使用すれば、 より効率的で素早い認証が可能になります。 こうした独自の認証方法を実現する技術として、 Windows 2000/XP環境下ではGINAと呼ばれる置き換え可能なDLLが存在します。 GINAとは、Graphical Identification aNd Authenticationの略で、 その名の通りグラフィカルな対話と認証をサポートします。 GINAはWindows Vistaで廃止された技術であるため、 Windows Vista以降の環境ではCredential Providerという新しい技術を使用するようにしてください。

GINAの正体がDLLであるということは、それをロードするプロセスが存在しなければなりませんが、 これはシステムプロセスの1つであるWinlogonの役割になります。 Winlogonは、ユーザーをログオンさせるべきタイミングになるとGINAがエクスポートする適切な関数を呼び出し、 GINAはユーザーと対話できる機能を表示してユーザーを認証します。 一般に私たちが見かけるログオンダイアログボックスは、 c:WINDOWS\system32フォルダに存在するmsgina.dllが表示しているもので、 WinlogonはレジストリにGINAが登録されていない場合、このDLLをデフォルトのGINAとしてロードします。 このため、独自のGINAを開発してそれをレジストリに登録すれば、デフォルトでない独自の認証機能を表示できることになります。 GINAがシステムプロセスにロードされるという関係上、 GINAのコードや登録には絶対に誤りがあってはいけません。 もし、そのような誤りがある場合はシステムが強制終了してしまうことになり、 最悪の場合、システムの再インストールを余儀なくされることもあるでしょう。 当然ながら、このような事態を防ぐ対策もある程度は存在するのですが、 念のためデータのバックアップは行っておいてください。

Winlogonは多くのセキュリティ操作に対して対応するGINAの関数を呼び出しますが、 それら全てをGINAが処理する必要はありません。 ここでいう処理をしないとは、関数をエクスポートしないということで、 そのようなときはWinlogonがデフォルトの処理を行います。 しかし、GINAはユーザーとのセキュアな対話や認証を担当していますから、 それに関わる関数は処理しないとユーザーがログオンできないことになってしまいます。 GINAがエクスポートする関数はいくつかのバージョンに分かれていますが、 このうちバージョン1.0の関数は必ずエクスポートしなければならないとされています。

ver1.0の関数
WlxNegotiate GINAがエクスポートする関数の中で最初に呼ばれる。
WlxInitialize WlxNegotiateの後に呼ばれる。
WlxDisplaySASNotice WlxInitializeの後に呼ばれる。
WlxLoggedOutSAS WlxDisplaySASNoticeでSASが入力されると呼ばれる。
WlxActivateUserShell WlxLoggedOutSASの後に呼ばれる。
WlxLoggedOnSAS ユーザーがログオンしているときにSASが入力されると呼ばれる。
WlxDisplayLockedNotice ディスプレイがロックされたときに呼ばれる
WlxWkstaLockedSAS ロックを解除するためにSASを入力したときに呼ばれる
WlxIsLockOk LockWorkStationを呼び出したときに呼ばれる。
WlxIsLogoffOk ExitWindows(Ex)を呼び出したときに呼ばれる。
WlxLogoff ユーザーがログオフしたときに呼ばれる。
WlxShutdown シャットダウンする前に呼ばれる。
ver1.1の関数(Windows NT 4.0以降)
WlxScreenSaverNotify スクリーンセーバーが起動されようとしているときに呼ばれる。
WlxStartApplication シェルアプリケーションが異常終了したときに呼ばれる。
ver1.3の関数(Windows 2000以降)
WlxNetworkProviderLoad 呼ばれない。
WlxDisplayStatusMessage 「設定を保存しています」などのメッセージが表示されるときに呼ばれる。
WlxGetStatusMessage ---
WlxRemoveStatusMessage メッセージを表示する必要がなくなったときに呼ばれる
ver1.4の関数(WindowsXP)
WlxGetConsoleSwitchCredentials テンポラリセッションの資格情報をコンソールセッションに渡すために呼ばれる。
WlxReconnectNotify セッションに再接続したときに呼ばれる。
WlxDisconnectNotify WTSDisconnectSessionなどでセッションを切断したときに呼ばれる。

見て分かるようにGINAがエクスポートできる関数は大変多いですが、 基本的にはエクスポートが必須なver1.0のみを実装するだけでよいと思われます。 これ以降のバージョンの関数はWindowsのバージョンによっては呼ばれないこともあり、 さらに認証にそれほど関わるという関数でもないということから、 意味のある実装をするのはかえって難しかったりするからです。 なお、GINAのver1.2ではエクスポート関数は追加されていません。

GINAがエクスポートする関数は全てWlxというプレフィックスが付きますが、 Wlxというプレフィックスだけでその関数をエクスポートすべきと判断してはいけません。 GINAはその内部でWinlogonが公開している関数を呼ぶことになりますが、 それらの関数にもWlxというプレフィックスが付いているからです。 このため、リファレンスなどでWlxから始まる関数を見つけた場合は、 それがエクスポートする関数なのかWinlogonの関数なのかを確認するようにしてください。


戻る