title: Why SetTimeZoneInformation does not work in windows XP?
body: <p>I have a delphi program that set Time Zone Information of windows to specific start and end dates. it works perfectly in windows 7 , vista and Server 2008. but not in earlier windows versions such as XP and Server 2003. I'm curious if I have mistakes in the code or it is an XP problem ?</p>
  
  <p>Here is my code:</p>
  
  <pre><code>program SetTimeZoneInfo;
  
  {$APPTYPE CONSOLE}
  
  uses
    SysUtils,
    Messages,
    windows;
  
  const
    SE_TIME_ZONE_NAME = 'SeTimeZonePrivilege';
    SE_SYSTEMTIME_NAME = 'SeSystemtimePrivilege';
  
  function NTSetPrivilege(sPrivilege: string; bEnabled: Boolean): Boolean;
  var
    hToken: THandle;
    TokenPriv: TOKEN_PRIVILEGES;
    PrevTokenPriv: TOKEN_PRIVILEGES;
    ReturnLength: Cardinal;
  begin
    Result := True;
    if not (Win32Platform = VER_PLATFORM_WIN32_NT) then Exit;
  
    // obtain the processes token
    if OpenProcessToken(GetCurrentProcess(),
      TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
    begin
      try
        // Get the locally unique identifier (LUID) .
        if LookupPrivilegeValue(nil, PChar(sPrivilege),
          TokenPriv.Privileges[0].Luid) then
        begin
          TokenPriv.PrivilegeCount := 1; // one privilege to set
  
          case bEnabled of
            True: TokenPriv.Privileges[0].Attributes  := SE_PRIVILEGE_ENABLED;
            False: TokenPriv.Privileges[0].Attributes := 0;
          end;
  
          ReturnLength := 0; // replaces a var parameter
          PrevTokenPriv := TokenPriv;
  
          // enable or disable the privilege
  
          AdjustTokenPrivileges(hToken, False, TokenPriv, SizeOf(PrevTokenPriv),
            PrevTokenPriv, ReturnLength);
        end;
      finally
        CloseHandle(hToken);
      end;
    end;
    // test the return value of AdjustTokenPrivileges.
    Result := GetLastError = ERROR_SUCCESS;
    if not Result then
      raise Exception.Create(SysErrorMessage(GetLastError));
  end;
  
  var
    tzi: TTimeZoneInformation;
    lpwdResult, LHResult: Cardinal;
  begin
    if Win32MajorVersion &gt;= 6 then
    begin
      Writeln('NTSetPrivilege SE_TIME_ZONE_NAME enabled ? ' + BoolToStr(NTSetPrivilege(SE_TIME_ZONE_NAME, True), True));
    end;
    Writeln('NTSetPrivilege SE_TIME_ZONE_NAME enabled ? ' + BoolToStr(NTSetPrivilege(SE_SYSTEMTIME_NAME, True), True));
  
    tzi.Bias:= -210;
  
    tzi.DaylightDate.wYear:= 2012;
    tzi.DaylightDate.wMonth:= 3;
    tzi.DaylightDate.wDay:= 20;
    tzi.DaylightDate.wHour:= 23;
    tzi.DaylightDate.wMinute:= 59;
    tzi.DaylightDate.wSecond:= 59;
    tzi.DaylightBias:= -60;
  
    tzi.StandardDate.wYear:= 2012;
    tzi.StandardDate.wMonth:= 9;
    tzi.StandardDate.wDay:= 20;
    tzi.DaylightDate.wHour:= 23;
    tzi.DaylightDate.wMinute:= 59;
    tzi.DaylightDate.wSecond:= 59;
    tzi.StandardBias:= 0;
  
    if not SetTimeZoneInformation(tzi) then
        Writeln('SetTimeZoneInformation Error Message: '+ SysErrorMessage(GetLastError))
    else
      Writeln('SetTimeZoneInformation : Success');
  
    LHResult:= SendMessageTimeout(
                        HWND_BROADCAST,   // reciever window handle
                        WM_SETTINGCHANGE, // message
                        0,                // WParam
                        0,                // LParam
                        SMTO_NORMAL,      // return if reciever hange
                        5,                // timeout in seconds
                        lpwdResult        // result
                        );
    if LHResult = 0 then
      Writeln('SendMessageTimeout Error Message: '+ SysErrorMessage(GetLastError))
    else
      Writeln('SendMessageTimeout : Success');
  
    if Win32MajorVersion &gt;= 6 then
      Writeln('NTSetPrivilege SE_TIME_ZONE_NAME disabled ? ' + BoolToStr(NTSetPrivilege(SE_TIME_ZONE_NAME, False), True));
    Writeln('NTSetPrivilege SE_TIME_ZONE_NAME disabled ? ' + BoolToStr(NTSetPrivilege(SE_SYSTEMTIME_NAME, False), True));
    Readln;
  end.
  </code></pre>