Changing the system time using the Win32 API isn't as easy as it was in the Win16 world. This is because in Windows NT environment you have to get certain security permissions before changing the system time. Here's how to put the Windows security guard to sleep and change the time:
function SetPrivilege(
sPrivilegeName : string;
bEnabled : boolean )
: boolean;
var
TPPrev,
TP : TTokenPrivileges;
Token : THandle;
dwRetLen : DWord;
begin
Result := False;

OpenProcessToken(
GetCurrentProcess,
TOKEN_ADJUST_PRIVILEGES
or TOKEN_QUERY,
@Token );

TP.PrivilegeCount := 1;
if( LookupPrivilegeValue(
Nil,
PChar( sPrivilegeName ),
TP.Privileges[ 0 ].LUID ) )then
begin
if( bEnabled )then
begin
TP.Privileges[ 0 ].Attributes :=
SE_PRIVILEGE_ENABLED;
end else
begin
TP.Privileges[ 0 ].Attributes :=
0;
end;

dwRetLen := 0;
Result := AdjustTokenPrivileges(
Token,
False,
TP,
SizeOf( TPPrev ),
TPPrev,
dwRetLen );
end;

CloseHandle( Token );
end;

procedure ChangeSystemTime;
var
st : TSystemTime;
begin
if( SetPrivilege(Advertisement

'SeSystemtimePrivilege',
True ) )then
begin
GetLocalTime( st );

//
// change time using st structure
// for example, to 10:30pm
//
st.wHour := 22;
st.wMinute := 30;

SetLocalTime( st );
// or :
// SetSystemTime( st );

SetPrivilege(
'SeSystemtimePrivilege',
False );
end;
end;