PCのシステム時刻(日付、時刻)を設定することが可能です。
.NET Frameworkが登場する前でも、PCのシステム時刻(日付、時刻)設定は可能で
Windows API(SetLocalTime)で実行することができます。
ただ、.NET Frameworkそのものにまったく存在しないわけでなく、”Microsoft.VisualBasic”名前空間にあるDateAndTimeクラスなどを用いて
システム時刻を変更することが可能です。
実際のコードを書いてみる
コードは下記のようになります。
static void Main(string[] args)
{
try
{
PrivilegeClass.AdjustToken(PrivilegeClass.SE_SYSTEMTIME_NAME, true);
//
DateTime dt = DateTime.Now;
string date = string.Format("{0}/{1}/{2}", dt.Year, dt.Month, dt.Day);
string time = string.Format("{0}:{1}:{2}", dt.Hour, dt.Minute, dt.Second);
// 日付を設定する
Microsoft.VisualBasic.DateAndTime.Today =
new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second);
// 時刻を設定する
Microsoft.VisualBasic.DateAndTime.TimeOfDay =
new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second);
// 文字列から日付を設定する
Microsoft.VisualBasic.DateAndTime.DateString = date;
// 文字列から時刻を設定する
Microsoft.VisualBasic.DateAndTime.TimeString = time;
}
catch (Exception ex)
{
// 例外が発生した場合
Console.WriteLine("EXCEPTION:{0}", ex.Message);
}
}
大きく、コンストラクタで指定して設定を行う方法と、日付や時刻を文字列でプロパティにセットするという方法です。
デバッガからは動かない?
ただ、最近のWindowsで、このコードを実行しようとすると意図したとおりに動きません。
例外が発生し、「システムの日付を設定するためのセキュリティ アクセス許可が十分ではありません。」となります。
Windows Vista以降より導入されたUAC(ユーザーアカウント制御)で、システム時刻の変更は制限の対象となっているからです。
Visual Studioのデバッガや通常のダブルクリックによる「実行」を行うと通常のユーザーとして実行しようとするので
「管理者で実行」したり、セキュリティポリシーを変更したり、UAC自体を無効にすることで、こちらの動作は確認できます。
このUAC(ユーザーアカウント制御)はプログラムで実行しようとすると、意外に大変ですのでこちらはまた今度・・・

