10

我需要在我的服务器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 位专业版中工作正常。

4

1 回答 1

7

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

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

在此处输入图像描述

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

在此处输入图像描述

于 2013-07-22T19:04:59.560 回答