Ошибка входа в пользовательский пакет проверки подлинности Windows

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

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

Когда я выбираю свои учетные данные и пытаюсь войти в систему, они попадают в LsaApLogonUser API моего пакета аутентификации. Если я проверю файл журнала, 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 не может войти в систему.


person Jasim Uddin    schedule 27.10.2015    source источник
comment
Хотя права и привилегии обычно взаимозаменяемы, я считаю, что это один из тех случаев, когда это не так. Права не добавляются к токену пользователя, поэтому предположительно не нужны в структуре TOKEN_PRIVILEGES. Я могу подтвердить, что (как указано в документации) LookupPrivilegeValue не работает для SeInteractiveLogonRight. Предположительно, вместо этого ожидается, что LsaApLogonUser проверит право пользователя на вход в систему.   -  person Harry Johnston    schedule 28.10.2015
comment
Что касается буфера профиля, в документации не говорится, что вы можете установить его на NULL, поэтому я бы рекомендовал создать буфер, как описано в документации. Дайте ему разумный размер, скажем 32 байта, и заполните его нулями. Как только вы все заработаете, вы можете снова поэкспериментировать.   -  person Harry Johnston    schedule 28.10.2015
comment
@HarryJohnston, спасибо, я решил свою проблему. буфер профиля должен быть выделен минимального размера (1 байт).   -  person Jasim Uddin    schedule 29.10.2015


Ответы (1)


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

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

Функция LookupPrivilegeValue поддерживает только привилегии, указанные в разделе «Определенные привилегии» файла Winnt.h.

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

person Harry Johnston    schedule 29.10.2015