我已使用以下程序更改系统日期时间。
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服务器的日期和时间&更改日期但我无法更改系统的时间
答案 0 :(得分:1)
你正确地声明了SetSystemTime(),但是你忘了正确使用它。您不能忽略返回值。修正:
if (!Win32SetSystemTime(ref updatedTime)) {
throw new System.ComponentModel.Win32Exception();
}
您现在将发现异常失败的可能原因。有几种可能性,但我们可以猜测:更改时钟需要管理员权限,而您的程序不太可能拥有它们。您必须要求用户允许执行此操作,您可以通过嵌入要求UAC提升的清单来执行此操作。 This answer显示了如何做到这一点。
以防您认为这是不合理的:请记住,更改时钟非常会破坏正在运行的程序。在Windows中运行的许多基本服务取决于准确的时钟。它也不会持续很长时间,Windows会定期联系时间服务器以重新校准时钟。您必须禁用它,请在superuser.com上询问。您将遇到的其他问题,例如文件写入错误的时间戳,计划任务没有运行,Web浏览器抱怨错误的证书,您的项目总是重建虽然您没有做任何更改,但您可以处理。不要这样做。