Ошибка получения имени пользователя в данный момент заблокированного сеанса (учетная запись Microsoft и локальный) в Windows 10 Credential Provider

Я разрабатываю провайдер учетных данных Windows 10, который действует только в сценарии разблокировки (текущего пользователя, вошедшего в систему). Как описано Вот, начиная с Windows 10, пользовательские сценарии CPUS_LOGON и CPUS_UNLOCK_WORKSTATION были объединены. Поставщики учетных данных, которым необходимо перечислить текущего пользователя, вошедшего в систему, могут отслеживать текущего пользователя или использовать API-интерфейсы, такие как WTSQuerySessionInformation, для получения этой информации.

С помощью WTSQuerySessionInformation, Я могу получить имя пользователя, вошедшего в систему в данный момент (WTSUserName). При входе в систему системные вызовы ICredentialProviderSetUserArray :: SetUserArray во время инициализации пользовательского интерфейса входа в систему для получения набора пользователей для отображения в пользовательском интерфейсе. Пользователи провайдера учетных данных (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, хорошо:

    Имя пользователя: [email protected]

    Квалифицированное имя пользователя: MicrosoftAccount \ [email protected]

Имя пользователя, возвращаемое WTSQuerySessionInformation, усекается и не сообщает полный адрес электронной почты и, следовательно, не позволяет мне сравнивать другие имена пользователей при перечислении пользователей.

Любая идея, почему имя пользователя обрезается таким образом? Есть ли способ получить полное имя пользователя с помощью WTSQuerySessionInformation?
Это поведение было проверено на только что созданной учетной записи Microsoft.

0

Решение

Я решил эту проблему, сравнив SID, а не имя пользователя и домен. SID может быть получен с помощью LookupAccountName с именем пользователя и доменом заблокированного в данный момент пользователя (запросите WTSUserName и WTSDomainName с помощью WTSQuerySessionInformation). Этот пример кода от Microsoft было очень полезно.

Затем, просматривая пользователей провайдера учетных данных (в ICredentialProviderSetUserArray :: SetUserArray функция), я мог определить, какой из них в данный момент заблокирован. Спасибо @Swift, чтобы указать мне на решение.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]