C++ LogonUser() API 在对具有错误域的帐户进行身份验证时速度很慢

C++ LogonUser() API is slow when authenticating accounts with bad domains

本文关键字:身份验证 速度 LogonUser API 有错误 C++      更新时间:2023-10-16

我使用以下代码:

HANDLE token;
if (!LogonUser("LocalUser", "InvalidDomain", "Password", LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &token))
{
    unsigned long error = GetLastError();
}

当计算机位于域中,并且输入了无效的域时,可能需要很长时间才能对登录进行身份验证。 范围从 5 秒到 2/3 分钟不等。

有没有办法改进这一点?

这是一个老问题,几年前我也有同样的问题。作为一种解决方法,您可以使用 WaitForSingleObject。基本思想是启动一个将执行 LogonUser 的线程,并使主线程等待 n 毫秒,等待工作线程在完成后将设置的句柄。

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
HANDLE athEvent;
DWORD WINAPI ThreadAuth(LPVOID);
DWORD AUTHTIMEOUT = 5000;
int main(void)
{
    HANDLE hThread;
    DWORD dwEvent, dwThreadID;
    athEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadAuth, NULL,
        0, &dwThreadID); 
    // Wait for the thread to signal
    dwEvent = WaitForSingleObject(athEvent, AUTHTIMEOUT); //5 seconds timeout
    switch (dwEvent)
    {
        // athEvent was signaled
        case WAIT_OBJECT_0:
            printf("Authenticated");
            break;
        case WAIT_TIMEOUT:
            printf("Authenticate timeoutn");
            TerminateThread(hThread, 0);
            break;
        default:
            printf("Wait error: %dn", GetLastError());
            ExitProcess(0);
    }
    CloseHandle(athEvent);
    CloseHandle(hThread);
    return 0;
}
DWORD WINAPI ThreadAuth(LPVOID lpParam)
{
    UNREFERENCED_PARAMETER(lpParam);
    //## Insert your logon method here
    //LogonUser("LocalUser", "InvalidDomain", "Password", LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &token)
    Sleep(5000); //if >= AUTHTIMEOUT then the waitforsingleobject will expire
    //##
    //Signal the event so WaitForSingleObject is released
    SetEvent(athEvent);
    return 0;
}