【问题标题】:Why does LogonUserW fail with error code 183 (ERROR_ALREADY_EXISTS)为什么 LogonUserW 失败并显示错误代码 183 (ERROR_ALREADY_EXISTS)
【发布时间】:2013-11-18 02:27:36
【问题描述】:

我在LogonUserW失败后立即调用GetLastError()检查了错误代码,它总是183,但我不知道为什么LogonUserW会以这样的值失败。搜了msdn,发现183(ERROR_ALREADY_EXISTS)的意思是“文件已经存在时无法创建文件”,那么LogonUserW会创建什么文件呢?

有人可以在这里解释一下吗?

if (LogonUserW(uniUserName, uniDomainName, uniPassword, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &token))
{
//do something when success
}
else
{
    STI_LOG(LOG_AUTH_DETAILS, ("Login fail\n"), true);
    DWORD ec = GetLastError();
    String message;
    switch (ec)
    {
        case ERROR_PRIVILEGE_NOT_HELD:
            message = "Error Privilege not held\n";
            break;
        case ERROR_LOGON_FAILURE:
            message = "Error Logon Failure\n";
            break;
        //...
        default:
            message = "Other errors\n";
    }
    STI_LOG(LOG_ERROR, ("Fail to log in user: %d-%s\n", ec, message.getCString()), true);
}

【问题讨论】:

  • 你能告诉我们你正在使用的代码吗?
  • 上面这段代码我加了,很简单。
  • 可能返回的令牌仍在使用中。 (我没有看到 CloseHandle)

标签: c++ windows security winapi authentication


【解决方案1】:

在调用GetLastError 之前,您正在此宏中执行一些日志记录代码:

STI_LOG(LOG_AUTH_DETAILS, ("Login fail\n"), true);

很可能此日志记录函数中的一个 API 调用也设置了最后一个错误标志。当然,像“文件已存在”这样的错误与日志记录功能相比,与登录更一致。

所以,首先你应该在函数调用失败后立即调用GetLastError

if (LogonUserW(uniUserName, uniDomainName, 
        uniPassword, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &token))
{
    //do something when success
}
else
{
    DWORD ec = GetLastError();

    STI_LOG(LOG_AUTH_DETAILS, ("Login fail\n"), true);

    // ... etc. ...
}

正如says on MSDN:

进行此更改后,查看GetLastError 的返回码是否更符合您的预期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多