C++ LogonUser() API 在对具有错误域的帐户进行身份验证时速度很慢
C++ LogonUser() API is slow when authenticating accounts with bad domains
我使用以下代码:
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;
}
相关文章:
- LibGit2 SSH身份验证失败
- 为什么 WinInet 在通过 FQDN 连接时无法通过协商自动进行身份验证,但如果通过 IP 连接则成功?
- 如何通过NetHTTPClient在HTTPS中进行身份验证
- 处理身份验证弹出窗口在wxWebView
- 如何测试我的谷歌身份验证器实现?
- 通过 Boost 和 C++ 进行 SMTP 身份验证
- libtorrent是否支持带摘要身份验证的http web种子
- 将Windows身份验证与cpprestsdk一起使用
- OCCI:使用SSL钱包身份验证连接到OracleDB
- 为什么我不能使用外围设备进行身份验证
- 无法使用C++代码向MongoDB进行身份验证
- 模拟的 HTTP 身份验证仅在本地主机上工作
- 使用OpenSSL的SHA 512 HMAC消息身份验证的问题
- Windows 套接字和身份验证构建在包含 Poco-Library 时失败
- 如何对进程进行身份验证
- 如何使用GSOAP初始化服务器上下文以启用简单身份验证(仅服务器身份验证)
- 解析 HTTP 的摘要式身份验证的正确正则表达式模式是什么?
- 在 SSH 上的公钥-私钥身份验证上的 libcurl 实现
- 使用 WinInet 的客户端身份验证(证书 + 私钥)
- C++ LogonUser() API 在对具有错误域的帐户进行身份验证时速度很慢