-3

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

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 服务器日期和时间并更改日期,但我无法更改我系统的时间

4

1 回答 1

1

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

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

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

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

于 2013-10-18T13:34:14.103 回答