我需要在服务器应用程序上使用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位专业工作正常。
答案 0 :(得分:7)
我可以重现您的问题,它似乎与来宾帐户和安全政策有关。
首先,当您使用LogonUser
函数时,会生成新的事件安全性。您可以检查该窗口中记录的用户帐户。
检查下一张图片(Invitado =西班牙语的客人)
因此,在这种情况下,无论您使用哪个用户,来宾用户都会用于登录。您可以修复此行为,修改本地安全策略,禁用来宾帐户状态。