Windows 10 における Credential Provider について
こんにちは、Platform SDK (Windows SDK) サポートチームです。
今回は、Windows 10 における、Credential Provider の仕様変更、および不具合についてお知らせします。
Credential Provider については、Windows 10 で大きな変更がありました。
以下のドキュメントに Windows 10 の Credential Provider に関するホワイト ペーパーが公開されています。
Windows 10 における Credential Provider の実装についてのアップデートが記載されていますので、まずはご参照ください。
Credential Provider driven Windows Logon Experience
<https://go.microsoft.com/fwlink/?LinkId=717287>
上記ホワイト ペーパーに記載のある内容も含め、よくお問い合わせいただく内容について、仕様変更 2 点、不具合 3 点の詳細を、以下にご案内します。
仕様変更について
まずは、以下の 2 点の仕様変更についてお伝えします。
- ICredentialProvider::SetUsageScenario にて渡される CREDENTIAL_PROVIDER_USAGE_SCENARIO のパラメーターが異なる
- Credential Provider の画面が明滅する
1. ICredentialProvider::SetUsageScenario にて渡される CREDENTIAL_PROVIDER_USAGE_SCENARIO のパラメーターが異なる
現象
Windows 8.1 までは、ロック解除時は、"CPUS_UNLOCKWORKSTATION" が引数として渡されていましたが、Windows 10 では、"CPUS_LOGON" が報告されます。
原因
Windows 10 では、CPUS_LOGON と CPUS_UNLOCK_WORKSTATION のユーザーシナリオが統合されました。
本仕様変更の影響により、Windows 10 では、ロック解除時も "CPUS_LOGON" が格納されます。
本動作は、ホワイト ペーパーおよび、以下の MSDN ドキュメント上の記載が更新されましたが、記載がありますとおり、Windows 10 における仕様です。
CREDENTIAL_PROVIDER_USAGE_SCENARIO enumeration
<https://msdn.microsoft.com/en-us/library/windows/desktop/bb762493(v=vs.85).aspx>
対処方法
- WTSQuerySessionInformation API 等を利用することにより、Windows 8.1 時の動作をカバーすることを推奨しております。
<例>
WTSQuerySessionInformation API の使用
以下のように実装することにより、現在のセッションについての情報を確認することができ、WTSActive(0x00) が報告される場合には、ロックのシナリオ、WTSConnected(0x01) が報告される場合には、ログオンのシナリオが該当します。
呼び出し例:
::WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, WTSConnectState, &ppBuffer, &ret);
また、上記の仕様変更動作につきましては、以下の条件のいずれかに該当する場合 Windows 8.1 に近い動作をいたします。
- グループ ポリシーの設定
グループ ポリシーにて、下記設定を「有効」に設定することにより、Windows 8.1 までと同様に、ロック解除時に "CPUS_UNLOCK_WORKSTATICON" が返されるように変更することが可能です。
設定箇所:
場所:[コンピュータの構成] - [管理用テンプレート] - [システム] - [ログオン]
項目:ユーザーの簡易切り替えのエントリ ポイントを非表示にする
設定箇所:
場所:[コンピュータの構成] - [Windows の設定] - [セキュリティの設定] - [ローカルポリシー] – [セキュリティオプション]
項目:対話型ログオン: 最後のユーザー名を表示しない
2. Credential Provider の画面が明滅する
現象
Credential Provider のメイン スレッドをブロックする実装となっている場合、スリープからの復帰後、ロックスクリーン解除のタイミングで、Credential Provider の画面が明滅します。
原因
Windows 10 にて実施された Credential Provider とロックスクリーンの内部処理に仕様変更に伴いログオンを実施するプロセス間の整合性が取れない状況が生じますと、画面が明滅する事象が発生しますが、仕様動作となります。
本現象の原因は、Credential Provider のメイン スレッドを OS 側に処理を返さず、ブロックする実装となっている場合となります。しかしながら、OS 側は、Credential Provider のインタフェースから戻りにブロックされることを想定しておらず、非推奨の実装となるためです。
対処方法
アプリケーション側にて、Credential Provider スレッド上で UI 操作や、長時間となる処理を実行しないように、変更してください。
不具合について
次に以下の不具合 3 点を紹介します。
- ログオン画面のエラー メッセージが消えない。
- Windows 10 バージョン 1511 で Credential Provider から表示されるウィンドウが表示されず、応答不能となる。
- コンボボックスに設定したアイテムを削除できない。
1. ログオン画面のエラー メッセージが消えない。
現象
ログオンに失敗したエラー が表示されているタイミングにて、CredentialsChanged メソッドを呼ぶと、エラー メッセージとCredential Provider のログオン画面が混在した状態で表示されてしまいます。
なお、Windows 8.1 以前の OS では、エラー メッセージが閉じられてからログオン画面が表示されます。
原因
Windows 10 における、ログオンに失敗した画面を非表示にしない不具合になります。
回避方法
本不具合は修正されています。
下記 Windows 10 RTM の累積アップデートを適用することにより、現象の回避が可能です。
Cumulative Update for Windows 10: March 8, 2016
<https://support.microsoft.com/en-us/kb/3140745>
2. Windows 10 バージョン 1511 で Credential Provider から表示されるはずのウィンドウが表示されず、応答不能となる。
現象
UAC による昇格時に、Credential Provider を利用してウィンドウを表示させる実装の場合、昇格時に利用されるデスクトップ上にウィンドウが表示されず、結果として操作ができない状態となります。
原因
Windows 10 November Update で発生します。
Credential Provider が動作する内部スレッドが起動したタイミングにて、SetThreadDesktop API の呼び出しにより、Credential Provider から表示されるウィンドウを、セキュア デスクトップ上から表示するための準備が行われます。
しかしながら、当該スレッドとセキュア デスクトップの関連付けを行う処理において、内部ロジックに問題があり、セキュアデスクトップに紐付けすることができないため、ウィンドウが表示されません。
回避方法
本不具合は修正されています。
下記 Windows 10 RTM の累積アップデートを適用することにより、現象の回避が可能です。
Cumulative update for Windows 10 Version 1511 and Windows Server 2016 Technical Preview 4: April 12, 2016
<https://support.microsoft.com/en-us/kb/3147458>
3. コンボ ボックスに設定したアイテムを削除できない。
現象
ICredentialProviderCredentialEvents::DeleteFieldComboBoxItem メソッドを実行しても dwItem で指定した Item が削除できません。
原因
Windows 10 における不具合になります。
回避方法
本不具合は修正されています。
下記 Windows 10 RTM の累積アップデートを適用することにより、現象の回避が可能です。
Cumulative update for Windows 10 Version 1511 and Windows Server 2016 Technical Preview 4: April 12, 2016
<https://support.microsoft.com/en-us/kb/3147458>