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

Sal*_*dor 10 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.
Run Code Online (Sandbox Code Playgroud)

如果我使用LOGON32_LOGON_INTERACTIVE,则该函数正常工作(根据传递的用户和密码返回true或false).

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

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

UPDATE

问题出现在Windows 7 64位Ultimate中

在Windows 7 32位专业工作正常.

RRU*_*RUZ 7

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

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

在此输入图像描述

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

在此输入图像描述