Я разработал специальный пакет аутентификации, который я хотел бы использовать для интерактивного входа в систему. Создает токен доступа в 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
и кажется, что это действительно обязательно. OP сообщает, что выделение и возврат буфера профиля (достаточно было одного байта) решило проблему.
Ошибка при попытке получить LUID для SeInteractiveLogonRight
не было актуально; права входа пользователя не должны быть включены в TOKEN_PRIVILEGES
структура, поэтому LUID не требуется, и, как задокументировано, LookupPrivilegeValue
Функция принимает только привилегии:
Функция LookupPrivilegeValue поддерживает только те привилегии, которые указаны в разделе «Определенные привилегии» Winnt.h.
(Обратите внимание, что соответствующий раздел winnt.h
содержит только определения для SeXxxPrivilege; определения для SeXxxLogonRight находятся в ntsecapi.h
.)
Других решений пока нет …