Fix it now
Windows finished the activation attempt without reaching a KMS host. Microsoft documents four things that cause it: no _vlmcs record in DNS, TCP 1688 blocked on the way, the Software Protection service stopped on the host, or a clock more than four hours out between client and host.
w32tm /resync
nslookup -type=srv _vlmcs._tcp
slmgr /dlv
- Read the nslookup answer. A host name and port 1688 means DNS is doing its job and the fault is further along the path. “Non-existent domain” means the record is missing, or the client is searching a DNS domain that does not hold it.
- If the record resolved, test the path before changing anything:
Test-NetConnection kms.contoso.local -Port 1688in PowerShell.TcpTestSucceeded : Falsemeans TCP 1688 is blocked between this client and the host. - If the record did not resolve, and only then, pin the host by hand with
slmgr /skms kms.contoso.local:1688and activate withslmgr /ato. - Confirm the result in the
slmgr /dlvoutput: Licence Status reads Licensed, and the KMS machine name is the host you meant to reach.
Do not open with slmgr /skms. It switches DNS auto-discovery off on that client, so it hides a broken SRV record rather than fixing it and leaves you a machine that stops activating the day the host is renamed.
If that fixed it you can stop here. If not, the next section covers what the client does between DNS and port 1688, and which of the five documented causes you are looking at.
Why it happens
Volume-licensed Windows carries no key of its own. It ships with a GVLK, a generic volume licence key identical on every machine of that edition, and that key is an instruction rather than an entitlement: find a Key Management Service host on this network and borrow a 180-day activation from it. 0xC004F074 is the licensing service reporting that it followed the instruction and came back with nothing.
A client finds the host one of two ways. By default it asks DNS for a service record named _vlmcs._tcp in its own DNS domain; the host registers that record when the Software Protection service starts and re-registers it every 24 hours. If someone has pinned a host with slmgr /skms, the name sits in the registry instead and DNS is skipped entirely.
The companion codes name the layer that failed rather than the reason behind it. 0x8007232B, 0x80092328 and 0x8007251D are all DNS reporting that no such record exists. 0x8007232A is different in kind: the DNS server answered, and its answer was a failure, which points at the server rather than at the record. None of them says anything about your entitlement, and no key needs replacing.
The service record is missing, or points at a host that was retired
You have this one if nslookup returns “Non-existent domain”, or resolves to a server name nobody recognises.
- On the host, confirm a KMS host key is installed and the count is live:
slmgr /dlv. - Confirm publishing is on.
slmgr /sdnsenables it;DisableDnsPublishingmust be 0 or absent. - Restart the Software Protection service. That operation is what creates the SRV records.
- Delete any obsolete _vlmcs record, flush the client resolver, and retry.
Check the host’s A record too. A correct SRV record pointing at a name whose A record still holds the old server’s address fails identically.
The clocks are more than four hours apart
You have this one if DNS resolves, port 1688 answers, and activation still fails. Nothing in the client’s error message points at this one.
- Run
w32tm /resyncon the client, then retryslmgr /ato. - If it will not resync, read
w32tm /query /statusand point the client at a source the domain trusts. - Compare the two machines in UTC. Time zone settings on either are irrelevant.
TCP 1688 is filtered between the client and the host
You have this one if The record resolves but Test-NetConnection on port 1688 reports TcpTestSucceeded False.
- On the host, permit inbound TCP 1688. KMS uses anonymous RPC over TCP, so TCP 135 may also need to be reachable.
- Have the network team confirm no VLAN ACL or edge firewall drops 1688 from the client subnet.
- Test from the client subnet. A path that works from the server tells you nothing.
The Software Protection service has stopped on the host
You have this one if Every client on every subnet fails at once, and nobody changed a firewall.
- On the host, check the service with
sc query sppsvc. - Confirm something is listening:
netstat -ano | findstr :1688should return a LISTENING line. - Start the service, then confirm the SRV record reappeared before retrying clients.
The client has no domain in which to search
You have this one if Workgroup machines and freshly imaged devices fail while domain members activate normally.
- Pin the host:
slmgr /skms kms.contoso.local:1688, thenslmgr /ato. - To return the client to DNS discovery later, run
slmgr /ckms.
Setting the host in an image is supported practice for off-domain machines, and slmgr /skms accepts a host in any domain as long as 1688 is open to it.
Full reference
Commands worth knowing on both machines
| Command | What it does | Where to run it |
|---|---|---|
slmgr /dlv |
Detailed licence status, including the KMS machine name and port last used | Client or host |
slmgr /skms host:1688 |
Pins the client to a named host and disables auto-discovery | Client |
slmgr /ckms |
Clears the pinned host and restores DNS auto-discovery | Client |
slmgr /ato |
Attempts activation now | Client |
slmgr /sdns |
Enables DNS publishing by the host. This is the default | Host |
slmgr /cdns |
Disables DNS publishing by the host | Host |
slmgr /sprt <port> |
Changes the port the host listens on | Host |
nslookup -type=srv _vlmcs._tcp |
Shows whether the service record is published and where it points | Client |
w32tm /resync |
Forces a time resync, which is the fix for the four-hour skew cause | Client |
slmgr /cdns turns publishing off. It is the opposite of what you want when clients cannot find the host, and it is a common misreading of the option list.
Reaching clients in other DNS domains
A KMS host publishes its record into its own domain only. In a multi-domain forest that leaves every other domain’s clients with nothing to find, which produces 0xC004F074 across whole sites while the host’s own domain activates without complaint. The supported fix is to list the extra domains on the host and let it publish into each of them.
| Value | Type | Effect |
|---|---|---|
DnsDomainPublishList |
Multi-string | One DNS domain suffix per line. The host publishes its SRV record into each |
DisableDnsPublishing |
DWORD | 0 or absent: the host registers the record every 24 hours. 1: it never registers automatically |
Both values live under HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform. Restart the Software Protection service after changing either one; that restart is what creates the records.
Creating the record by hand
Where dynamic update is not available, or the host has no rights to write into the zone, create the record yourself. On a Microsoft DNS server:
- Open DNS Manager and expand Forward Lookup Zones.
- Right-click the domain, and choose Other New Records.
- Select Service Location (SRV), then Create Record.
- Enter service
_VLMCS, protocol_TCP, port number 1688, and the fully qualified name of the KMS host. - On a BIND 9.x server the equivalent record is
_vlmcs._TCP, type SRV, priority 0, weight 0, port 1688, pointing at the host’s FQDN or A name.
When all five causes are ruled out
- Check the client’s Application log for Event ID 12288 and 12289. A 12288 with no matching 12289 means the request left and nothing came back, which puts the fault on the network or the host, not on the client.
- On the host, look in the Key Management Service log for Event ID 12290. It records each client that contacts the host, with the client’s CMID and the count at the time.
- Look for Event ID 12293 on the host. It reports that the host failed to publish its DNS records, which is the cause dressed as a symptom.
- Confirm the client is actually using a GVLK.
slmgr /dlvshould describe it as VOLUME_KMSCLIENT. A machine carrying a MAK or a retail key will never talk to a KMS host at all. - If the host has been moved to a non-default port with
slmgr /sprt, every client and the SRV record must carry that port too.
The clock this all runs on
| Interval | Default | Changed with |
|---|---|---|
| Activation validity | 180 days | Not adjustable on the client |
| Renewal attempt once activated | 7 days | slmgr /sri |
| Retry while unactivated | 2 hours | slmgr /sai |
| Grace after the 180 days lapse | 30 days, then notification mode | Not adjustable |
That spread is why this is rarely an emergency on the day it appears. A machine that activated last week has months of margin, and a client that cannot reach the host keeps asking every two hours until someone fixes DNS. It becomes urgent only when a whole estate has been unable to renew for six months and the grace period expires on all of them within days of each other.
Every code this article covers
| Code | What it points at | Source |
|---|---|---|
0xC004F074 |
The licensing service could not activate the machine because no KMS host could be contacted | Microsoft Learn |
0x8007232B |
DNS name does not exist: the client cannot find the KMS service record in DNS | Microsoft Learn |
0x8007251D |
No records found for the DNS query, so the client could not locate the KMS SRV record | Microsoft Learn |
0x8007232A |
DNS server failure: the server answered the query with an error rather than an empty result | Microsoft Learn |
0x80092328 |
DNS name does not exist. Microsoft publishes the same meaning for this as for 0x8007232B | Microsoft Learn |
0x80072338 |
Seen during KMS discovery on the client alongside the DNS codes above; treat it as the same discovery failure and diagnose with nslookup and a port test | not published by the vendor |
Confirm the fix worked
slmgr /dlvon the client reports Licence Status: Licensed.- The KMS machine name and port in that output are the host you intended, not a stale one.
- The client’s Application log shows a 12289 following the 12288, with the activation flag set to 1.
- On the host, the Key Management Service log records a 12290 for that client.
- Reboot one client and confirm it stays activated without anyone touching it.
Questions people ask about this
Do I need to buy anything to clear 0xC004F074?
No. This is an infrastructure fault. The GVLK on the client is correct and your entitlement is untouched; the client simply cannot reach the host. Buying becomes a question only if you have no KMS host and no volume agreement behind one, which is a different conversation from this error.
How long can a client sit like this before it matters?
A KMS activation is good for 180 days and the client tries to renew every seven. If the 180 days do lapse there is a further 30-day grace period before Windows moves to notification mode. You have a wide margin, but it expires quietly and across a whole estate at once.
Can I point a client at a KMS host in another domain?
Yes. DNS discovery is limited to the client’s own domain, but slmgr /skms accepts any reachable host name or address in any domain, provided TCP 1688 is open between them. For more than a handful of machines, publish into the extra domains with DnsDomainPublishList instead.
Does the KMS host have to be a domain controller?
No. Any supported Windows Server can serve activations. It needs a valid KMS host key, network reachability on 1688, and rights to publish its record – or a record created for it by hand.
Why did activation fail when DNS and the firewall both check out?
Check the clocks. Microsoft names a difference of more than four hours between client and host as a cause of this code, and nothing in the client’s error message points at it. w32tm /resync on the client is the documented fix.
