2017-01-05 40 views
0

私は(現在ログインしているユーザーの)アンロックシナリオでのみ動作するWindows 10資格プロバイダを開発しています。前述のように、Windows 10からCPUS_LOGONとCPUS_UNLOCK_WORKSTATIONのユーザーシナリオが組み合わされています。hereに記載されています。システムにログインしている現在のユーザーを列挙する必要がある資格情報プロバイダーは、現在のユーザーを追跡したり、WTSQuerySessionInformationなどのAPIを利用してその情報を取得できます。Windows 10の資格情報プロバイダで現在ロックされているセッション(Microsoftアカウントとローカル)のユーザー名を取得する問題

WTSQuerySessionInformationを使用すると、現在ログインしているユーザー(WTSUserName)のユーザー名を取得できます。ログイン時に、システムはログインUIの初期化中にICredentialProviderSetUserArray::SetUserArrayを呼び出して、UIに表示する一連のユーザーを取得します。資格プロバイダのユーザ(ICredentialProviderUser)はICredentialProviderUserArrayインターフェイスから取得でき、ユーザごとに(文字列値PKEY_Identity_UserNameを照会することによって)ユーザ名を問い合せることができます。 WTSQuerySessionInformationのユーザー名とPKEY_Identity_UserNameが返したユーザー名を比較すると、現在ロックされているユーザーのうち最後のユーザーを知ることができます。 (PKEY_Identity_LogonStatusStringが「ロック」に設定されている複数のアカウントが存在する可能性があります)。

これは、Microsoftアカウントでサインインしていないローカルアカウントでうまく機能します。 Microsoftアカウントとしてサインインされたユーザーの場合、WTSQuerySessionInformationによって返されたユーザー名は、PKEY_Identity_UserNameで指定されたユーザー名とは異なります。

ユーザーが「[email protected]」とサインインした場合、次の不一致が発生します。 WTSQuerySessionInformationを使用して

  • 、私は現在ロックされたユーザのユーザ名として取得:

    ユーザー名:my_us

  • そしてPKEY_Identity_UserNameによって返さ1は十分にある。

    ユーザー名:my_user_microsoftする@ myemail。 com

    修飾されたユーザー名:MicrosoftAccount \ [email protected]

WTSQuerySessionInformationから返されたユーザー名は切り捨てられ、完全な電子メールアドレスは報告されないため、ユーザーを列挙しながら他のユーザー名と比較することはできません。

ユーザー名がこのように切り取られる理由は何ですか? WTSQuerySessionInformationを使用して完全なユーザー名を取得する方法はありますか? この動作は、新しく作成したMicrosoftアカウントでテストされています。

+1

ユーザー名の取得方法は?この問題は、状況やその機能の使い方に問題がある可能性があります。 WTS_CURRENT_SESSIONが矛盾する可能性があります。なぜSIDを使って比較しないのですか? – Swift

+0

@スワイプ:SIDを比較することができました。ありがとう!!ロックされたユーザーのSIDをユーザー名とドメインから取得する方法を回答しました。 – skuallpa

答えて

0

私はこの問題を、ユーザー名とドメインではなくSIDと比較して解決しました。 SIDは、現在ロックされているユーザーのユーザー名とドメイン(クエリWTSUserNameとWTSDomainNameはWTSQuerySessionInformation)を使用してLookupAccountNameを使用して取得できます。 MicrosoftのThis example codeは非常に役に立ちました。

その後、資格プロバイダのユーザー(ICredentialProviderSetUserArray::SetUserArrayの機能)をループしているうちに、現在ロックされているユーザーがどれかを検出できました。ありがとう@スウィフトは私のソリューションを指摘する。