Time Zones not updating on Windows 2003, Windows XP or Windows 2000


After applying 931836 time zone changes don’t take effect until you manually change the time zone


Symptom: We have isolated reports that Windows 2000, XP, and 2003 may find that their Windows clocks do not move forward for DST, even with fixes applied from 931836 or 928388.

· Explanation: The root cause of this issue is still under research, but we believe we can attribute the issue to customers manually applying the time zone updates using the TZEdit application, referring to the steps in KB 914387. It appears that the registry appears to have been altered by some other means (this part is under investigation but could include not completing 914387 or modifying TZ parameters with TZEdit, or potentially malware detection software). This will be updated as research advances.

· Solution:


o Determine if you have this specific issue,

§ Is the OS’s system time not advancing for DST?

§ Open the Time/Date control panel applet and changing the time zone to a new time zone; hitting apply, and changing it back to the original time zone will often correct this problem. This provides confirmation the hotfix was applied, but seems to bypass the aspects involved which prevent the application of the hotfix.

Several customers have confirmed the script below addresses the issue, once it is confirmed to be this specific issue.

Detail:

 

You may see systems that have successfully applied the Windows DST2007 hotfix 931836 but are still operating on old DST rules after March 11. Opening the Time/Date control panel applet and changing the time zone to a new time zone; hitting apply, and changing it back to the original time zone will often correct this problem. If this is the scenario you are seeing, you can run the following script after the hotfix is applied to automate the process of changing the time zone and ensure that the system runs with update DST2007 rules.

Set objSh = CreateObject("WScript.Shell")

'Get the StandardName key of the current time zone

szStandardName = objSh.RegRead("HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation\StandardName")

'Enumerate the subkeys in the time zone database

const HKEY_LOCAL_MACHINE = &H80000002

Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")

szTzsKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones"

objReg.EnumKey HKEY_LOCAL_MACHINE, szTzsKeyPath, arrTzSubKeys

'Step through the time zones to find the matching Standard Name

szTzKey = "<Unknown>"

For Each subkey In arrTzSubKeys

    If (objSh.RegRead("HKLM\" & szTzsKeyPath & "\" & subkey & "\Std") = szStandardName) Then

        'Found matching StandardName, now store this time zone key name

        szTzKey = subkey

    End If

Next

If szTzKey = "<Unknown>" Then

       'Write entry to the Application event log stating that the update has failed to execute

       objSh.LogEvent 1, "DST 2007 Registry Update and Refresh failed to execute on this computer. Time zones failed to enumerate properly or matching time zone not found."

       Wscript.Quit 0

End If

Dim process, processid, result, strUpdateCommand

Set process = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2:Win32_process")

'Add time change privilege to the process object

process.Security_.Privileges.AddAsString "SeSystemTimePrivilege",True

strUpdateCommand = "control.exe timedate.cpl,,/Z" & szTzKey

'Launch control.exe to refresh time zone information using the TZ key name obtained above

result = process.create(strUpdateCommand,Null,Null,processid)

If result <> 0 Then

                objSh.LogEvent 1, "DST 2007 Registry Update and Refresh failed to execute on this computer. Unable to refresh the Timezone database."

    Wscript.Quit 0

End If

'Get current display name of refreshed time zone

szCurrDispName = objSh.RegRead("HKLM\" & szTzsKeyPath & "\" & szTzKey & "\Display")

'Write entry to the Application event log stating that the update has executed

objSh.LogEvent 4, "DST 2007 Registry Update and Refresh has been executed on this computer." & chr(13) & chr(10) & chr(13) & chr(10) & "Current time zone is: " & szCurrDispName & "."

 

On the File menu, click Save As.

Select a destination, and then type refreshTZinfo.vbs in the File name box.

In the Save as type box, click All Files, and then click Save.

Another variation of this problem has been observed on Windows 2000. In that scenario after applying the DST hotfix or using TZEdit and then changing the time zone (manually or with the script above), the time zone still does not update. For that situation we’ve found that making the registry updates described in 914387 followed by running the script above will reliably cause the system to follow the new DST2007 rules. A symptom you may observe is that if you set the clock to the correct time, it will revert back to the incorrect time within one hour.

Additional information for reference:

Hotfix 931836 has three steps during the install:

1) Hotfix adds registry keys for new time zones, dynamic DST, and time zone version number

2) TZChange.exe updates existing time zones, and adds the values for the new time zones.

3) If the time zone being updated is the time zone the system is on, it calls the API function SetTimeZoneInformation() to update the information that the kernel reads at startup in the registry. After this, it updates a structure in the system that contains this information as well as send out a WM_SYSTEMSETTINGSCHANGE message to running applications

The first problem described above seems to be happing during step #3. Reasons for this failure may be related to security rights (this is still under investigation). The first two steps only require write access to HKLM\Software\Microsoft\Windows NT\CurrentVersion which by default is given to Administrators and Power Users. By default these same two groups have the “Change System Time” user right granted which is needed for step #3.

The following problems have been confirmed when installing the DST2007 patch KB931836:

1. Time Zones registry database was modified before the patch was applied. To check for this, export the Time Zones key (HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones) and compare it to a known unpatched system. The key can also be manually verified by checking the TZI value under an affected time zone subkey. The value is in the following C format.

typedef struct _REG_TZI_FORMAT
{
LONG Bias;
LONG StandardBias;
LONG DaylightBias;
SYSTEMTIME StandardDate;
SYSTEMTIME DaylightDate;
} REG_TZI_FORMAT;

The StandardDate and DaylightDate fields can be checked for the old or new DST rules.

2. Update.exe failing to run. In this case check if any Microsoft update package installs correctly. If other update packages also have problem then there is a problem with the update engine. Start with support.microsoft.com/kb/906602 to begin troubleshooting this issue.

3. Antivirus software interfering with install. Disable antivirus software on a test client and see if the install then works.

4. Incomplete registry update from TZEdit or OS patch (usually on Windows 2000). This can be permissions related. If following the steps from 914387 resolves the problem, this may be the cause of the failure.

The following problems have been confirmed on patched systems that display the incorrect time:

1. Client/Server based solutions such as Novell and Altiris may synchronize the client local clock with the server local clock. Ensure that the time server has also been updated with DST2007 patches.

2. Some third party applications that manually adjust the time may depend on the C run-time library. Ensure that machines that run such applications have been updated with hotfix KB 932590 (support.microsoft.com/kb/932590).