1

我開發了自定義身份驗證包,我想用於交互式登錄。它在LsaApUserLogon函數中創建訪問令牌。自定義Windows身份驗證包登錄失敗

當我從應用程序調用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無法登錄。

+0

雖然權利和特權通常是可以互換的,我相信這是案例之一,他們不是。權限不會添加到用戶的令牌中,因此推測在TOKEN_PRIVILEGES結構中不需要。我可以確認(如文檔所述)LookupPrivilegeValue不適用於SeInteractiveLogonRight。據推測,LsaApLogonUser預計會驗證用戶的登錄權限。 –

+0

至於配置文件緩衝區,文檔沒有說你可以將它設置爲NULL,所以我建議創建一個緩衝區。給它一個合理的大小,比如32個字節,並填充零。一旦你有所有的工作,你可以再次嘗試。 –

+0

@哈里約翰斯頓,謝謝,我已經解決了我的問題。 配置文件緩衝區必須以最小大小(1字節)進行分配。 –

回答

0

該文檔沒有說配置文件緩衝區可以設置爲NULL,它似乎確實是強制性的。 OP報告說,分配和返回配置文件緩衝區(僅有一個字節就足夠了)解決了這個問題。

嘗試檢索SeInteractiveLogonRight的LUID時出錯不相關;用戶的登錄權限無需被列入TOKEN_PRIVILEGES結構,所以不需要LUID,並作爲記錄的LookupPrivilegeValue功能只接受特權:

的LookupPrivilegeValue功能僅支持在定義的特權規定的特權Winnt.h的部分。

(請注意,winnt.h相關部分僅包含SeXxxPrivilege定義;對於SeXxxLogonRight是ntsecapi.h定義)