C#

C# 日付時刻を変更する

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(ユーザーアカウント制御)はプログラムで実行しようとすると、意外に大変ですのでこちらはまた今度・・・

タイトルとURLをコピーしました