Windows API для запуска синхронизации времени - PullRequest
10 голосов
/ 05 мая 2010

Существует ли Windows API, который бы достигал эквивалента нажатия кнопки «Обновить сейчас» на вкладке «Свойства даты и времени» / «Интернет-время» (открывается двойным щелчком по часам на панели задач)?

Есть ли способ контролировать, когда синхронизация времени запускается окнами, и когда это происходит успешно или не удается?

Ответы [ 2 ]

8 голосов
/ 05 мая 2010

Служба времени не предоставляет API, но для запуска синхронизации времени вы можете использовать инструмент командной строки w32tm.

В C / C ++ вы можете сделать что-то вроде этого:

include <process.h>

...

system("w32tm /resync /nowait");

Посмотрите на документацию w32tm для дальнейших опций.

2 голосов
/ 13 июля 2016

Это похоже на работу:

using System;
using System.Runtime.InteropServices;

namespace ClockResync
{
    class Program
    {
        [DllImport("w32time.dll")]
        public static extern uint W32TimeSyncNow([MarshalAs(UnmanagedType.LPWStr)]String computername, bool wait, uint flag);
        static void Main(string[] args)
        {
            Console.WriteLine(W32TimeSyncNow("computername", true, 8).ToString());
            Console.ReadLine();
        }
    }
}

Это недокументировано, поэтому я не совсем уверен, что это за возможные флаги, но 8, похоже, отлично справляется с этой задачей - проверено с помощью системных часов. Если вы работаете в 64-битной Windows, скомпилируйте для 64-битной, иначе вы получите исключения нарушения прав доступа.

W32TimeQueryStatus должно быть в состоянии получить время последней успешной синхронизации. Я над этим поработаю, когда у меня будет больше времени.

...