自定义 Windows 身份验证包登录失败

问题描述 投票:0回答:1

我已经开发了自定义身份验证包,我想将其用于交互式登录。它在

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登不上去

c++ winapi windows-authentication winlogon local-security-authority
1个回答
0
投票

文档中并没有说profile buffer可以设置为

NULL
,看来确实是强制性的。 OP 报告分配和返回配置文件缓冲区(仅一个字节就足够了)解决了这个问题。 [附录:请参阅下面 Nehluxhes 的评论,他报告缓冲区需要包含有效数据。]

尝试检索

SeInteractiveLogonRight
的 LUID 时的错误不相关;用户的登录权限不需要包含在
TOKEN_PRIVILEGES
结构中,因此不需要 LUID,并且如文档所述,
LookupPrivilegeValue
函数只接受权限:

LookupPrivilegeValue 函数仅支持在 Winnt.h 的 Defined Privileges 部分中指定的权限。

(请注意,

winnt.h
的相关部分仅包含SeXxxPrivilege的定义;SeXxxLogonRight的定义在
ntsecapi.h
中。)

© www.soinside.com 2019 - 2024. All rights reserved.