1

У меня был разработан специальный пакет проверки подлинности, который я хотел бы использовать для интерактивного входа в систему. Он создает токен доступа в функции LsaApUserLogon.Не удалось выполнить вход в систему Windows Authentication

Когда я вызываю LsaUserLogon из приложения, я могу перечислять новые пользовательские сеансы, но когда я использовал его для входа в систему (также я создал пользовательский поставщик учетных данных), я могу видеть в журнале событий Windows, что я был успешно зарегистрирован, а затем вышли из.

Когда я выбираю свои конкретные учетные данные и пытаюсь войти в систему, он входит в API LsaApLogonUser моего пакета аутентификации. Если я проверю файл журнала, LsaApLogonUser вернусь STATUS_SUCCESS. Но Windows не входит в систему. После ухода LsaAPLogonUser, LSA называет LsaApLogonTerminated API и обратно LogonUI.

Когда я подготовил TokenInformation, я получил LookupPrivilegeValueW не для SeInteractiveLogonRight. Я не знаю, важно ли это для входа в систему.

LsaApLogonUser(...){ 
    ...... 
    // NetUserGetInfo 

    // AllocateLocallyUniqueId (LogonId) 

    err = GetTokenInformationv2(pdi?pdi->DomainControllerName:NULL,wszDomain,wszUser,&LocalTokenInformation,LogonId); 

    err = g_pSec->CreateLogonSession(LogonId);  

    if(ProfileBuffer) 
    { 
     *ProfileBuffer=NULL; 
     *ProfileBufferLength=0; 
    } 

    (*TokenInformationType)=LsaTokenInformationV2; 
    (*TokenInformation)=LocalTokenInformation; 

    return STATUS_SUCCESS; 
} 

GetTokenInformationv2(...){ 
    .... 
    .... 
    // Call LsaEnumerateAccountRights 
    // check LookupPrivilegeValueW // It failed for "SeInteractiveLogonRight" 
    // 
    return STATUS_SUCCESS; 
} 

ProfileBuffer Важный для входа? Я не знаю, почему LSA не может войти в систему.

+0

Хотя права и привилегии, как правило, взаимозаменяемы, я считаю, что это один из тех случаев, когда они нет. Права не добавляются к токенам пользователя, поэтому, по-видимому, они не нужны в структуре TOKEN_PRIVILEGES. Я могу подтвердить, что (как задокументировано) LookupPrivilegeValue не работает для SeInteractiveLogonRight. Предположительно, ожидается, что LsaApLogonUser будет проверять право пользователя на вход в систему. –

+0

Что касается буфера профиля, в документации не говорится, что вы можете установить его в «NULL», поэтому я бы рекомендовал создать буфер, как задокументировано. Дайте ему разумный размер, скажем 32 байта, и заполните его нулями. Когда у вас все получится, вы можете поэкспериментировать с этим снова. –

+0

@HarryJohnston, спасибо, я решил свою проблему. буфер профиля должен быть выделен с минимальным размером (1 байт). –

ответ

0

В документации не указано, что буфер профиля может быть установлен на NULL, и кажется, что это действительно обязательно. OP сообщает, что выделение и возврат буфера профиля (достаточно одного байта) разрешило проблему.

Ошибка при попытке получить LUID для SeInteractiveLogonRight не имеет отношения к делу; права входа пользователя не должны быть включены в TOKEN_PRIVILEGES структуре, поэтому не требуется LUID, и как описано, функция LookupPrivilegeValue принимает только привилегии:

Функция LookupPrivilegeValue поддерживает только привилегию, указанную в Defined привилегий раздел Winnt.h.

(Обратите внимание, что соответствующий раздел winnt.h содержит только определения для SeXxxPrivilege;. Определения SeXxxLogonRight находятся в ntsecapi.h)