为什么LogonUser函数总是使用LOGON32_LOGON_NETWORK模式返回true?

时间:2013-07-22 17:58:34

标签: delphi winapi

我需要在服务器应用程序上使用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代替,则该功能正常工作(根据传递的用户和密码返回true或false)。

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

为什么LogonUser函数总是使用LOGON32_LOGON_NETWORK模式返回true?

更新

问题出现在Windows 7 64位Ultimate

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

1 个答案:

答案 0 :(得分:7)

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

检查下一张图片(Invitado =西班牙语的客人)

enter image description here

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

enter image description here