システム日時を勝手に変更してしまうことがよいことかという議論は置いておき、システム日時を変更する方法を2つ紹介します。
VB.NETでは、Todayプロパティ及びDateStringプロパティでシステム日付を、TimeOfDayプロパティ及びTimeStringプロパティでシステム時刻を設定できます。VB.NET以外でもMicrosoft.VisualBasic.dllを参照することにより、これらのプロパティにアクセスできます。
'システム日付を2005/1/2にする Today = New DateTime(2005, 1, 2, 0, 0, 0) 'システム日付を2005/2/3にする DateString = "2005-2-3" 'システム時刻を6:15:30にする TimeOfDay = New DateTime(2000, 1, 1, 6, 15, 30) 'システム時刻を8:25:45にする TimeString = "8:25:45"
//システム日付を2005/1/2にする Microsoft.VisualBasic.DateAndTime.Today = new DateTime(2005, 1, 2, 0, 0, 0); //システム日付を2005/2/3にする Microsoft.VisualBasic.DateAndTime.DateString = "2005-2-3"; //システム時刻を6:15:30にする Microsoft.VisualBasic.DateAndTime.TimeOfDay = new DateTime(2000, 1, 1, 6, 15, 30); //システム時刻を8:25:45にする Microsoft.VisualBasic.DateAndTime.TimeString = "8:25:45";
また、Win32 APIのSetLocalTime関数を使用してシステム日時を変更することもできます。下のSetNowDateTimeメソッドは、DateTime型で日時を指定してシステム日時を変更するメソッドです。
<StructLayout(LayoutKind.Sequential)> _ Public Structure SystemTime Public wYear As Short Public wMonth As Short Public wDayOfWeek As Short Public wDay As Short Public wHour As Short Public wMinute As Short Public wSecond As Short Public wMiliseconds As Short End Structure <DllImport("kernel32.dll")> _ Public Shared Function SetLocalTime( _ ByRef sysTime As SystemTime) As Boolean End Function ''' <summary> ''' 現在のシステム日時を設定する ''' </summary> ''' <param name="dt">設定する日時</param> Public Shared Sub SetNowDateTime(ByVal dt As DateTime) 'システム日時に設定する日時を指定する Dim sysTime As New SystemTime sysTime.wYear = dt.Year sysTime.wMonth = dt.Month sysTime.wDay = dt.Day sysTime.wHour = dt.Hour sysTime.wMinute = dt.Minute sysTime.wSecond = dt.Second sysTime.wMiliseconds = dt.Millisecond 'システム日時を設定する SetLocalTime(sysTime) End Sub
//using System.Runtime.InteropServices; [StructLayout(LayoutKind.Sequential)] public struct SystemTime { public ushort wYear; public ushort wMonth; public ushort wDayOfWeek; public ushort wDay; public ushort wHour; public ushort wMinute; public ushort wSecond; public ushort wMiliseconds; } [DllImport("kernel32.dll")] public static extern bool SetLocalTime( ref SystemTime sysTime); /// <summary> /// 現在のシステム日時を設定する /// </summary> /// <param name="dt">設定する日時</param> public static void SetNowDateTime(DateTime dt) { //システム日時に設定する日時を指定する SystemTime sysTime = new SystemTime(); sysTime.wYear = (ushort) dt.Year; sysTime.wMonth = (ushort) dt.Month; sysTime.wDay = (ushort) dt.Day; sysTime.wHour = (ushort) dt.Hour; sysTime.wMinute = (ushort) dt.Minute; sysTime.wSecond = (ushort) dt.Second; sysTime.wMiliseconds = (ushort) dt.Millisecond; //システム日時を設定する SetLocalTime(ref sysTime); }
NT系のOSでシステム日時を変更するには、SE_SYSTEMTIME_NAME特権が必要です。特権を有効にする方法は「コンピュータの電源切る、システムのシャットダウン、再起動、ログオフする」でAdjustTokenメソッドとして説明しています。そのAdjustTokenメソッドで「SE_SHUTDOWN_NAME = "SeShutdownPrivilege"」となっている箇所を「SE_SYSTEMTIME_NAME = "SeSystemtimePrivilege"」とし、それ以降の「SE_SHUTDOWN_NAME」を「SE_SYSTEMTIME_NAME」に置き換えてください。
Windows Vistaで導入されたUAC(ユーザーアカウント制御)によって、ほとんどの場合、普通に実行しただけではシステム日時を変更できません。この場合、管理者権限で実行するか、UACを無効にするかしなければなりません。詳しくは、「Vista以降でUACが有効だとファイルの作成等に失敗する問題の対処法」をご覧ください。
(この記事は、「.NETプログラミング研究 第54号」で紹介したものを基にしています。)