更改C#.Date中的系统日期时间,但在64位Windows Server 2008中不更改TIme

时间:2013-10-18 11:18:42

标签: c# windows

我已使用以下程序更改系统日期时间。

public struct SystemTime
{
    public ushort Year;
    public ushort Month;
    public ushort DayOfWeek;
    public ushort Day;
    public ushort Hour;
    public ushort Minute;
    public ushort Second;
    public ushort Millisecond;
};

[DllImport("kernel32.dll", EntryPoint = "GetSystemTime", SetLastError = true)]
public extern static void Win32GetSystemTime(ref SystemTime sysTime);

[DllImport("kernel32.dll", EntryPoint = "SetSystemTime", SetLastError = true)]
public extern static bool Win32SetSystemTime(ref SystemTime sysTime);

private void button1_Click(object sender, EventArgs e)
{`enter code here`
    // Set system date and time
    SystemTime updatedTime = new SystemTime();
    updatedTime.Year = (ushort)2009;
    updatedTime.Month = (ushort)3;
    updatedTime.Day = (ushort)16;
    updatedTime.Hour = (ushort)10;
    updatedTime.Minute = (ushort)0;
    updatedTime.Second = (ushort)0;
    // Call the unmanaged function that sets the new date and time instantly
    Win32SetSystemTime(ref updatedTime);
}

系统日期已更改,但时间未更改。 我的任务是获取NTP服务器时间并更改NTP服务器时间的系统日期和时间。我得到NTP服务器的日期和时间&更改日期但我无法更改系统的时间

1 个答案:

答案 0 :(得分:1)

你正确地声明了SetSystemTime(),但是你忘了正确使用它。您不能忽略返回值。修正:

  if (!Win32SetSystemTime(ref updatedTime)) {
      throw new System.ComponentModel.Win32Exception();
  }

您现在将发现异常失败的可能原因。有几种可能性,但我们可以猜测:更改时钟需要管理员权限,而您的程序不太可能拥有它们。您必须要求用户允许执行此操作,您可以通过嵌入要求UAC提升的清单来执行此操作。 This answer显示了如何做到这一点。

以防您认为这是不合理的:请记住,更改时钟非常会破坏正在运行的程序。在Windows中运行的许多基本服务取决于准确的时钟。它也不会持续很长时间,Windows会定期联系时间服务器以重新校准时钟。您必须禁用它,请在superuser.com上询问。您将遇到的其他问题,例如文件写入错误的时间戳,计划任务没有运行,Web浏览器抱怨错误的证书,您的项目总是重建虽然您没有做任何更改,但您可以处理。不要这样做。