http://www.cndiy8.com/data/web5304/20050228/20050228__3787473.html
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;
implementation
function 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.
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;
implementation
function 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.