Click here to Skip to main content
15,886,069 members
Articles / Programming Languages / C#

Windows System Time Synchronizer

Rate me:
Please Sign up or sign in to vote.
3.36/5 (9 votes)
24 May 2007CPOL 62.7K   50   21  
This utility synchronizes Windows system time with the Yahoo! server time using a web service
/*
 * WINDOWS TIME SYNCHRONIZER - C# .NET
 * 
 * FILE NAME    :	Program.cs
 * 
 * DATE CREATED :	March 06, 2007, 12:05:54 PM
 * CREATED BY   :	Gunasekaran Paramesh
 * 
 * LAST UPDATED :	April 25, 2007, 12:38:12 PM
 * UPDATED BY   :	Gunasekaran Paramesh
 * 
 * DESCRIPTION  :	Synchronizes Windows System Time with Yahoo! Server Time.
*/

using System;
using System.Net;
using System.Xml;
using System.IO;
using System.Threading;
using System.Diagnostics;
using Microsoft.Win32;
using System.Configuration;
using System.Runtime.InteropServices;

namespace TryWinTimeSync
{
	class Program
	{
		[StructLayout(LayoutKind.Sequential)]
		public struct SYSTEMTIME 
		{
			public short wYear;
			public short wMonth;
			public short wDayOfWeek;
			public short wDay;
			public short wHour;
			public short wMinute;
			public short wSecond;
			public short wMilliseconds;
		}

		[DllImport("kernel32.dll", SetLastError=true)]
		public static extern bool SetSystemTime( [In] ref SYSTEMTIME st );

		[STAThread]
		static void Main(string[] args)
		{
			BooleanSwitch Tracer = new BooleanSwitch("TraceSwitch", "Trace for entire application");
			EventLog Log = null;

			try
			{
				// Initialize EventLog
				Log = new EventLog();
				if(!System.Diagnostics.EventLog.SourceExists("WinTimeSync"))
					System.Diagnostics.EventLog.CreateEventSource("WinTimeSync", "Zion");
				Log.Source = "WinTimeSync";
				Log.Log = "Zion";
				
				if ( Tracer.Enabled )
					Trace.Listeners.Add(new EventLogTraceListener(Log));

				Trace.WriteLineIf(Tracer.Enabled, "Starting WinTimeSync...");

				Boolean ServiceAlive = true;
				Double CurrentTimestamp = 0;

				Trace.WriteLineIf(Tracer.Enabled, "Opening configuration file for initializing global settings...");

				Int32 SyncInterval = Convert.ToInt32(ConfigurationSettings.AppSettings["SyncInterval"].ToString());
				String RequestURL = ConfigurationSettings.AppSettings["TimeServerURL"].ToString();

				Trace.WriteLineIf(Tracer.Enabled, "Global settings initialized [SyncInterval: " + SyncInterval + " minutes; RequestURL: " + RequestURL + "]");

				while ( ServiceAlive )
				{
					Trace.WriteLineIf(!Tracer.Enabled, "Synchronizing system time with time server...");

					// Send HTTP request for Timestamp
					Trace.WriteLineIf(Tracer.Enabled, "Creating HTTP request to [" + RequestURL + "]");
					WebRequest Req = WebRequest.Create(RequestURL);
					Trace.WriteLineIf(Tracer.Enabled, "Setting default proxy for the HTTP request...");
					Req.Proxy = WebProxy.GetDefaultProxy();
					Trace.WriteLineIf(Tracer.Enabled, "Sending HTTP request...");
					WebResponse Res = Req.GetResponse();

					// Save as Timestamp as a temporary XML file
					String TempFile = Guid.NewGuid().ToString() + ".xml";
					Trace.WriteLineIf(Tracer.Enabled, "Creating a temporary XML file [" + TempFile + "]");
					StreamWriter SW = new StreamWriter(TempFile);
					Trace.WriteLineIf(Tracer.Enabled, "Saving HTTP response to the temporary XML file...");
					SW.Write(new StreamReader(Res.GetResponseStream()).ReadToEnd());
					SW.Close();

					// Read the XML file and get the Timestamp value
					Trace.WriteLineIf(Tracer.Enabled, "Opening the temporary XML file...");
					XmlTextReader MyXML = new XmlTextReader(TempFile);
					Trace.WriteLineIf(Tracer.Enabled, "Reading the temporary XML file...");
					while ( MyXML.Read() )
					{
						switch ( MyXML.NodeType )
						{
							case XmlNodeType.Element:
								if ( MyXML.Name == "Timestamp" )
								{
									Trace.WriteLineIf(Tracer.Enabled, "Retriving the current timestamp from the temporary XML file...");
									CurrentTimestamp = Convert.ToDouble(MyXML.ReadInnerXml());
									Trace.WriteLineIf(Tracer.Enabled, "Current timestamp retrived [" + CurrentTimestamp + "]");
								}
								break;
						}
					}
					Trace.WriteLineIf(Tracer.Enabled, "Closing the temporary XML file...");
					MyXML.Close();

					// Delete the temporary XML file
					FileInfo TFile = new FileInfo(TempFile);
					Trace.WriteLineIf(Tracer.Enabled, "Deleting the temporary XML file...");
					TFile.Delete();

					// Convert Timestamp to Time
					DateTime MyDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0);
					Trace.WriteLineIf(Tracer.Enabled, "Converting the timestamp to time...");
					MyDateTime = MyDateTime.AddSeconds(CurrentTimestamp);
					Trace.WriteLineIf(Tracer.Enabled, "Timestamp converted to time [" + MyDateTime.ToLocalTime() + "]");

					// Change the system time
					SYSTEMTIME SysTime = new SYSTEMTIME();
					SysTime.wYear = (short) MyDateTime.Year;
					SysTime.wMonth = (short) MyDateTime.Month; 
					SysTime.wDay = (short) MyDateTime.Day;
					SysTime.wHour = (short) MyDateTime.Hour;
					SysTime.wMinute = (short) MyDateTime.Minute;
					SysTime.wSecond = (short) MyDateTime.Second;
					Trace.WriteLineIf(Tracer.Enabled, "Setting the system time...");
					SetSystemTime(ref SysTime);

					Trace.WriteLineIf(Tracer.Enabled, "Switching to sleep state until SyncInterval...");
					for ( int i = 0; i < SyncInterval; i++ )
						Thread.Sleep(1000 * 60);
					Trace.WriteLineIf(Tracer.Enabled, "Switching back to active mode...");
				}
			}
			catch ( Exception Ex )
			{
				// Log for errors				
				if ( Tracer.Enabled )
					Log.WriteEntry(Ex.StackTrace, EventLogEntryType.Error);
				else
					Log.WriteEntry(Ex.Message, EventLogEntryType.Error);
			}
		}
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Technical Lead HCL Technologies
India India
Paramesh Gunasekaran is currently working as a Software Engineer in HCL Technologies, India. He obtained his Bachelor's degree in Information Technology from Anna University, India. His research areas include Computational Biology, Artificial Neural Networks and Network Engineering. He has also received international acclaim for authoring industry papers in these areas. He is a Microsoft Certified Professional in ASP.NET/C# and has also been working in .NET technologies for more than 8 years.

Web: http://www.paramg.com

Comments and Discussions