Ok, I have Windows synchronizing with an NTP server reliably now. Here is how I have set things up. I am running Windows 10, but I think this should work with previous versions of Windows.
1) Set Windows Time Service to run continuously. Click Start/Run and enter "services.msc". This should open the Services control panel applet. Scroll down to "Windows Time", right click, select "Properties" in the pop-up menu, and in the properties window change "Startup type" to either "Automatic" or "Automatic (Delayed Start)". Click OK to save your changes.
2) Configure the time service to point to your NTP server. I am using a remote NTP server in the example below, but if you've set up a local NTP server linked to your GPSDO, you should use the IP address or hostname of that in this command. Open a Administrative CMD prompt and enter this:
w32tm /config /update /manualpeerlist:"0.pool.ntp.org,0x8 1.pool.ntp.org,0x8 2.pool.ntp.org,0x8 3.pool.ntp.org,0x8" /syncfromflags:MANUAL
Here we have configured the system with 4 different NTP servers, (0.pool.ntp.org, 1.pool.ntp.org, etc). It will pick one, and use the others in the event the primary server is not available. The ",0x8" on the end of the server name is a flag to tell it to operate in NTP client mode (see NTP docs on this, but this is what you want). The /syncfromflags:MANUAL tells it to use the servers in the manualpeerlist. If your computer is on the domain, you would instead use /syncfromflags:MANUAL,DOMHIER. This will tell the time service to use the local domain controller if it's available, but to fall back to the ntp.org time servers if not (for example if your laptop is not connected to the network with the domain controller).
3) Next we need to change some default settings for the time service. Run "regedit.exe", and change this parameter:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config\MinPollInterval
The default value for Windows machines that are not domain controllers is "10". This means the Windows NTP client will only poll the remove server for time every 2^10 = 1024 seconds. That's fine for most purposes, but it does mean it will take some time for the local time to synchronize up with the NTP server. If you want this process to move along quicker, change it to a lower value like 6 (every 64 seconds). If your not pointing at a local NTP server, I would recommend setting it back to 10 after the initial synchronization is complete.
4) We need to tell the time service to reload configuration. I believe this should work for that, but if not you can go back into services.msc and restart the service:
w32tm /config /update
5) Now let's force the time service to start an immediate resync with this command:
w32tm /resync
You can monitor progress of the resync with this command:
w32tm /query /status /verbose
Here is the output of that command on my desktop:
Leap Indicator: 0(no warning)
Stratum: 2 (secondary reference - syncd by (S)NTP)
Precision: -6 (15.625ms per tick)
Root Delay: 0.0312500s
Root Dispersion: 0.2328713s
ReferenceId: 0x84A30465 (source IP: 132.163.4.101)
Last Successful Sync Time: 3/31/2016 2:02:53 PM
Source: 2.pool.ntp.org,0x8
Poll Interval: 9 (512s)
Phase Offset: -0.7133668s
ClockRate: 0.0156381s
State Machine: 2 (Sync)
Time Source Flags: 0 (None)
Server Role: 0 (None)
Last Sync Error: 0 (The command completed successfully.)
Time since Last Good Sync Time: 44.6045029s
The phase offset of -0.7133668s indicates that my desktop is about 0.7 seconds behind the time reported by the NTP server, 2.pool.ntp.org, during the last sync. This is because it's not done synchronzing yet.