1

私のプログラムは、マシンの SystemDate を変更できる必要があります。見回した後、このコードを見つけて実装しましたが、日付はまったく変更されていないようです。それが実行されている VM は時刻同期がオフになっているため、問題がそこにあるわけではないことはわかっています。私は小さな間違いを犯しましたか、それともシステムの日付を変更する簡単な方法はありますか?

[StructLayout(LayoutKind.Sequential)]
private 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;
}

// Return Type: BOOL
[System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint = "SetSystemTime")]
[return:System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)]
private static extern bool SetSystemTime([InAttribute()] ref SYSTEMTIME lpSystemTime);



public bool SetSystemDateTime(DateTime newDateTime)
{
    bool result = false;

    try
    {
        newDateTime = newDateTime.ToUniversalTime();

        SYSTEMTIME sysTime = new SYSTEMTIME() 
            { wYear = (short)newDateTime.Year /* must be short */, 
            wMonth = (short)newDateTime.Month, 
            wDayOfWeek = (short)newDateTime.DayOfWeek, 
            wDay = (short)newDateTime.Day, 
            wHour = (short)newDateTime.Hour, 
            wMinute = (short)newDateTime.Minute, 
            wSecond = (short)newDateTime.Second, 
            wMilliseconds = (short)newDateTime.Millisecond };

        result = SetSystemTime(ref sysTime);
    }
    catch (Exception)
    {
        result = false;
    }
    return result;
}
4

2 に答える 2

1

アプリケーションは管理者として実行されています

多くのユーザーが管理者アカウントで Windows にログインしています。重要なのは、このコードを昇格して実行することです。ユーザーが UAC 昇格プロンプトを取得できるように、「requireAdministrator」属性を含む マニフェストが必要です。

コードの重大な欠陥は、関数の戻り値を簡単に無視できることです。また、false が返された理由を調べる方法もありません。[DllImport] には欠陥があり、SetLastError プロパティを true に設定していません。診断を生成せずに例外をキャッチすることは、明らかに悪い考えです。それを削除してください。修理:

[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool SetSystemTime(ref SYSTEMTIME lpSystemTime);
...
if (!SetSystemTime(ref sysTime)) {
   throw new System.ComponentModel.Win32Exception();
}
于 2013-07-08T16:37:54.593 に答える