Hatena::ブログ(Diary)

きょうのできごころ@はてな RSSフィード

2009-11-29 Vista/Winows7のログイン画面カスタマイズ

[][][]Vista/Winows7のログイン画面カスタマイズ

指紋認証デバイス搭載のPCなどでは、指紋認証によるログオンを実現するために、よくメーカー独自のログイン画面が用意されている。

WindowsXPまでは、カスタムログイン画面を作成するためにはGINAという技術を使っていた。だが、Vista以降はCredential Provider(資格情報プロバイダ)というCOMコンポーネントを作成することになる。(ICredentialProviderを実装)


CredentialProviderの実装サンプルは、microsoftのサイトからダウンロードできる。

http://www.microsoft.com/downloads/details.aspx?FamilyID=B1B3CBD1-2D3A-4FAC-982F-289F4F4B9300&displaylang=en

また、以下には数少ない日本語の情報がある

Windows Vista 用の資格情報プロバイダを使用したカスタム ログイン機能の作成」

http://msdn.microsoft.com/ja-jp/magazine/cc163489.aspx


作成したコンポーネントを、レジストリに登録することで、カスタムログイン用のパネル(資格情報プロバイダ)が追加表示されるようになる。

ただし通常、セーフモードではデフォルトの資格情報プロバイダしか表示されない。


さて、指紋認証デバイスのように、「パスワード」「指紋認証デバイス」の「いずれか」で認証する場合は、サンプルにあるSampleCredentialProviderをベースに作成し、追加の資格情報プロバイダレジストリに追加すればよい。


しかし、セキュリティ向上のために、たとえば「パスワード」「スマートカード」の「両方」が揃わないと認証OKにしないような要件の場合は、既存のパスワード資格情報プロバイダをラップして機能拡張する必要がある。サンプルでは、SampleWrapExistingCredentialProviderというのが、既存のパスワード資格情報プロバイダを拡張するサンプルだ。


また、それだけでは既存のパスワード入力パネルも表示されてしまって意味がないので、既存の資格情報プロバイダを非表示にする必要がある。

そのためにはCredential Providerと同じ要領で、Credential Provider FilterというCOMコンポーネントを別途作成してレジストリに登録する必要がある(ICredentialProviderFilterを実装)。Filterとあるとおり、どの資格情報プロバイダを表示するかを制御できる。


ただし、Filterの実装がうまくできていないと全ての資格情報パネルが表示されなくなってしまってログイン不能になるので注意が必要だ。そのような場合、セーフモードでもログイン不能になってしまうようだ。

#私もFilterのテストを仮想環境で行っていたが、2回くらいログインできなくなってバックアップから書き戻す羽目になった。

cpcp 2011/05/23 20:19 CredentialProviderFilterの実装方法を勉強中ですが、サンプルなどなく困っています。
可能であればソースなど公開して頂けますか。
宜しくお願いします。

festiva1300festiva1300 2011/05/24 12:28 例えばデフォルトのPasswordCredentialProviderを隠す場合はこんな感じです。

HRESULT CSampleProviderFilter::Filter(CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus, DWORD
dwFlags, GUID* rgclsidProviders, BOOL* rgbAllow, DWORD cProviders) {
  switch (cpus) {
      case CPUS_LOGON:
      case CPUS_UNLOCK_WORKSTATION:
          for (int i = 0; i < cProviders; i++) {
        if (IsEqualGUID(rgclsidProviders[i], CLSID_PasswordCredentialProvider))
            rgbAllow[i] = FALSE;
            else
rgbAllow[i] = TRUE;
}
            return S_OK;
        case CPUS_CREDUI:
       case CPUS_CHANGE_PASSWORD:
            return E_NOTIMPL;
        default:
            return E_INVALIDARG;
    }
}

montanzzzmontanzzz 2011/05/24 12:55 サンプルどおりで実装できました。
勝手なご依頼にも関わらず有難うございます。
大変感謝しております。

fukuchanfukuchan 2014/07/04 09:07 パソコン教室で教師PCからブロードキャストでコマンドを送信して、生徒PC40台が一斉に指定されたアカウントでログオンさせたいのですが、既存の資格情報プロバイダだけを残して、カスタムログイン用のパネル(資格情報プロバイダ)を非表示にすることは可能でしょうか?

miyamiya 2014/07/10 19:54 認証画面からreturnキーイベント以外でログイン要求を行いたいけど、どうすればよいですか?
勉強不足で先に進めません。どうかよろしくお願いします。

miyamiya 2014/07/10 20:12 参考にしているサンプルは「credential provider v2」です。
ハードからのフラグをポーリングして、フラグが立ったときに
ログインしたいのですが、上手く行きません。
色々試しましたが、何を呼んでいいやら、かいもく検討がつかず
困っている次第です。
試しにreturnキーイベントを発生させるとログイン出来ましたが
これだとパスワードエリアにフォーカスが無いとダメでした。
何かいい方法があれば、よろしくお願いします。

miyamiya 2014/07/10 20:12 参考にしているサンプルは「credential provider v2」です。
ハードからのフラグをポーリングして、フラグが立ったときに
ログインしたいのですが、上手く行きません。
色々試しましたが、何を呼んでいいやら、かいもく検討がつかず
困っている次第です。
試しにreturnキーイベントを発生させるとログイン出来ましたが
これだとパスワードエリアにフォーカスが無いとダメでした。
何かいい方法があれば、よろしくお願いします。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/festiva1300/20091129/p1
リンク元