unit UserPro_Logon;interface uses Windows; function AdjustToken:Boolean; function PerformLogon(const User,Domain, Password: String;var ErrorCode:integer): Cardinal; function Logonwindows(const User, Password: String;Var ErrCode:Integer):Boolean;
implementationfunction AdjustToken:Boolean; var hdlProcessHandle : Cardinal; hdlTokenHandle : Cardinal; tmpLuid : Int64; tkpPrivilegeCount : Int64; tkp : TOKEN_PRIVILEGES; tkpNewButIgnored : TOKEN_PRIVILEGES; lBufferNeeded : Cardinal; Privilege : array[0..0] of _LUID_AND_ATTRIBUTES; hToken:THandle; begin hdlProcessHandle := GetCurrentProcess; {OpenProcessToken(hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), hdlTokenHandle); } //TOKEN_QUERY | TOKEN_ADJUST_DEFAULT | TOKEN_ADJUST_GROUPS | TOKEN_ADJUST_PRIVILEGES OpenProcessToken(hdlProcessHandle, (TOKEN_QUERY or TOKEN_ADJUST_DEFAULT or TOKEN_ADJUST_GROUPS or TOKEN_ADJUST_PRIVILEGES), hdlTokenHandle); LookupPrivilegeValue(nil, 'SeTcbPrivilege', tmpLuid); Privilege[0].Luid := tmpLuid; Privilege[0].Attributes := SE_PRIVILEGE_ENABLED; tkp.PrivilegeCount := 1; // One privilege to set tkp.Privileges[0] := Privilege[0]; if AdjustTokenPrivileges(hdlTokenHandle, False, tkp, Sizeof(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded) then Result:=True else Result:=False; end; //------------------------------------------------------------------------------function PerformLogon(const User,Domain, Password: String;var ErrorCode:integer): Cardinal; begin if NOT LogonUser(pChar(User), pChar(Domain), pChar(Password), LOGON32_LOGON_INTERACTIVE,//LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, Result) then ErrorCode:=getLastError else ErrorCode:=0; end; //------------------------------------------------------------------------------ function Logonwindows(const User, Password: String;Var ErrCode:Integer):Boolean; var hToken: Cardinal; begin if not AdjustToken then Exit; hToken := PerformLogon(User,'.',PassWord,ErrCode); try ImpersonateLoggedOnUser(hToken); try finally RevertToSelf; end; Result:=(ErrCode=0); finally CloseHandle(hToken); end; end; //----------------------------------------------------------------------------- end.http://lysoft.7u7.net
程序运行后, function Logonwindows(const User, Password: String;Var ErrCode:Integer):Boolean; var hToken: Cardinal; begin if not AdjustToken then Exit; hToken := PerformLogon(User,'.',PassWord,ErrCode); try ImpersonateLoggedOnUser(hToken); try finally RevertToSelf; end; Result:=(ErrCode=0); finally CloseHandle(hToken);//出现这个错误“External exception C0000008” end; end;
function PerformLogon(const User,Domain, Password: String;var ErrorCode:integer): Cardinal; begin if NOT LogonUser(pChar(User), pChar(Domain), pChar(Password), LOGON32_LOGON_INTERACTIVE,//LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, Result) then ErrorCode:=getLastError//不管用户名,密码是否正确,都返回1314? else ErrorCode:=0; end;
想知道用什么API可以实现
uses
Windows; function AdjustToken:Boolean;
function PerformLogon(const User,Domain, Password: String;var ErrorCode:integer): Cardinal;
function Logonwindows(const User, Password: String;Var ErrCode:Integer):Boolean;
implementationfunction AdjustToken:Boolean;
var
hdlProcessHandle : Cardinal;
hdlTokenHandle : Cardinal;
tmpLuid : Int64;
tkpPrivilegeCount : Int64;
tkp : TOKEN_PRIVILEGES;
tkpNewButIgnored : TOKEN_PRIVILEGES;
lBufferNeeded : Cardinal;
Privilege : array[0..0] of _LUID_AND_ATTRIBUTES;
hToken:THandle;
begin
hdlProcessHandle := GetCurrentProcess;
{OpenProcessToken(hdlProcessHandle,
(TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY),
hdlTokenHandle);
}
//TOKEN_QUERY | TOKEN_ADJUST_DEFAULT | TOKEN_ADJUST_GROUPS | TOKEN_ADJUST_PRIVILEGES OpenProcessToken(hdlProcessHandle,
(TOKEN_QUERY or TOKEN_ADJUST_DEFAULT or TOKEN_ADJUST_GROUPS or TOKEN_ADJUST_PRIVILEGES),
hdlTokenHandle); LookupPrivilegeValue(nil, 'SeTcbPrivilege', tmpLuid);
Privilege[0].Luid := tmpLuid;
Privilege[0].Attributes := SE_PRIVILEGE_ENABLED;
tkp.PrivilegeCount := 1; // One privilege to set
tkp.Privileges[0] := Privilege[0]; if
AdjustTokenPrivileges(hdlTokenHandle,
False,
tkp,
Sizeof(tkpNewButIgnored),
tkpNewButIgnored,
lBufferNeeded) then
Result:=True
else
Result:=False;
end;
//------------------------------------------------------------------------------function PerformLogon(const User,Domain, Password: String;var ErrorCode:integer): Cardinal;
begin
if NOT LogonUser(pChar(User), pChar(Domain), pChar(Password),
LOGON32_LOGON_INTERACTIVE,//LOGON32_LOGON_NETWORK,
LOGON32_PROVIDER_DEFAULT,
Result) then
ErrorCode:=getLastError
else
ErrorCode:=0;
end;
//------------------------------------------------------------------------------
function Logonwindows(const User, Password: String;Var ErrCode:Integer):Boolean;
var
hToken: Cardinal;
begin
if not AdjustToken then Exit;
hToken := PerformLogon(User,'.',PassWord,ErrCode);
try
ImpersonateLoggedOnUser(hToken);
try finally
RevertToSelf;
end;
Result:=(ErrCode=0);
finally
CloseHandle(hToken);
end;
end;
//-----------------------------------------------------------------------------
end.http://lysoft.7u7.net
hToken := PerformLogon(User,'.',PassWord,ErrCode);
里面的‘.’做domain的参数,表示什么?
function Logonwindows(const User, Password: String;Var ErrCode:Integer):Boolean;
var
hToken: Cardinal;
begin
if not AdjustToken then Exit;
hToken := PerformLogon(User,'.',PassWord,ErrCode);
try
ImpersonateLoggedOnUser(hToken);
try finally
RevertToSelf;
end;
Result:=(ErrCode=0);
finally
CloseHandle(hToken);//出现这个错误“External exception C0000008”
end;
end;
begin
if NOT LogonUser(pChar(User), pChar(Domain), pChar(Password),
LOGON32_LOGON_INTERACTIVE,//LOGON32_LOGON_NETWORK,
LOGON32_PROVIDER_DEFAULT,
Result) then
ErrorCode:=getLastError//不管用户名,密码是否正确,都返回1314?
else
ErrorCode:=0;
end;
如果我用域用户名登录进去,运行
AdjustTokenPrivileges(hdlTokenHandle,
False,
tkp,
Sizeof(tkpNewButIgnored),
tkpNewButIgnored,
lBufferNeeded)
时候会返回1300(getlasterror)错误,意思是权限没有设置成功,也就是SeTcbPrivilege没有设置成功,那么logonuser就不能用。
如果用本机的administrator登录进去后就没有这些问题了。那位大侠能帮忙解决一下
http://www.swissdelphicenter.ch/torry/showcode.php?id=1177注意LogonUser只在本机有效的
可以使用logonuser来验证域用户名密码是可以的。
如果不能用logonuser,那该用什么呢?