Как установить системные часы Windows в правильное местное время с помощью C #?

Как установить системные часы Windows в правильное местное время с помощью C #?

Вам нужно будет P / SetLocalTime функцию SetLocalTime из Windows API. Объявите это как в C #:

 [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] internal static extern bool SetLocalTime(ref SYSTEMTIME lpSystemTime); [StructLayout(LayoutKind.Sequential)] internal struct SYSTEMTIME { public ushort wYear; public ushort wMonth; public ushort wDayOfWeek; // ignored for the SetLocalTime function public ushort wDay; public ushort wHour; public ushort wMinute; public ushort wSecond; public ushort wMilliseconds; } 

Чтобы установить время, вы просто инициализируете экземпляр структуры SYSTEMTIME соответствующими значениями и вызываете функцию. Образец кода:

 SYSTEMTIME time = new SYSTEMTIME(); time.wDay = 1; time.wMonth = 5; time.wYear = 2011; time.wHour = 12; time.wMinute = 15; if (!SetLocalTime(ref time)) { // The native function call failed, so throw an exception throw new Win32Exception(Marshal.GetLastWin32Error()); } 

Однако обратите внимание, что вызывающий процесс должен иметь соответствующие привилегии для вызова этой функции. В Windows Vista и более поздних версиях это означает, что вам нужно будет запросить высоту процесса.


В качестве альтернативы вы можете использовать функцию SetSystemTime , которая позволяет вам установить время в UTC (Coordinated Universal Time). Используется SYSTEMTIME же структура SYSTEMTIME , и обе функции вызываются одинаково.

.NET не предоставляет для этого функции, но вы можете использовать метод Win32 API SetSystemTime (в kernel32.dll). Чтобы получить время UTC, вы должны использовать клиент протокола NTP, а затем настроить это время на локальное время в соответствии с вашими региональными настройками.

 public struct SYSTEMTIME { public ushort wYear,wMonth,wDayOfWeek,wDay,wHour,wMinute,wSecond,wMilliseconds; } [DllImport("kernel32.dll")] public extern static uint SetSystemTime(ref SYSTEMTIME lpSystemTime); SYSTEMTIME systime = new SYSTEMTIME(); systime = ... // Set the UTC time here SetSystemTime(ref systime); 

Вот несколько статей о том, как это сделать, в комплекте с запросом атомных часов на правильное время.

http://www.codeproject.com/KB/IP/ntpclient.aspx

http://www.codeproject.com/KB/datetime/SNTPClient.aspx

Чтобы обойти проблему привилегий SE_SYSTEMTIME_NAME, попробуйте создать запланированную задачу для запуска приложения и включить «Запуск с наивысшими привилегиями».