CredentialProvider の Unicode 化

Microsoft が提供する Credential Provider のサンプルは、なぜか文字セットが Unicode ではなく ANSI になっています。

ICredentialProviderCredential インターフェースで扱う文字列は Unicode(WCHAR) であるため、プロジェクトの文字コードを Unicode に統一しておいたほうが、文字列を扱いやすくなります。

そこで、今回は SampleCredentialProvider を例に文字セットを変更する方法を説明します。

プロジェクトの設定

  1. メニューから [プロジェクト]->[プロパティ] の順に選択します。[ソリューション エクスプローラ] で右クリックして [プロパティ] を選択しても同じです。
  2. [プロパティ ページダイアログ] の左上 [構成] で Debug と Release のどちらの設定を行うか選びます。両方変更する場合は [すべての構成] を選びます。
  3. 左側のツリーで [構成プロパティ]->[全般] を選択します。
  4. 文字セットとして [Unicode 文字セットを使用する] を選択します。
    プロパティ ページダイアログ

helpers.cpp の修正

このままビルドすると、次のように2つのエラーが発生してしまいます。

2つのエラー

エラーは helpers.cpp で発生しています。helpers.cpp には ICredentialProvider::SetSerialization() および ICredentialProviderCredential::GetSerialization() の中から利用される関数があります。

肝心のエラーの原因は LsaInitString 関数の第2引数の文字コード指定が正しくないからのようです。helpers.cpp を次のように修正すればビルドできるようになりました。

364行目 変更前:
HRESULT LsaInitString(PSTRING pszDestinationString, PCSTR pszSourceString)
364行目 変更後:
HRESULT LsaInitString(PSTRING pszDestinationString, PCTSTR pszSourceString)

この修正を行い、正しくログオンできることを確認しました。(※正常に動作することを保証するものではありません)

SampleCredentialProvider のビルド

CredentialProvider 開発のとっかかりとして、Microsoft が公開しているサンプル をビルド・実行して感触をつかむのがお薦めです。今回は、サンプルをビルドするための環境づくりについて簡単に説明いたします。

環境

Credential Provider の開発に必要なものは次の2つです。

  • Visual C++ 2005 (2003 は不可)
  • Windows SDK (Platform SDK ではなく Windows SDK)

VC++ 2003 でビルドできないのは、Windows SDK が VC++ 2005 以降のバージョンを必須としているためです。VC++ 2005 であれば、Express Edition でもビルドできることを確認しています。

VC++ 2005 と Windows SDK が準備できたら、インクルードとライブラリの設定をしておきましょう。

  1. Visual C++ を起動し、メニューから [ツール]->[オプション] を選びます。
  2. 左側のツリーで [プロジェクトおよびソリューション]->[VC++ ディレクトリ] を選択します。
  3. [プラットフォーム] は [Win32] を選択します。[ディレクトリを表示するプロジェクト] は [インクルード ファイル] を選択します。
  4. Windows SDK の Include ディレクトリを一番上に追加します。標準のインストール先は C:\Program Files\Microsoft SDKs\Windows\v6.0\Include です。
    ディレクトリの設定
  5. 同じように、ディレクトリを表示するプロジェクトとして [ライブラリ ファイル] として Windows SDK の Lib ディレクトリを一番上に追加します。標準のインストール先は C:\Program Files\Microsoft SDKs\Windows\v6.0\Lib です。

ビルド

環境が整ったところで Microsoft が公開しているサンプル をビルドします。5つのサンプルがありますが、一番分かりやすい SampleCredentialProvider をビルドしてみましょう。

SampleCredentialProvider.sln を VC++ 2005 で開き、メニューから [ビルド]->[バッチビルド] を選びます。あらかじめ4つのビルド方法が定義されていますが、今回は [Release|Win32] をチェックして [ビルド] ボタンを押します。

バッチビルド

ビルドが成功すると、下の [出力] に [1 正常終了、0 失敗] と表示され、Release フォルダに SampleCredentialProvider.dll が生成されています。

ビルド完了

導入

SampleCredentialProvider.dll を Vista の system32 にコピーします。次に、SampleCredentialProvider\Register.reg ファイルを Vista で実行して、必要なレジストリを設定します。

以上で導入は終わりです。Vista でログオフしてみると、次のように Administrator と Guest という2つのアイコンが表示されます。Administrator アカウントが存在すれば、実際にこのアイコンをクリックしてログオンすることもできます。

SampleCredentialProvider インストール

サンプル中の "Windows Vista Credential Provider Samples Overview UPDATE.doc" が大変よくまとまっているので、このドキュメントを参考にしながら開発を進めていくとよいでしょう。このブログでも引き続き、CredentialProvider について説明していく予定です。

Vista で GINA は使えない

Windows 2000, Windows XP では認証のカスタマイズを行う際に、GINA(Graphical Identification and Authentication) と呼ばれる認証ライブラリを拡張するケースが多くみられました。

有名なところでは、指紋認証デバイスつきの IBM のノートパソコンは GINA をカスタマイズしています。他にも、生体認証やシングルサインオン製品では、GINA を拡張しています。

ところが、Windows Vista では GINA が廃止されました。使わないことが推奨されているのではなく、使えないのです。

では、Vista ではどうやって認証拡張をすればよいかというと、 Credential Provider を開発することが推奨されています。

このブログでは、これから Credential Provider を開発するための手法について解説していきたいと思います。ご期待ください。

2007-2009 CO-CONV,Corp

ブログ内に記載されている社名および製品名は各社の商標または登録商標です。