{"id":921,"date":"2026-10-24T23:25:56","date_gmt":"2026-10-24T23:25:56","guid":{"rendered":"https:\/\/windows-vps.org\/blog\/w32time-hierarchy-drift-pdc-emulator-time-sync\/"},"modified":"2026-10-24T23:25:56","modified_gmt":"2026-10-24T23:25:56","slug":"w32time-hierarchy-drift-pdc-emulator-time-sync","status":"publish","type":"post","link":"https:\/\/windows-vps.org\/blog\/w32time-hierarchy-drift-pdc-emulator-time-sync\/","title":{"rendered":"w32time Hierarchy and Drift: Keeping Windows Server Time Accurate"},"content":{"rendered":"<p class=\"wp-block-paragraph\">Run <code>w32tm \/query \/status<\/code> on a newly provisioned Windows Server VM and the first three lines report the source, the stratum and the poll interval. On a standalone instance the source is usually <code>VM IC Time Synchronization Provider<\/code> &mdash; a Hyper-V synthetic clock with no independent verification. For an IIS-only host that is tolerable; for a machine issuing Kerberos tickets or validating certificates it is not.<\/p>\n\n<h2 class=\"wp-block-heading\">How the w32time hierarchy actually resolves<\/h2>\n\n<p class=\"wp-block-paragraph\">Windows time is not a single service call. The <code>W32Time<\/code> service runs in two modes: a client layer that samples one or more upstream time sources, and a server layer that answers NTP requests from downstream machines on UDP port 123. Domain members hold the client role; the PDC emulator of the forest root domain should hold the server role, and every other domain controller points at it. In a single-server deployment on a <a href=\"https:\/\/windows-vps.org\/\">Windows VPS with full administrator access<\/a> the same machine is frequently both client and NTP server, which makes the configuration easier to reason about but no less necessary.<\/p>\n\n<p class=\"wp-block-paragraph\">The hierarchy is driven by <code>HKLM\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\Parameters<\/code>. The value <code>Type<\/code> selects the role: <code>NT5DS<\/code> means follow the AD domain hierarchy, <code>NTP<\/code> means use a manual peer list, <code>NoSync<\/code> disables inbound correction, and <code>AllSync<\/code> does everything. A standalone IIS box using <code>NT5DS<\/code> with no domain to talk to will fall back to local clock and drift; check with <code>w32tm \/query \/configuration<\/code> and look at the <code>Type:<\/code> line before blaming the hypervisor.<\/p>\n\n<p class=\"wp-block-paragraph\">Each hop adds error: a stratum-1 source is directly attached to a reference clock, and a stratum-2 server carries the accumulated jitter of its parent. Keep the hierarchy shallow (strata 2 to 4) and never chain five or six internal relays.<\/p>\n\n<h2 class=\"wp-block-heading\">Configuring an external peer list correctly<\/h2>\n\n<p class=\"wp-block-paragraph\">Point a standalone server or the PDC emulator at a real NTP pool, never at <code>time.windows.com<\/code> alone &mdash; it is rate-limited and often unreachable. Use a vendor pool or your own GPS-backed relay. This sequence sets three peers, enables reliable mode and restarts the service:<\/p>\n\n<pre class=\"wp-block-code\"><code>w32tm \/config \/manualpeerlist:\"0.pool.ntp.org,0x8 1.pool.ntp.org,0x8 ntp.example.net,0x8\" \/syncfromflags:manual \/reliable:yes \/update\nnet stop w32time &amp;&amp; net start w32time\nw32tm \/resync \/force\nw32tm \/query \/status\nw32tm \/query \/peers<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\">The <code>0x8<\/code> flag requests client mode; the default is symmetric active, which makes the client also try to serve time. The selection algorithm discards falsetickers, so four sources from different operators beat four hosts from one provider. <code>\/reliable:yes<\/code> marks the machine as a trustworthy source for downstream clients.<\/p>\n\n<p class=\"wp-block-paragraph\">After the resync, verify with <code>w32tm \/monitor<\/code>. On a domain controller it prints the offset of every reachable domain controller against its own clock; large positive or negative values on one branch of the tree point at that specific DC&#8217;s upstream, not at the whole domain. The <code>Stratum<\/code> and <code>Offset<\/code> columns are the two to watch.<\/p>\n\n<h2 class=\"wp-block-heading\">Reading the status output and the registry<\/h2>\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Command \/ value<\/th><th>Location<\/th><th>What it tells you<\/th><\/tr><\/thead><tbody><tr><td>w32tm \/query \/status<\/td><td>CLI<\/td><td>Source, stratum, poll interval, last successful sync, clock offset<\/td><\/tr><tr><td>w32tm \/query \/peers<\/td><td>CLI<\/td><td>Every configured peer with state and offset<\/td><\/tr><tr><td>w32tm \/stripchart \/computer:host<\/td><td>CLI<\/td><td>Live offset samples against a named peer<\/td><\/tr><tr><td>Type<\/td><td>HKLM\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\Parameters<\/td><td>NT5DS, NTP, NoSync or AllSync<\/td><\/tr><tr><td>NtpServer<\/td><td>same key<\/td><td>Manual peer list used when Type = NTP<\/td><\/tr><tr><td>MaxPosPhaseCorrection<\/td><td>same key<\/td><td>Largest forward step allowed (default 48h, in seconds)<\/td><\/tr><tr><td>Event ID 35<\/td><td>System log, W32Time<\/td><td>The time service is not able to synchronize<\/td><\/tr><tr><td>Event ID 37<\/td><td>System log, W32Time<\/td><td>The time provider has not been able to reach a source<\/td><\/tr><tr><td>Event ID 50<\/td><td>System log, W32Time<\/td><td>Time service is using a fallback source<\/td><\/tr><\/tbody><\/table><\/figure>\n\n<p class=\"wp-block-paragraph\">A poll interval of 1024 seconds (about 17 minutes) is normal for a stratum-3 client; the service starts at 64 seconds and backs off as the clock proves stable. <code>Source: Local CMOS Clock<\/code> with a stratum of 0 means no sync has ever succeeded.<\/p>\n\n<p class=\"wp-block-paragraph\">Event ID 129 in the System log is worth grepping for on virtual machines: it reports a time service adjustment that was too large to be a normal correction. On Hyper-V guests this usually means the synthetic clock and the NTP client are fighting. Disable the VM time integration component or the guest <code>vmictimesync<\/code> device and let exactly one mechanism own the clock.<\/p>\n\n<h2 class=\"wp-block-heading\">Measuring drift instead of guessing at it<\/h2>\n\n<p class=\"wp-block-paragraph\">Run a stripchart against two independent peers for a few minutes and compare the offset pattern. A steady ramp of milliseconds per minute is ordinary crystal drift; steps of hundreds of milliseconds are a scheduling problem &mdash; a host whose vCPUs are overcommitted falls behind while descheduled, then jumps forward.<\/p>\n\n<pre class=\"wp-block-code\"><code>w32tm \/stripchart \/computer:ntp.example.net \/samples:10 \/dataonly\n# Output: 12:04:11, +0.0038s   12:04:13, +0.0041s ...\n# A ramp of ~0.3ms\/min is normal; steps &gt;100ms indicate CPU steal.<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\">If you are testing a host before you commit to it &mdash; for instance when <a href=\"https:\/\/windows-vps.org\/\">comparing Windows Server plans<\/a> &mdash; a ten-minute stripchart at idle and again under a compile or IIS load test is a more honest measure of timer quality than any spec sheet. Servers with a stable, low offset curve are the ones that will not produce mysterious Kerberos or TLS failures six months later.<\/p>\n\n<h2 class=\"wp-block-heading\">Kerberos, TLS and the 5-minute window<\/h2>\n\n<p class=\"wp-block-paragraph\">Domain authentication fails when the client clock and the KDC&#8217;s clock differ by more than <code>Maximum tolerance for computer clock synchronization<\/code> &mdash; 5 minutes by default, under <code>Computer Configuration\\Windows Settings\\Security Settings\\Account Policies\\Kerberos Policy<\/code> in Group Policy. The error surfaces as STATUS_TIME_DIFFERENCE_AT_DC (0xC0000133) or a misleading &#8220;security database does not have a computer account&#8221; prompt.<\/p>\n\n<p class=\"wp-block-paragraph\">TLS validation compares <code>NotBefore<\/code> and <code>NotAfter<\/code> against the local clock, so a host three days behind rejects a fresh certificate as not yet valid and one a day ahead rejects it on expiry day. Both report <code>SEC_E_CERT_EXPIRED<\/code> (0x80090328) in the Schannel logs.<\/p>\n\n<h2 class=\"wp-block-heading\">Making the PDC emulator authoritative<\/h2>\n\n<p class=\"wp-block-paragraph\">In an AD domain only the PDC emulator should go to the internet; every other DC and member uses <code>NT5DS<\/code>. On the PDC emulator, set <code>\/reliable:yes<\/code> and confirm that <code>AnnounceFlags<\/code> under <code>W32Time\\Config<\/code> is 5 (always reliable + time server enabled). Otherwise downstream DCs may ignore it in favour of a machine closer in the AD topology.<\/p>\n\n<p class=\"wp-block-paragraph\">If the PDC emulator role moves, the time configuration does not follow it: the new holder keeps <code>NT5DS<\/code> and starts syncing from itself. Re-apply the peer config on the new role holder, then run <code>w32tm \/resync \/rediscover<\/code> on every DC.<\/p>\n\n<h2 class=\"wp-block-heading\">A short verification checklist<\/h2>\n\n<ul class=\"wp-block-list\"><li><code>w32tm \/query \/status<\/code> shows a real Source, not Local CMOS Clock, and a Last Successful Sync Time within the poll interval.<\/li><li><code>w32tm \/query \/peers<\/code> lists at least three peers with no persistent <code>Pending<\/code> state.<\/li><li>Event ID 35\/37\/50 counts in the System log are zero over the last 7 days.<\/li><li>UDP 123 is open inbound only where the server is actually meant to serve time; do not expose it on an IIS-only host.<\/li><li>The registry <code>Type<\/code> value matches the machine&#8217;s role &mdash; NT5DS for members, NTP with \/reliable:yes for the root source.<\/li><\/ul>\n\n<p class=\"wp-block-paragraph\">Five minutes of checking on every new instance catches a class of failures that otherwise take a week to diagnose. Record the offset baseline alongside the build notes.<\/p>","protected":false},"excerpt":{"rendered":"<p>Run w32tm \/query \/status on a newly provisioned Windows Server VM and the first three lines report the source, the stratum and the poll interval. On a standalone instance the source is usually VM IC Time Synchronization Provider &mdash; a Hyper-V synthetic clock with no independent verification. For an IIS-only host that is tolerable; for &#8230; <a title=\"w32time Hierarchy and Drift: Keeping Windows Server Time Accurate\" class=\"read-more\" href=\"https:\/\/windows-vps.org\/blog\/w32time-hierarchy-drift-pdc-emulator-time-sync\/\" aria-label=\"Read more about w32time Hierarchy and Drift: Keeping Windows Server Time Accurate\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":0,"footnotes":""},"categories":[5],"tags":[],"class_list":["post-921","post","type-post","status-publish","format-standard","hentry","category-tutorials-guides"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>w32time Hierarchy and Drift: Keeping Windows Server Time Accurate - Windows VPS Blog<\/title>\n<meta name=\"description\" content=\"Run w32tm \/query \/status on a newly provisioned Windows Server VM and the first three lines report the source, the stratum and the poll interval. On a\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/windows-vps.org\/blog\/w32time-hierarchy-drift-pdc-emulator-time-sync\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"w32time Hierarchy and Drift: Keeping Windows Server Time Accurate\" \/>\n<meta property=\"og:description\" content=\"w32time Hierarchy and Drift: Keeping Windows Server Time Accurate\" \/>\n<meta property=\"og:url\" content=\"https:\/\/windows-vps.org\/blog\/w32time-hierarchy-drift-pdc-emulator-time-sync\/\" \/>\n<meta property=\"og:site_name\" content=\"Windows VPS Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-24T23:25:56+00:00\" \/>\n<meta name=\"author\" content=\"windows-vps\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@myxiechengxuan\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"windows-vps\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/windows-vps.org\/blog\/w32time-hierarchy-drift-pdc-emulator-time-sync\/\",\"url\":\"https:\/\/windows-vps.org\/blog\/w32time-hierarchy-drift-pdc-emulator-time-sync\/\",\"name\":\"w32time Hierarchy and Drift: Keeping Windows Server Time Accurate - Windows VPS Blog\",\"isPartOf\":{\"@id\":\"https:\/\/windows-vps.org\/blog\/#website\"},\"datePublished\":\"2026-10-24T23:25:56+00:00\",\"author\":{\"@id\":\"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/44caceed916d0db318aa08d5623a7a58\"},\"description\":\"Run w32tm \/query \/status on a newly provisioned Windows Server VM and the first three lines report the source, the stratum and the poll interval. On a\",\"breadcrumb\":{\"@id\":\"https:\/\/windows-vps.org\/blog\/w32time-hierarchy-drift-pdc-emulator-time-sync\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/windows-vps.org\/blog\/w32time-hierarchy-drift-pdc-emulator-time-sync\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/windows-vps.org\/blog\/w32time-hierarchy-drift-pdc-emulator-time-sync\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/windows-vps.org\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"w32time Hierarchy and Drift: Keeping Windows Server Time Accurate\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/windows-vps.org\/blog\/#website\",\"url\":\"https:\/\/windows-vps.org\/blog\/\",\"name\":\"Windows VPS Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/windows-vps.org\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/44caceed916d0db318aa08d5623a7a58\",\"name\":\"windows-vps\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/3f2573db5afcd1a6ab9abcc5d48fc8e42584bc87ab9d98cc156e5b2097766dd9?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/3f2573db5afcd1a6ab9abcc5d48fc8e42584bc87ab9d98cc156e5b2097766dd9?s=96&d=mm&r=g\",\"caption\":\"windows-vps\"},\"sameAs\":[\"https:\/\/windows-vps.org\/blog\",\"https:\/\/x.com\/myxiechengxuan\"],\"url\":\"https:\/\/windows-vps.org\/blog\/author\/myxiechengxuan\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"w32time Hierarchy and Drift: Keeping Windows Server Time Accurate - Windows VPS Blog","description":"Run w32tm \/query \/status on a newly provisioned Windows Server VM and the first three lines report the source, the stratum and the poll interval. On a","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/windows-vps.org\/blog\/w32time-hierarchy-drift-pdc-emulator-time-sync\/","og_locale":"en_US","og_type":"article","og_title":"w32time Hierarchy and Drift: Keeping Windows Server Time Accurate","og_description":"w32time Hierarchy and Drift: Keeping Windows Server Time Accurate","og_url":"https:\/\/windows-vps.org\/blog\/w32time-hierarchy-drift-pdc-emulator-time-sync\/","og_site_name":"Windows VPS Blog","article_published_time":"2026-10-24T23:25:56+00:00","author":"windows-vps","twitter_card":"summary_large_image","twitter_creator":"@myxiechengxuan","twitter_misc":{"Written by":"windows-vps","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/windows-vps.org\/blog\/w32time-hierarchy-drift-pdc-emulator-time-sync\/","url":"https:\/\/windows-vps.org\/blog\/w32time-hierarchy-drift-pdc-emulator-time-sync\/","name":"w32time Hierarchy and Drift: Keeping Windows Server Time Accurate - Windows VPS Blog","isPartOf":{"@id":"https:\/\/windows-vps.org\/blog\/#website"},"datePublished":"2026-10-24T23:25:56+00:00","author":{"@id":"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/44caceed916d0db318aa08d5623a7a58"},"description":"Run w32tm \/query \/status on a newly provisioned Windows Server VM and the first three lines report the source, the stratum and the poll interval. On a","breadcrumb":{"@id":"https:\/\/windows-vps.org\/blog\/w32time-hierarchy-drift-pdc-emulator-time-sync\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/windows-vps.org\/blog\/w32time-hierarchy-drift-pdc-emulator-time-sync\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/windows-vps.org\/blog\/w32time-hierarchy-drift-pdc-emulator-time-sync\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/windows-vps.org\/blog\/"},{"@type":"ListItem","position":2,"name":"w32time Hierarchy and Drift: Keeping Windows Server Time Accurate"}]},{"@type":"WebSite","@id":"https:\/\/windows-vps.org\/blog\/#website","url":"https:\/\/windows-vps.org\/blog\/","name":"Windows VPS Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/windows-vps.org\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/44caceed916d0db318aa08d5623a7a58","name":"windows-vps","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/3f2573db5afcd1a6ab9abcc5d48fc8e42584bc87ab9d98cc156e5b2097766dd9?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3f2573db5afcd1a6ab9abcc5d48fc8e42584bc87ab9d98cc156e5b2097766dd9?s=96&d=mm&r=g","caption":"windows-vps"},"sameAs":["https:\/\/windows-vps.org\/blog","https:\/\/x.com\/myxiechengxuan"],"url":"https:\/\/windows-vps.org\/blog\/author\/myxiechengxuan\/"}]}},"_links":{"self":[{"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/posts\/921","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/comments?post=921"}],"version-history":[{"count":1,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/posts\/921\/revisions"}],"predecessor-version":[{"id":926,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/posts\/921\/revisions\/926"}],"wp:attachment":[{"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/media?parent=921"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/categories?post=921"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/tags?post=921"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}