我已经开发了自定义身份验证包,我想将其用于交互式登录。它在
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登不上去
文档中并没有说profile buffer可以设置为
NULL
,看来确实是强制性的。 OP 报告分配和返回配置文件缓冲区(仅一个字节就足够了)解决了这个问题。 [附录:请参阅下面 Nehluxhes 的评论,他报告缓冲区需要包含有效数据。]
尝试检索
SeInteractiveLogonRight
的 LUID 时的错误不相关;用户的登录权限不需要包含在 TOKEN_PRIVILEGES
结构中,因此不需要 LUID,并且如文档所述,LookupPrivilegeValue
函数只接受权限:
LookupPrivilegeValue 函数仅支持在 Winnt.h 的 Defined Privileges 部分中指定的权限。
(请注意,
winnt.h
的相关部分仅包含SeXxxPrivilege的定义;SeXxxLogonRight的定义在ntsecapi.h
中。)