Я разработал собственный пакет аутентификации, который хотел бы использовать для интерактивного входа в систему. Он создает токен доступа в функции 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 не может войти в систему.
NULL
, поэтому я бы рекомендовал создать буфер, как описано в документации. Дайте ему разумный размер, скажем 32 байта, и заполните его нулями. Как только вы все заработаете, вы можете снова поэкспериментировать. - person Harry Johnston   schedule 28.10.2015