【问题标题】:Why the LogonUser function always return true using the LOGON32_LOGON_NETWORK mode?为什么 LogonUser 函数使用 LOGON32_LOGON_NETWORK 模式总是返回 true?
【发布时间】:2013-07-21 13:56:16
【问题描述】:

我需要在我的 Server 应用程序上使用LogonUser WinApi 函数,但无论用户和密码是否匹配或存在,此函数始终返回 true。这只发生在传递给函数的模式是LOGON32_LOGON_NETWORK

{$APPTYPE CONSOLE}


uses
  SysUtils,
  Windows;
var
  hUser : THandle;
  res   : Boolean;
begin
    try
      res := LogonUser(LPWSTR('user'),
                              LPWSTR(nil),
                              LPWSTR('password'),
                              LOGON32_LOGON_NETWORK,
                              LOGON32_PROVIDER_DEFAULT,
                              hUser);


    finally
      if hUser>0 then
      CloseHandle(hUser);
    end;
    Writeln(BoolToStr(res, true));
    readln;
end.

如果我改用LOGON32_LOGON_INTERACTIVE,该函数可以正常工作(根据传递的用户和密码返回真或假)。

注意:我使用的是 LOGON32_LOGON_NETWORK 登录类型,因为文档说明哪种登录类型最快。

为什么LogonUser函数在LOGON32_LOGON_NETWORK模式下总是返回true?

更新

此问题出现在 Windows 7 64 位 Ultimate 中

在 Windows 7 32 位专业版中工作正常。

【问题讨论】:

  • 在 LogonUser 调用之后 GetLastError() 是否返回任何有趣的东西?
  • GetLastError 总是返回 0。
  • 对我来说很好。 Windows 7 64 位,Delphi 2009。但它并不能告诉你太多,因为我们的配置可能完全不同。听起来您将这些凭据缓存在某处。
  • 我也在使用 XE4 和 Windows 7 64 位。
  • 我刚刚在另一台装有 Win 7 32 位的机器上进行了测试,并且工作正常。

标签: delphi winapi


【解决方案1】:

我可以重现您的问题,它似乎与访客帐户和安全策略有关。 首先,当您使用LogonUser 函数时,会生成一个新的事件安全性。您可以检查在该窗口中登录的用户帐户。

查看下一张图片(Invitado=Guest in spanish)

所以在这种情况下,无论您使用哪个用户,guest 用户 都用于登录。您可以通过修改本地安全策略、禁用访客帐户状态来修复此行为。

【讨论】:

    猜你喜欢
    • 2010-12-02
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 2012-04-03
    • 2021-09-11
    相关资源
    最近更新 更多