Delphi 为什么LogonUser函数总是使用LOGON32\u LOGON\u网络模式返回true?

Delphi 为什么LogonUser函数总是使用LOGON32\u LOGON\u网络模式返回true?,delphi,winapi,Delphi,Winapi,我需要在我的服务器应用程序上使用WinApi函数,但无论用户和密码是否匹配或存在,此函数始终返回true。仅当传递给函数的模式为LOGON32\u LOGON\u NETWORK {$APPTYPE CONSOLE} uses SysUtils, Windows; var hUser : THandle; res : Boolean; begin try res := LogonUser(LPWSTR('user'),

我需要在我的服务器应用程序上使用WinApi函数,但无论用户和密码是否匹配或存在,此函数始终返回true。仅当传递给函数的模式为
LOGON32\u LOGON\u 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\u LOGON\u INTERACTIVE
,则该函数工作正常(根据传递的用户和密码返回true或false)

注意:我使用的是LOGON32\u LOGON\u网络登录类型,因为文档中说哪种是最快的

为什么LogonUser函数总是使用LOGON32\u LOGON\u网络模式返回true

更新

该问题发生在Windows 7 64位Ultimate中


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

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

检查下一张图片(西班牙语为Invitado=Guest)

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


在LogonUser调用之后GetLastError()是否返回任何有趣的内容?GetLastError始终返回0。对我来说很好。Windows7 64位,Delphi2009。但这并不能告诉你太多,因为我们的配置可能完全不同。听起来你好像把这些凭证缓存在某个地方。我也在使用XE4和Windows 7 64位。我刚刚在另一台机器上用Win 7 32位进行了测试,效果很好。