Welcome to the py-kms documentation!

Contents:

Contributing

You want to improve this project? Awesome! But before you write or modify the existing source code, please note the following guideline:

  • Always make sure to add your changes to the wiki.

  • 8-space indentation without tabs.

  • Docstrings as this:

    """ This is single line docstring. """
    """ This is a
    """ multiline comment.
  • Wrap lines only if really long (it does not matter 79 chars return)

  • For the rest a bit as it comes with a look at PEP8 :)

Documentation

What follows are some detailed explanations how the KMS infrastructure works.

Understanding Key Management Service

KMS activates Microsoft products on a local network, eliminating the need for individual computers to connect to Microsoft. To do this, KMS uses a client–server topology. A KMS client locates a KMS server by using DNS or a static configuration, then contact it by using Remote Procedure Call (RPC) and tries to activate against it. KMS can activate both physical computers and virtual machines, but a network must meet or exceed the activation threshold (minimum number of computers that KMS requires) of 25. For activation, KMS clients on the network need to install a KMS client key (General Volume License Key, GVLK), so the product no longer asks Microsoft server but a user–defined server (the KMS server) which usually resides in a company’s intranet.

py-kms is a free open source KMS server emulator written in Python, while Microsoft gives their KMS server only to corporations that signed a Select contract. Furthermore py-kms never refuses activation since it is without restrictions, while the Microsoft KMS server only activates the products the customer has paid for. py-kms supports KMS protocol versions 4, 5 and 6.

Although py-kms does neither require an activation key nor any payment, it is not meant to run illegal copies of Windows. Its purpose is to ensure that owners of legal copies can use their software without restrictions, e.g. if you buy a new computer or motherboard and your key will be refused activation from Microsoft servers due to hardware changes.

Activation with py-kms is achieved with the following steps:

  1. Run py-kms on a computer in the network (this is KMS server or local host).

  2. Install the product on client (or said remote host, which is the computer sending data to local host) and enter the GVLK.

  3. Configure the client to use the KMS server.

Note that KMS activations are only valid for 180 days, the activation validity interval, or 30 to 45 days with consumer-only products. To remain activated, KMS client computers must renew their activation by connecting to the KMS server at least once every 180 days. For this to work, you have to should ensure that a KMS server is always reachable for all clients on the network. Also remember you can’t activate Windows 8.1 (and above) on a KMS server hosted on the same machine (the KMS server must be a different computer than the client).

About GVLK keys

The GVLK keys for products sold via volume license contracts (renewal every 180 days) are published on Microsoft’s Technet web site.

There are also not official keys for consumer-only versions of Windows that require activation renewal every 45 days (Windows 8.1) or 30 days (Windows 8). A more complete and well defined list is available here.

SLMGR and OSPP commands

The software License Manager (slmgr.vbs) is a Visual Basic script used to configure and retrieve Volume Activation information. The script can be run locally or remotely on the target computer, using the Windows-based script host (wscript.exe) or the command-based script host (cscript.exe) - administrators can specify which script engine to use. If no script engine is specified, SLMGR runs using the default script engine (it is recommended to utilize the cscript.exe script engine that resides in the system32 directory). The Software Licensing Service must be restarted for any changes to take effect. To restart it, the Microsoft Management Console (MMC) Services can be used or running the following command:

net stop sppsvc && net start sppsvc

The SLMGR requires at least one parameter. If the script is run without any parameters, it displays help information. The general syntax of slmgr.vbs is as follows (using the cscript.exe as the script engine):

cscript slmgr.vbs /parameter
cscript slmgr.vbs [ComputerName] [User] [Password] [Option]

Where command line options are:

[ComputerName]  Name of a remote computer (default is local computer).
[User]          Account with the required privilege on the remote computer.
[Password]      Password for the account with required privileges on the remote compute.
[Option]        Options are shown in the table below.
SLMGR

Following tables lists SLMGR more relevant options and a brief description of each. Most of the parameters configure the KMS host.

Global options Description
/ipk <ProductKey> Attempts to install a 5×5 ProductKey for Windows or other application identified by the ProductKey. If the key is valid, this is installed. If a key is already installed, it's silently replaced.
/ato [ActivationID] Prompts Windows to attempt online activation, for retail and volume systems with KMS host key. Specifying the ActivationID parameter isolates the effects of the option to the edition associated with that value.
/dli [ActivationID | All] Display license information. Specifying the ActivationID parameter displays the license information for the specified edition associated with that ActivationID. Specifying All will display all applicable installed products’ license information. Useful for retrieve the current KMS activation count from the KMS host.
/dlv [ActivationID | All] Display detailed license information.
/xpr [ActivationID] Display the activation expiration date for the current license state.
Advanced options Description
/cpky Some servicing operations require the product key to be available in the registry during Out-of-Box Experience (OOBE) operations. So this option removes the product key from the registry to prevent from being stolen by malicious code.
/ilc <LicenseFile> Installs the LicenseFile specified by the required parameter.
/rilc Reinstalls all licenses stored in %SystemRoot%\system32\oem and %SystemRoot%\System32\spp\tokens.
/rearm Resets the activation timers.
/rearm-app <ApplicationID> Resets the licensing status of the specified application.
/rearm-sku <ApplicationID> Resets the licensing status of the specified SKU.
/upk [ActivationID] Uninstalls the product key of the current Windows edition. After a restart, the system will be in an unlicensed state unless a new product key is installed.
/dti [ActivationID] Displays installation ID for offline activation of the KMS host for Windows (default) or the application that is identified when its ActivationID is provided.
/atp [ConfirmationID][ActivationID] Activate product with user-provided ConfirmationID.
KMS client options Description
/skms <Name[:Port] | : port> [ActivationID] Specifies the name and the port of the KMS host computer to contact. Setting this value disables auto-detection of the KMS host. If the KMS host uses IPv6 only, the address must be specified in the format [hostname]:port.
/skms-domain <FQDN> [ActivationID] Sets the specific DNS domain in which all KMS SRV records can be found. This setting has no effect if the specific single KMS host is set with the /skms option. Use this option, especially in disjoint namespace environments, to force KMS to ignore the DNS suffix search list and look for KMS host records in the specified DNS domain instead.
/ckms [ActivationID] Removes the specified KMS hostname, address, and port information from the registry and restores KMS auto-discovery behavior.
/skhc Enables KMS host caching (default), which blocks the use of DNS priority and weight after the initial discovery of a working KMS host. If the system can no longer contact the working KMS host, discovery will be attempted again.
/ckhc Disables KMS host caching. This setting instructs the client to use DNS auto-discovery each time it attempts KMS activation (recommended when using priority and weight).
/sai <ActivationInterval> Changes how often a KMS client attempts to activate itself when it cannot find a KMS host. Replace ActivationInterval with a number of minutes between 15 minutes an 30 days. The default setting is 120.
/sri <RenewalInterval> Changes how often a KMS client attempts to renew its activation by contacting a KMS host. Replace RenewalInterval with a number of minutes between 15 minutes an 30 days. The default setting is 10080 (7 days).
/sprt <PortNumber> Sets the TCP communications port on a KMS host. It replaces PortNumber with the TCP port number to use. The default setting is 1688.
/sdns Enables automatic DNS publishing by the KMS host.
/cdns Disables automatic DNS publishing by a KMS host.
/spri Sets the priority of KMS host processes to Normal.
/cpri Set the KMS priority to Low.
/act-type [ActivationType] [ActivationID] Sets a value in the registry that limits volume activation to a single type. ActivationType 1 limits activation to active directory only; 2 limits it to KMS activation; 3 to token-based activation. The 0 option allows any activation type and is the default value.
OSPP

The Office Software Protection Platform script (ospp.vbs) can help you to configure and test volume license editions of Office client products. You must open a command prompt by using administrator permissions and navigate to the folder that contains the mentioned script. The script is located in the folder of the Office installation (use \Office14 for Office 2010, \Office15 for Office 2013 and \Office16 for Office 2016): %installdir%\Program Files\Microsoft Office\Office15. If you are running a 32-bit Office on a 64-bit operating system, the script is located in the folder: %installdir%\Program Files (x86)\Microsoft Office\Office15.

Running OSPP requires the cscript.exe script engine. To see the help file, type the following command, and then press ENTER:

cscript ospp.vbs /?

The general syntax is as follows:

cscript ospp.vbs [Option:Value] [ComputerName] [User] [Password]

Where command line options are:

[Option:Value]  Specifies the option and Value to use to activate a product, install or uninstall a product key, install and display license information, set KMS host name and port, and remove KMS host. The options and values are listed in the tables below.
[ComputerName]  Name of the remote computer. If a computer name is not provided, the local computer is used.
[User]          Account that has the required permission on the remote computer.
[Password]      Password for the account. If a user account and password are not provided, the current credentials are used.
Global options Description
/act Activates installed Office product keys.
/inpkey:<ProductKey> Installs a ProductKey (replaces existing key) with a user-provided ProductKey.
/unpkey:<ProductKey> Uninstalls an installed ProductKey with the last five digits of the ProductKey to uninstall (as displayed by the /dstatus option).
/inslic:<LicenseFile> Installs a LicenseFile with user-provided path of the .xrm-ms license.
/dstatus Displays license information for installed product keys.
/dstatusall Displays license information for all installed licenses.
/dhistoryacterr Displays the failure history for MAK / Retail activation.
/dinstid Displays Installation ID for offline activation.
/actcid:<ConfirmationID> Activates product with user-provided ConfirmationID.
/rearm Resets the licensing status for all installed Office product keys.
/rearm:<ApplicationID> Resets the licensing status for an Office license with a user-provided SKUID value. Use this option with the SKUID value specified by using the /dstatus option if you have run out of rearms and have activated Office through KMS or Active Directory-based activation to gain an additional rearm.
/ddescr:<ErrorCode> Displays the description for a user-provided ErrorCode.
KMS client options Description
/dhistorykms Displays KMS client activation history.
/dcmid Displays KMS client computer ID (CMID)
/sethst:<HostName> Sets a KMS host name with a user-provided HostName.
/setprt:<Port> Sets a KMS port with a user-provided Port number.
/remhst Removes KMS hostname (sets port to default).
/cachst:<Value> Allows or denies KMS host caching. Parameter Value can be TRUE or FALSE.
/actype:<Value> (Windows 8 and later only) Sets volume activation type. Parameter Value can be: 1 (for Active Directory-based), 2 (for KMS), 0 (for both).
/skms-domain:<Value> (Windows 8 and later only) Sets the specific DNS domain in which all KMS SRV records can be found. This setting has no effect if the specific single KMS host is set by the /sethst option. Parameter Value is the Fully Qualified Domain Name (FQDN).
/ckms-domain (Windows 8 and later only) Clears the specific DNS domain in which all KMS SRV records can be found. The specific KMS host is used if it is set by the /sethst option. Otherwise, auto-discovery of the KMS host is used.

Supported Products

Note that it is possible to activate all versions in the VL (Volume License) channel, so long as you provide the proper key to let Windows know that it should be activating against a KMS server. KMS activation can’t be used for Retail channel products, however you can install a VL product key specific to your edition of Windows even if it was installed as Retail. This effectively converts Retail installation to VL channel and will allow you to activate from a KMS server. However, this is not valid for Office’s products, so Office, Project and Visio must be always volume license versions. Newer version may work as long as the KMS protocol does not change…

Further References

  • [1] https://forums.mydigitallife.net/threads/emulated-kms-servers-on-non-windows-platforms.50234

  • [2] https://forums.mydigitallife.net/threads/discussion-microsoft-office-2019.75232

  • [3] https://forums.mydigitallife.net/threads/miscellaneous-kms-related-developments.52594

  • [4] https://forums.mydigitallife.net/threads/kms-activate-windows-8-1-en-pro-and-office-2013.49686

  • [5] https://github.com/myanaloglife/py-kms

  • [6] https://github.com/Wind4/vlmcsd

  • [7] https://github.com/ThunderEX/py-kms

  • [8] https://github.com/CNMan/balala/blob/master/pkconfig.csv

  • [9] http://www.level7techgroup.com/docs/kms_overview.pdf

  • [10] https://www.dell.com/support/article/it/it/itbsdt1/sln266176/windows-server-using-the-key-management-service-kms-for-activation-of-volume-licensed-systems?lang=en

  • [11] https://social.technet.microsoft.com/Forums/en-US/c3331743-cba2-4d92-88aa-9633ac74793a/office-2010-kms-current-count-remain-at-10?forum=officesetupdeployprevious

  • [12] https://betawiki.net/wiki/Microsoft_Windows

  • [13] https://thecollectionbook.info/builds/windows

  • [14] https://www.betaarchive.com/forum/viewtopic.php%3Ft%3D29131+&cd=10&hl=it&ct=clnk&gl=it

  • [15] https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=12&cad=rja&uact=8&ved=2ahUKEwjmvZihtOHeAhVwyoUKHSjeD5Q4ChAWMAF6BAgHEAI&url=ftp%3A%2F%2Flynas.ittc.vu.lt%2Fpub%2FMicrosoft%2FWindows%2520Vista%2FWindows%2520Vista_Volume_Activation_2.0%2FWindows%2520Vista%2520Volume%2520Activation%2FWindows%2520Vista_Volume_Activation_2.0%2Fvolume%2520activation%25202%25200%2520step-by-step%2520guide.doc&usg=AOvVaw3kqhCu3xT-3r416DRGUUs_

  • [16] https://www.itprotoday.com/windows-78/volume-activation-server-2008

  • [17] https://docs.microsoft.com/en-us/windows-server/get-started-19/activation-19

  • [18] https://docs.microsoft.com/en-us/windows-server/get-started/windows-server-release-info

  • [19] https://support.microsoft.com/en-us/help/13853/windows-lifecycle-fact-sheet

Getting Started

What follows are some guides how to start the pykms_Server.py script, which provides the emulated server.

Running as a service

You can simply manage a daemon that runs as a background process. This can be achieved by using any of the notes below or by writing your own solution.

Docker

If you wish to get py-kms just up and running without installing any dependencies or writing own scripts: Just use Docker ! Docker also solves problems regarding the explicit IPv4 and IPv6 usage (it just supports both). The following command will download, “install” and start py-kms and also keep it alive after any service disruption.

docker run -d --name py-kms --restart always -p 1688:1688 -v /etc/localtime:/etc/localtime:ro ghcr.io/py-kms-organization/py-kms

If you just want to use the image and don’t want to build them yourself, you can always use the official image at the GitHub Container Registry (ghcr.io/py-kms-organization/py-kms). To ensure that you are using always the latest version you should check something like watchtower out!

Tags

There are currently three tags of the image available (select one just by appending :<tag> to the image from above):

  • latest, currently the same like minimal.

  • minimal, which is based on the python3 minimal configuration of py-kms. This tag does NOT include sqlite support !

  • python3, which is fully configurable and equipped with sqlite support and a web-interface (make sure to expose port 8080) for management.

Wait… Web-interface? Yes! py-kms now comes with a simple web-ui to let you browse the known clients or its supported products. In case you wonder, here is a screenshot of the web-ui (note that this screenshot may not reflect the current state of the ui):

web-ui

Architectures

There are currently the following architectures available (if you need an other, feel free to open an issue):

  • amd64

  • arm32v6 Raspberry PI 1 (A, A+, B, B+, Zero)

  • arm32v7 Raspberry PI 2 (B)

  • arm64v8 Raspberry PI 2 (B v1.2), Raspberry PI 3 (A+, B, B+), Raspberry PI 4 (B)

Please note that any architecture other than the classic amd64 is slightly bigger (~4 MB), caused by the use of qemu during building.

Docker Compose

You can use docker-compose instead of building and running the Dockerfile, so you do not need to respecify your settings again and again. The following Docker Compose file will deploy the latest image with the log into your local directory. Make sure to take a look into the entrypoint.py script to see all supported variable mappings!

version: '3'

services:
  kms:
    image: ghcr.io/py-kms-organization/py-kms:python3
    ports:
      - 1688:1688
      - 8080:8080
    environment:
      IP: "::"
      HWID: RANDOM
      LOGLEVEL: INFO
    restart: always
    volumes:
      - ./db:/home/py-kms/db
      - /etc/localtime:/etc/localtime:ro
Parameters

Below is a little bit more extended run command, detailing all the different supported environment variables to set. For further reference see the start parameters for the docker environment.

docker run -it -d --name py3-kms \
    -p 8080:8080 \
    -p 1688:1688 \
    -v /etc/localtime:/etc/localtime:ro \
    --restart unless-stopped ghcr.io/py-kms-organization/py-kms:[TAG]

You can omit the -p 8080:8080 option if you plan to use the minimal or latest image, which does not include the sqlite module support.

Systemd

If you are running a Linux distro using systemd, create the file: sudo nano /etc/systemd/system/py3-kms.service, then add the following (change it where needed) and save:

[Unit]
Description=py3-kms
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=always
RestartSec=1
KillMode=process
User=root
ExecStart=/usr/bin/python3 </path/to/your/pykms/files/folder>/py-kms/pykms_Server.py :: 1688 -V DEBUG -F </path/to/your/log/files/folder>/pykms_logserver.log

[Install]
WantedBy=multi-user.target

Check syntax with sudo systemd-analyze verify py3-kms.service, correct file permission (if needed) sudo chmod 644 /etc/systemd/system/py3-kms.service, then reload systemd manager configuration sudo systemctl daemon-reload, start the daemon sudo systemctl start py3-kms.service and view its status sudo systemctl status py3-kms.service. Check if daemon is correctly running with cat </path/to/your/log/files/folder>/pykms_logserver.log. Finally a few generic commands useful for interact with your daemon here.

Upstart (deprecated)

If you are running a Linux distro using upstart (deprecated), create the file: sudo nano /etc/init/py3-kms.conf, then add the following (change it where needed) and save:

description "py3-kms"
author "SystemRage"
env PYTHONPATH=/usr/bin
env PYKMSPATH=</path/to/your/pykms/files/folder>/py-kms
env LOGPATH=</path/to/your/log/files/folder>/pykms_logserver.log
start on runlevel [2345]
stop on runlevel [016]
exec $PYTHONPATH/python3 $PYKMSPATH/pykms_Server.py :: 1688 -V DEBUG -F $LOGPATH
respawn

Check syntax with sudo init-checkconf -d /etc/init/py3-kms.conf, then reload upstart to recognise this process sudo initctl reload-configuration. Now start the service sudo start py3-kms, and you can see the logfile stating that your daemon is running: cat </path/to/your/log/files/folder>/pykms_logserver.log. Finally a few generic commands useful for interact with your daemon here.

Windows

If you are using Windows, to run pykms_Server.py as service you need to install pywin32, then you can create a file for example named kms-winservice.py and put into it this code:

import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
import subprocess

class AppServerSvc (win32serviceutil.ServiceFramework):
    _svc_name_ = "py-kms"
    _svc_display_name_ = "py-kms"
    _proc = None
    _cmd = ["C:\Windows\Python27\python.exe", "C:\Windows\Python27\py-kms\pykms_Server.py"] # UPDATE THIS - because Python 2.7 is end of life and you will use other parameters anyway

    def __init__(self,args):
        win32serviceutil.ServiceFramework.__init__(self,args)
        self.hWaitStop = win32event.CreateEvent(None,0,0,None)
        socket.setdefaulttimeout(60)

    def SvcStop(self):
        self.killproc()
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)

    def SvcDoRun(self):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                              servicemanager.PYS_SERVICE_STARTED,
                              (self._svc_name_,''))
        self.main()

    def main(self):
        self._proc = subprocess.Popen(self._cmd)
        self._proc.wait()

    def killproc(self):
        self._proc.kill()

if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(AppServerSvc)

Now in a command prompt type C:\Windows\Python27\python.exe kms-winservice.py install to install the service. Display all the services with services.msc and find the service associated with py-kms, change the startup type from manual to auto. Finally Start the service. If this approach fails, you can try to use Non-Sucking Service Manager or Task Scheduler as described here.

Other Platforms

They might be useful to you:

Manual Execution

Dependencies

  • Python 3.x.

  • If the tzlocal module is installed, the “Request Time” in the verbose output will be converted into local time. Otherwise, it will be in UTC.

  • It can use the sqlite3 module, storing activation data in a database so it can be recalled again.

  • Installation example on Ubuntu / Mint (requirements.txt is from the sources):

    • sudo apt-get update

    • sudo apt-get install python3-pip

    • pip3 install -r requirements.txt (on Ubuntu Server 22, you’ll need pysqlite3-binary - see this issue)

Startup

A Linux user with ip addr command can get his KMS IP (Windows users can try ipconfig /all).

user@host ~ $ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp6s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether **:**:**:**:**:** brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.102/24 brd 192.168.1.255 scope global dynamic noprefixroute enp6s0
       valid_lft 860084sec preferred_lft 860084sec
    inet6 ****:****:****:****:****:****:****:****/64 scope global dynamic noprefixroute 
       valid_lft 6653sec preferred_lft 3052sec
    inet6 ****::****:****:****:****/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

In the example above is 192.168.1.102 the ip we want to listen on, so it is this command (note you can omit the ip AND port specification if you just wish to listen on all interfaces with port 1688):

user@host ~/path/to/folder/py-kms $ python3 pykms_Server.py 192.168.1.102 1688

To stop pykms_Server.py, in the same bash window where code running, simply press CTRL+C. Alternatively, in a new bash window, use kill <pid> command (you can type ps aux first and have the process ) or killall <name_of_server>.

Quick Guide

The following are just some brief notes about parameters handling. For a more detailed description see here.

  • To generate a random HWID use -w option: python3 pykms_Server.py -w RANDOM.

  • To get the HWID from any server use the client, for example type: python3 pykms_Client.py :: 1688 -m Windows8.1 -V INFO.

  • To change your logfile path use -F option, for example: python3 pykms_Server.py -F /path/to/your/logfile.log -V DEBUG.

  • To view a minimal set of logging information use -V MININFO option, for example: python3 pykms_Server.py -F /path/to/your/logfile.log -V MININFO.

  • To redirect logging on stdout use -F STDOUT option, for example: python3 pykms_Server.py -F STDOUT -V DEBUG.

  • You can create logfile and view logging information on stdout at the same time with -F FILESTDOUT option, for example: python3 pykms_Server.py -F FILESTDOUT /path/to/your/logfile.log -V DEBUG.

  • With -F STDOUTOFF you disable all stdout messages (but a logfile will be created), for example: python3 pykms_Server.py -F STDOUTOFF /path/to/your/logfile.log -V DEBUG.

  • With -F FILEOFF you disable logfile creation.

  • Select timeout (seconds) for py-kms with -t0 option, for example python3 pykms_Server.py -t0 10.

  • Option -y enables printing asynchronously of messages (pretty / logging).

GVLK Keys

These are keys, which can be used to activate a product with py-kms (note this keys are provided officially by Microsoft). py-kms will not reject any of your keys, instead the product will often revalidate the given key - and sometimes even reject it by itself (often due too many uses - in that case try to use an other one).

Windows

Windows Server 2022

Product GVLK
Windows Server 2022 Datacenter WX4NM-KYWYW-QJJR4-XV3QB-6VM33
Windows Server 2022 Standard VDYBN-27WPP-V4HQT-9VMD4-VMK7H
Windows Server 2022 Datacenter Azure Edition NTBV8-9K7Q8-V27C6-M2BTV-KHMXV

Windows Server 2019

Product GVLK
Windows Server 2019 Datacenter WMDGN-G9PQG-XVVXX-R3X43-63DFG
Windows Server 2019 Standard N69G4-B89J2-4G8F4-WWYCC-J464C
Windows Server 2019 Essentials WVDHN-86M7X-466P6-VHXV7-YY726
Windows Server 2019 Azure Core FDNH6-VW9RW-BXPJ7-4XTYG-239TB
Windows Server 2019 Datacenter Semi-Annual Channel (v.1809) 6NMRW-2C8FM-D24W7-TQWMY-CWH2D
Windows Server 2019 Standard Semi-Annual Channel (v.1809) N2KJX-J94YW-TQVFB-DG9YT-724CC
Windows Server 2019 ARM64 GRFBW-QNDC4-6QBHG-CCK3B-2PR88

Windows Server 2016

Product GVLK
Windows Server 2016 Standard Semi-Annual Channel (v.1803) PTXN8-JFHJM-4WC78-MPCBR-9W4KR
Windows Server 2016 Datacenter Semi-Annual Channel (v.1803) 2HXDN-KRXHB-GPYC7-YCKFJ-7FVDG
Windows Server 2016 Datacenter Semi-Annual Channel (v.1709) 6Y6KB-N82V8-D8CQV-23MJW-BWTG6
Windows Server 2016 Standard Semi-Annual Channel (v.1709) DPCNP-XQFKJ-BJF7R-FRC8D-GF6G4
Windows Server 2016 ARM64 K9FYF-G6NCK-73M32-XMVPY-F9DRR
Windows Server 2016 Datacenter CB7KF-BWN84-R7R2Y-793K2-8XDDG
Windows Server 2016 Standard WC2BQ-8NRM3-FDDYY-2BFGV-KHKQY
Windows Server 2016 Essentials JCKRF-N37P4-C2D82-9YXRT-4M63B
Windows Server 2016 Cloud Storage QN4C6-GBJD2-FB422-GHWJK-GJG2R
Windows Server 2016 Azure Core VP34G-4NPPG-79JTQ-864T4-R3MQX
WNCYY-GFBH2-M4WTT-XQ2FP-PG2K9

Windows 10 & Windows 11

Product GVLK
Windows 10/11 Professional Workstation NRG8B-VKK3Q-CXVCJ-9G2XF-6Q84J
Windows 10/11 Professional Workstation N 9FNHH-K3HBT-3W4TD-6383H-6XYWF
Windows 10/11 Enterprise G YYVX9-NTFWV-6MDM3-9PT4T-4M68B
Windows 10/11 Enterprise G N 44RPN-FTY23-9VTTB-MP9BX-T84FV
Windows 10 Enterprise LTSC 2019/2021 M7XTQ-FN8P6-TTKYV-9D4CC-J462D
Windows 10 Enterprise LTSC 2019/2021 N 92NFX-8DJQP-P6BBQ-THF9C-7CG2H
Windows 10/11 Remote Server 7NBT4-WGBQX-MP4H7-QXFF8-YP3KX
Windows 10 Enterprise for Remote Sessions
Windows 10 Enterprise for virtual desktops
Windows 11 Enterprise multi-session
CPWHC-NT2C7-VYW78-DHDB2-PG3GK
Windows 10 S (Lean) NBTWJ-3DR69-3C4V8-C26MC-GQ9M6
Windows 10/11 Professional W269N-WFGWX-YVC9B-4J6C9-T83GX
Windows 10/11 Professional N MH37W-N47XK-V7XM9-C7227-GCQG9
HMNWJ-V69R6-B2CDC-8P7VT-2373K
Windows 10/11 Professional Education 6TP4R-GNPTD-KYYHQ-7B7DP-J447Y
Windows 10/11 Professional Education N YVWGF-BXNMC-HTQYQ-CPQ99-66QFC
Windows 10/11 Education NW6C2-QMPVW-D7KKK-3GKT6-VCFB2
F48BJ-8NX82-MRVY9-PF8BW-HMHY2
Windows 10/11 Education N 2WH4N-8QGBV-H22JP-CT43Q-MDWWJ
PPWGW-8NW9C-J77Q9-8WHB9-QV64W
Windows 10/11 Enterprise NPPR9-FWDCX-D2C8J-H872K-2YT43
96YNV-9X4RP-2YYKB-RMQH4-6Q72D
TN6CM-KCVXP-VVP8X-YVCF7-R9BDH
3PMKQ-YNVGT-HFJGG-2F4FQ-9D6T7
Windows 10/11 Enterprise N DPH2V-TTNVB-4X9Q3-TJR4H-KHJW4
WGGHN-J84D6-QYCPR-T7PJ7-X766F
Windows 10/11 Enterprise S H76BG-QBNM7-73XY9-V6W2T-684BJ
Windows 10/11 Enterprise S N X4R4B-NV6WD-PKTVK-F98BH-4C2J8
Windows 10 Enterprise 2015 LTSB WNMTR-4C88C-JK8YV-HQ7T2-76DF9
Windows 10 Enterprise 2015 LTSB N 2F77B-TNFGY-69QQF-B8YKP-D69TJ
RW7WN-FMT44-KRGBK-G44WK-QV7YK
Windows 10 Enterprise 2016 LTSB DCPHK-NFMTC-H88MJ-PFHPY-QJ4BJ
Windows 10 Enterprise 2016 LTSB N QFFDN-GRT3P-VKWWX-X7T3R-8B639
Windows 10/11 Home
Windows 10/11 Core
TX9XD-98N7V-6WMQ6-BX7FG-H8Q99
33QT6-RCNYF-DXB4F-DGP7B-7MHX9
Windows 10/11 Home N
Windows 10/11 Core N
3KHY7-WNT83-DGQKR-F7HPR-844BM
CP4KF-NG6TC-9K6QF-P6GTT-H8RBM
Windows 10/11 Home Single Language
Windows 10 Core Single Language
7HNRX-D7KGG-3K4RQ-4WPJ4-YTDFH
9HGRW-NH2CQ-XQHJD-YCRWB-6VJV7
4NX46-6DHCG-MR3PH-9FMCX-3RQ3G
Windows 10/11 Home Country Specific
Windows 10 Core Country Specific
PVMJN-6DFY6-9CCP6-7BKTT-D3WVR
JN9HR-MH7K4-DBPDD-TFTXF-Q9MMF

Windows Server 2012 R2

Product GVLK
Windows Server 2012 R2 Standard D2N9P-3P6X9-2R39C-7RTCD-MDVJX
Windows Server 2012 R2 Datacenter W3GGN-FT8W3-Y4M27-J84CP-Q3VJ9
Windows Server 2012 R2 Essentials KNC87-3J2TX-XB4WP-VCPJV-M4FWM
Windows Server 2012 R2 Cloud Storage 3NPTF-33KPT-GGBPR-YX76B-39KDD

Windows 8.1

Product GVLK
Windows 8.1 Professional GCRJD-8NW9H-F2CDX-CCM8D-9D6T9
Windows 8.1 Professional N HMCNV-VVBFX-7HMBH-CTY9B-B4FXY
Windows 8.1 Professional WMC 789NJ-TQK6T-6XTH8-J39CJ-J8D3P
Windows 8.1 Enterprise MHF9N-XY6XB-WVXMC-BTDCT-MKKG7
FHQNR-XYXYC-8PMHT-TV4PH-DRQ3H
Windows 8.1 Enterprise N TT4HM-HN7YT-62K67-RGRQJ-JFFXW
NDRDJ-3YBP2-8WTKD-CK7VB-HT8KW
Windows 8.1 Embedded Industry Automotive VHXM3-NR6FT-RY6RT-CK882-KW2CJ
Windows 8.1 Embedded Industry Enterprise FNFKF-PWTVT-9RC8H-32HB2-JB34X
Windows 8.1 Embedded Industry Professional NMMPB-38DD4-R2823-62W8D-VXKJB
Windows 8.1 Core M9Q9P-WNJJT-6PXPY-DWX8H-6XWKK
Windows 8.1 Core N 7B9N3-D94CG-YTVHR-QBPX3-RJP64
Windows 8.1 Core Single Language BB6NG-PQ82V-VRDPW-8XVD2-V8P66
Windows 8.1 Core Country Specific NCTT7-2RGK8-WMHRF-RY7YQ-JTXG3
Windows 8.1 Core ARM XYTND-K6QKT-K2MRH-66RTM-43JKP
Windows 8.1 Core Connected 3PY8R-QHNP9-W7XQD-G6DPH-3J2C9
Windows 8.1 Core Connected N Q6HTR-N24GM-PMJFP-69CD8-2GXKR
Windows 8.1 Core Connected Country Specific R962J-37N87-9VVK2-WJ74P-XTMHR
Windows 8.1 Core Connected Single Language KF37N-VDV38-GRRTV-XH8X6-6F3BB
Windows 8.1 Professional Student MX3RK-9HNGX-K3QKC-6PJ3F-W8D7B
Windows 8.1 Professional Student N TNFGH-2R6PB-8XM3K-QYHX2-J4296

Windows Server 2012

Product GVLK
Windows Server 2012
Windows 8 Core
BN3D2-R7TKB-3YPBD-8DRP2-27GG4
Windows Server 2012 N
Windows 8 Core N
8N2M2-HWPGY-7PGT9-HGDD8-GVGGY
Windows Server 2012 Single Language
Windows 8 Core Single Language
2WN2H-YGCQR-KFX6K-CD6TF-84YXQ
Windows Server 2012 Country Specific
Windows 8 Core Country Specific
4K36P-JN4VD-GDC6V-KDT89-DYFKP
Windows Server 2012 Standard XC9B7-NBPP2-83J2H-RHMBY-92BT4
Windows Server 2012 MultiPoint Standard HM7DN-YVMH3-46JC3-XYTG7-CYQJJ
Windows Server 2012 MultiPoint Premium XNH6W-2V9GX-RGJ4K-Y8X6F-QGJ2G
Windows Server 2012 Datacenter 48HP8-DN98B-MYWDG-T2DCC-8W83P

Windows 8

Product GVLK
Windows 8 Professional NG4HW-VH26C-733KW-K6F98-J8CK4
Windows 8 Professional N XCVCF-2NXM9-723PB-MHCB7-2RYQQ
Windows 8 Professional WMC GNBB8-YVD74-QJHX6-27H4K-8QHDG
NQ3PX-BBY8Y-RRHMM-TBHFW-PJ866
Windows 8 Enterprise 32JNW-9KQ84-P47T8-D8GGY-CWCK7
8M9BN-YB7W9-YV3VJ-7WMGG-MKH3V
Windows 8 Enterprise N JMNMF-RHW7P-DMY6X-RF3DR-X2BQT
NCVKH-RB9D4-R86X8-GB8WG-4M2K6
Windows 8 Embedded Industry Professional JVPDN-TBWJW-PD94V-QYKJ2-KWYQM
RYXVT-BNQG7-VD29F-DBMRY-HT73M
Windows 8 Embedded Industry Enterprise NKB3R-R2F8T-3XCDP-7Q2KW-XWYQ2
Windows 8 Core
Windows Server 2012
BN3D2-R7TKB-3YPBD-8DRP2-27GG4
Windows 8 Core N
Windows Server 2012 N
8N2M2-HWPGY-7PGT9-HGDD8-GVGGY
Windows 8 Core Single Language
Windows Server 2012 Single Language
2WN2H-YGCQR-KFX6K-CD6TF-84YXQ
Windows 8 Core Country Specific
Windows Server 2012 Country Specific
4K36P-JN4VD-GDC6V-KDT89-DYFKP
Windows 8 Core ARM DXHJF-N9KQX-MFPVR-GHGQK-Y7RKV

Windows Server 2008 R2

Product GVLK
Windows MultiPoint Server 2010 736RG-XDKJK-V34PF-BHK87-J6X3K
Windows Server 2008 R2 Web 6TPJF-RBVHG-WBW2R-86QPH-6RTM4
Windows Server 2008 R2 HPC edition TT8MH-CG224-D3D7Q-498W2-9QCTX
Windows Server 2008 R2 Standard YC6KT-GKW9T-YTKYR-T4X34-R7VHC
Windows Server 2008 R2 Enterprise 489J6-VHDMP-X63PK-3K798-CPX3Y
Windows Server 2008 R2 Datacenter 74YFP-3QFB3-KQT8W-PMXWJ-7M648
Windows Server 2008 R2 for Itanium-based Systems GT63C-RJFQ3-4GMB6-BRFB9-CB83V

Windows 7

Product GVLK
Windows 7 Professional FJ82H-XT6CR-J8D7P-XQJJ2-GPDD4
MYKDJ-XV4CV-M2D3P-KDVY4-MPTW8
Windows 7 Professional N MRPKT-YTG23-K7D7T-X2JMM-QY7MG
Windows 7 Professional E W82YF-2Q76Y-63HXB-FGJG9-GF7QX
Windows 7 Enterprise 33PXH-7Y6KF-2VJC9-XBBR8-HVTHH
Windows 7 Enterprise N YDRBP-3D83W-TY26F-D46B2-XCKRJ
Windows 7 Enterprise E C29WB-22CC8-VJ326-GHFJW-H9DH4
Windows 7 Embedded POSReady YBYF6-BHCR3-JPKRB-CDW7B-F9BK4
Windows 7 Embedded ThinPC 73KQT-CD9G6-K7TQG-66MRP-CQ22C
Windows 7 Embedded Standard XGY72-BRBBT-FF8MH-2GG8H-W7KCW

Windows Server 2008

Product GVLK
Windows Server 2008 Web WYR28-R7TFJ-3X2YQ-YCY4H-M249D
Windows Server 2008 Standard TM24T-X9RMF-VWXK6-X8JC9-BFGM2
Windows Server 2008 Standard without Hyper-V W7VD6-7JFBR-RX26B-YKQ3Y-6FFFJ
Windows Server 2008 Enterprise YQGMW-MPWTJ-34KDK-48M3W-X4Q6V
Windows Server 2008 Enterprise without Hyper-V 39BXF-X8Q23-P2WWT-38T2F-G3FPG
Windows Server 2008 HPC edition (Computer Cluster) RCTX3-KWVHP-BR6TB-RB6DM-6X7HP
Windows Server 2008 Datacenter 7M67G-PC374-GR742-YH8V4-TCBY3
Windows Server 2008 Datacenter without Hyper-V 22XQ2-VRXRG-P8D42-K34TD-G3QQC
Windows Server 2008 for Itanium-Based Systems 4DWFP-JF3DJ-B7DTH-78FJB-PDRHK

Windows Vista

Product GVLK
Windows Vista Business YFKBB-PQJJV-G996G-VWGXY-2V3X8
Windows Vista Business N HMBQG-8H2RH-C77VX-27R82-VMQBT
Windows Vista Enterprise VKK3X-68KWM-X2YGT-QR4M6-4BWMV
Windows Vista Enterprise N VTC42-BM838-43QHV-84HX6-XJXKV

Windows Previews

Product GVLK
Windows Server 2019 Datacenter [Preview] 6XBNX-4JQGW-QX6QG-74P76-72V67
Windows Server 2019 Standard [Preview] MFY9F-XBN2F-TYFMP-CCV49-RMYVH
Windows 10 Home / Core [Pre-Release] ?????-?????-?????-?????-?????
Windows 10 Home / Core Country Specific [Pre-Release] ?????-?????-?????-?????-?????
Windows 10 Home / Core N [Pre-Release] ?????-?????-?????-?????-?????
Windows 10 Home / Core Single Language [Pre-Release] ?????-?????-?????-?????-?????
Windows 10 Home / Core [Technical Preview] ?????-?????-?????-?????-?????
Windows 10 Education [Pre-Release] ?????-?????-?????-?????-?????
Windows 10 Education N [Pre-Release] ?????-?????-?????-?????-?????
Windows 10 Enterprise [Preview] QNMXX-GCD3W-TCCT4-872RV-G6P4J
Windows 10 Enterprise 2015 LTSB [Pre-Release] ?????-?????-?????-?????-?????
Windows 10 Enterprise 2015 LTSB N [Pre-Release] ?????-?????-?????-?????-?????
Windows 10 Enterprise N [Pre-Release] ?????-?????-?????-?????-?????
Windows 10 Professional N [Pre-Release] ?????-?????-?????-?????-?????
Windows 10 Professional [Preview] XQHPH-N4D9W-M8P96-DPDFP-TMVPY
Windows 10 Professional WMC [Pre-Release] NKPM6-TCVPT-3HRFX-Q4H9B-QJ34Y
328NF-RTPQT-84J4Q-V44B8-78R2B
Windows 10 IoT Core [Pre-Release] 7NX88-X6YM3-9Q3YT-CCGBF-KBVQF
NHY4C-KCMKV-V9K9M-7R43T-KTP64
Windows 10 Core Connected [Pre-Release] DJMYQ-WN6HG-YJ2YX-82JDB-CWFCW
QBWKP-NFVG3-CYGTT-724CF-FCYPW
Windows 10 Core Connected N [Pre-Release] JQNT7-W63G4-WX4QX-RD9M9-6CPKM
TKDDW-N77V2-WXKMG-QY6WQ-WQJXM
Windows 10 Core Connected Single Language [Pre-Release] QQMNF-GPVQ6-BFXGG-GWRCX-7XKT7
RQ2MN-RKR94-P86YQ-TM76X-P3667
Windows 10 Core Connected Country Specific [Pre-Release] FTNXM-J4RGP-MYQCV-RVM8R-TVH24
TNPJK-GCKPR-4WX4C-HCJHT-HFRC4
Windows 10 Professional S [Pre-Release] 3NF4D-GF9GY-63VKH-QRC3V-7QW8P
NFDD9-FX3VM-DYCKP-B8HT8-D9M2C
Windows 10 Professional S N [Pre-Release] KNDJ3-GVHWT-3TV4V-36K8Y-PR4PF
8Q36Y-N2F39-HRMHT-4XW33-TCQR4
Windows 10 Professional Student [Pre-Release] YNXW3-HV3VB-Y83VG-KPBXM-6VH3Q
N6X24-448X6-HYV8Y-8XQ3V-DRRDQ
Windows 10 Professional Student N [Pre-Release] 8G9XJ-GN6PJ-GW787-MVV7G-GMR99
XHGFB-WNK7Q-BG8VG-BG2KQ-KKWX9
Windows 10 PPIPro [Pre-Release (build 15063)] ?????-?????-?????-?????-?????
Windows 8 Core / Server 2012 [RC] ?????-?????-?????-?????-?????
Windows 8 Core / Server 2012 Country Specific [RC] ?????-?????-?????-?????-?????
Windows 8 Core / Server 2012 N [RC] ?????-?????-?????-?????-?????
Windows 8 Core / Server 2012 Single Language [RC] ?????-?????-?????-?????-?????
Windows 8 Core ARM64 [RC] ?????-?????-?????-?????-?????
Windows 8 Embedded Industry Professional [Beta] ?????-?????-?????-?????-?????
Windows 8 Embedded Industry Enterprise [Beta] ?????-?????-?????-?????-?????
Windows 8.1 Enterprise [Preview] 2MP7K-98NK8-WPVF3-Q2WDG-VMD98
Windows 8.1 Professional (Blue) [Preview] MTWNQ-CKDHJ-3HXW9-Q2PFX-WB2HQ
Windows 8 Professional WMC [RC] MY4N9-TGH34-4X4VY-8FG2T-RRDPV
Windows 8.x [Preview] MPWP3-DXNP9-BRD79-W8WFP-3YFJ6
Windows 8.x ARM64 [Preview] ?????-?????-?????-?????-?????
Windows Next Core Connected [Pre-Release] ?????-?????-?????-?????-?????
Windows Next Core Connected N [Pre-Release] ?????-?????-?????-?????-?????
Windows Next Core Connected Country Specific [Pre-Release] ?????-?????-?????-?????-?????
Windows Next Core Connected Single Language [Pre-Release] ?????-?????-?????-?????-?????
Windows Next Professional Student [Pre-Release] ?????-?????-?????-?????-?????
Windows Next Professional Student N [Pre-Release] ?????-?????-?????-?????-?????
Windows Next Embedded Industry Professional [Beta] XY4TQ-CXNVJ-YCT73-HH6R7-R897X
Windows Next Embedded Industry Enterprise [Beta] XCNC9-BPK3C-KCCMD-FTDTC-KWY4G
WN3XP-M9YFD-JRJ84-4J9FB-QJY4G
Windows Next Embedded Industry Automotive [Beta] GN2X2-KXTK6-P92FR-VBB9G-PDJFP
434XB-NH62H-JG7RG-P3KMD-XHHJC
Windows Server Next MultiPoint Standard [Preview] ?????-?????-?????-?????-?????
Windows Server Next MultiPoint Premium [Preview] ?????-?????-?????-?????-?????
Windows Server Next Enterprise [Preview] ?????-?????-?????-?????-?????
Windows Server Next Standard [Preview] ?????-?????-?????-?????-?????
Windows Server Next Web [Preview] ?????-?????-?????-?????-?????
Windows Server Next HPC Edition [Preview] ?????-?????-?????-?????-?????
Windows Server Next HI [Preview] 7VX4N-3VDHQ-VYGHB-JXJVP-9QB26
Enterprise ProdKey3 Win 9984 DLA/Bypass NQR Test ?????-?????-?????-?????-?????
Windows Server 2012 R2 Essentials [Preview] ?????-?????-?????-?????-?????
Windows Server 2016 Datacenter [Preview] VRDD2-NVGDP-K7QG8-69BR4-TVFHB
Windows Vista Business [Preview 1] XQYF4-QVCMY-YXQRD-9QPV8-3YP9V
Windows Vista Business [Preview 2] YVT36-YVCP2-J97GQ-7T22R-RWV8P
Windows Vista Business N [Preview] HGBJ9-RWD6M-6HDGW-6T2XD-JQ66F
Windows Vista Enterprise [Preview 1] 3JHG3-Y66GP-B7F3K-JFVX2-VBH7K
Windows Vista Enterprise [Beta-2 build 5384] MF9PG-RQK7R-26BPJ-TWFYK-RHXCM
Windows Vista Enterprise N [Preview] ?????-?????-?????-?????-?????
Windows Longhorn Web [Preview] MDRCM-4WKCW-J93FF-J9Q48-M6KBB
Windows Longhorn HPC Edition [Preview] ?????-?????-?????-?????-?????
Windows Longhorn Standard [Preview] Q37JX-P3HHB-GKRH2-PDBKG-GGXPW
Windows Longhorn Enterprise [Preview] 7KYMQ-R788Q-4RF69-KTWKM-92PFJ
Windows Longhorn Datacenter [Preview] HR8VD-7DHG2-48378-M9D73-28F4T
Windows Longhorn for Itanium Systems [Preview] CWV9H-PHGPW-V93WV-QBQV9-8V336
Windows 7 Business [Preview] ?????-?????-?????-?????-?????
Windows 7 Business N [Preview] ?????-?????-?????-?????-?????
Windows 7 Enterprise [Preview] ?????-?????-?????-?????-?????
Windows 7 Enterprise N [Preview] ?????-?????-?????-?????-?????
Windows 7 Server Web [Preview] ?????-?????-?????-?????-?????
Windows 7 Server Standard [Preview] ?????-?????-?????-?????-?????
Windows 7 Server Standard without Hyper-V [Preview] ?????-?????-?????-?????-?????
Windows 7 Server Enterprise [Preview] ?????-?????-?????-?????-?????
Windows 7 Server Enterprise without Hyper-V [Preview] ?????-?????-?????-?????-?????
Windows 7 Server Datacenter [Preview] ?????-?????-?????-?????-?????
Windows 7 Server Datacenter without Hyper-V [Preview] ?????-?????-?????-?????-?????
Windows 7 Server for Itanium Systems [Preview] ?????-?????-?????-?????-?????
Windows Next Education [Pre-Release] ?????-?????-?????-?????-?????
Windows Next Education N [Pre-Release] ?????-?????-?????-?????-?????
Windows Next Professional [Pre-Release] ?????-?????-?????-?????-?????
Windows Next Professional N [Pre-Release] ?????-?????-?????-?????-?????
Windows Next Enterprise N [Pre-Release] ?????-?????-?????-?????-?????
Windows Next Enterprise [Pre-Release] ?????-?????-?????-?????-?????
Windows Next Enterprise S [Pre-Release] ?????-?????-?????-?????-?????
Windows Next Enterprise S N [Pre-Release] ?????-?????-?????-?????-?????
Windows Next Professional S [Pre-Release] ?????-?????-?????-?????-?????
Windows Next Professional S N [Pre-Release] ?????-?????-?????-?????-?????

Office

Office 2021

Product GVLK
Office Access LTSC 2021 WM8YG-YNGDD-4JHDC-PG3F4-FC4T4
Office Excel LTSC 2021 NWG3X-87C9K-TC7YY-BC2G7-G6RVC
Office Outlook LTSC 2021 C9FM6-3N72F-HFJXB-TM3V9-T86R9
Office Powerpoint LTSC 2021 TY7XF-NFRBR-KJ44C-G83KF-GX27K
Office LTSC Professional Plus 2021 FXYTK-NJJ8C-GB6DW-3DYQT-6F7TH
Office Project Pro 2021 FTNWT-C6WBT-8HMGF-K9PRX-QV9H8
Office Project Standard 2021 J2JDC-NJCYY-9RGQ4-YXWMH-T3D4T
Office Publisher LTSC 2021 2MW9D-N4BXM-9VBPG-Q7W6M-KFBGQ
Office Skype for Business LTSC 2021 HWCXN-K3WBT-WJBKY-R8BD9-XK29P
Office LTSC Standard 2021 KDX7X-BNVR8-TXXGX-4Q7Y8-78VT3
Office Visio LTSC Pro 2021 KNH8D-FGHT4-T8RK3-CTDYJ-K2HT4
Office Visio LTSC Standard 2021 MJVNY-BYWPY-CWV6J-2RKRT-4M8QG
Office Word LTSC 2021 TN8H9-M34D3-Y64V9-TR72V-X79KV

Office 2019

Product GVLK
Professional Plus 2019 [C2R] VQ9DP-NVHPH-T9HJC-J9PDT-KTQRG
Professional Plus 2019 NMMKJ-6RK4F-KMJVX-8D9MJ-6MWKP
Standard 2019 6NWWJ-YQWMR-QKGCB-6TMB3-9D9HK
Project Professional 2019 [C2R] XM2V9-DN9HH-QB449-XDGKC-W2RMW
Project Professional 2019 B4NPR-3FKK7-T2MBV-FRQ4W-PKD2B
Project Standard 2019 C4F7P-NCP8C-6CQPT-MQHV9-JXD2M
Visio Professional 2019 [C2R] N2CG9-YD3YK-936X4-3WR82-Q3X4H
Visio Professional 2019 9BGNQ-K37YR-RQHF2-38RQ3-7VCBB
Visio Standard 2019 7TQNQ-K3YQQ-3PFH7-CCPPM-X4VQ2
Access 2019 9N9PT-27V4Y-VJ2PD-YXFMF-YTFQT
Excel 2019 TMJWT-YYNMB-3BKTF-644FC-RVXBD
Outlook 2019 7HD7K-N4PVK-BHBCQ-YWQRW-XW4VK
PowerPoint 2019 RRNCX-C64HY-W2MM7-MCH9G-TJHMQ
Publisher 2019 G2KWX-3NW6P-PY93R-JXK2T-C9Y9V
Skype for Business 2019 NCJ33-JHBBY-HTK98-MYCV8-HMKHJ
Word 2019 PBX3G-NWMT6-Q7XBW-PYJGG-WXD33

Office 2016

Product GVLK
Professional Plus 2016 XQNVK-8JYDB-WJ9W3-YJ8YR-WFG99
Standard 2016 JNRGM-WHDWX-FJJG3-K47QV-DRTFM
Project Professional 2016 YG9NW-3K39V-2T3HJ-93F3Q-G83KT
Project Professional 2016 [C2R] WGT24-HCNMF-FQ7XH-6M8K7-DRTW9
Project Standard 2016 GNFHQ-F6YQM-KQDGJ-327XX-KQBVC
Project Standard 2016 [C2R] D8NRQ-JTYM3-7J2DX-646CT-6836M
Visio Professional 2016 PD3PC-RHNGV-FXJ29-8JK7D-RJRJK
Visio Professional 2016 [C2R] 69WXN-MBYV6-22PQG-3WGHK-RM6XC
Visio Standard 2016 7WHWN-4T7MP-G96JF-G33KR-W8GF4
Visio Standard 2016 [C2R] NY48V-PPYYH-3F4PX-XJRKJ-W4423
Access 2016 GNH9Y-D2J4T-FJHGG-QRVH7-QPFDW
Excel 2016 9C2PK-NWTVB-JMPW8-BFT28-7FTBF
Mondo 2016 HFTND-W9MK4-8B7MJ-B6C4G-XQBR2
Mondo Retail 2016 DMTCJ-KNRKX-26982-JYCKT-P7KB6
OneNote 2016 DR92N-9HTF2-97XKM-XW2WJ-XW3J6
Outlook 2016 R69KK-NTPKF-7M3Q4-QYBHW-6MT9B
PowerPoint 2016 J7MQP-HNJ4Y-WJ7YM-PFYGF-BY6C6
Publisher 2016 F47MM-N3XJP-TQXJ9-BP99D-8K837
Skype for Business 2016 869NQ-FJ69K-466HW-QYCP2-DDBV6
Word 2016 WXY84-JN2Q9-RBCCQ-3Q3J3-3PFJ6

Office 2013

Product GVLK
Professional Plus 2013 [Preview] PGD67-JN23K-JGVWV-KTHP4-GXR9G
Professional Plus 2013 YC7DK-G2NP3-2QQC3-J6H88-GVGXT
Standard 2013 KBKQT-2NMXY-JJWGP-M62JB-92CD4
Project Professional 2013 [Preview] NFKVM-DVG7F-TYWYR-3RPHY-F872K
Project Professional 2013 FN8TT-7WMH6-2D4X9-M337T-2342K
Project Standard 2013 [Preview] N89QF-GGB8J-BKD28-C4V28-W4XTK
Project Standard 2013 6NTH3-CW976-3G3Y2-JK3TX-8QHTT
Visio Professional 2013 [Preview] B3C7Q-D6NH2-2VRFW-HHWDG-FVQB6
Visio Professional 2013 C2FG9-N6J68-H8BTJ-BW3QX-RM3B3
Visio Standard 2013 [Preview] 9MKNF-J9XQ6-JV4XB-FJQPY-43F43
Visio Standard 2013 J484Y-4NKBF-W2HMG-DBMJC-PGWR7
Access 2013 [Preview] DJBH8-RGN7Q-836KD-DMP3M-DM9MF
Access 2013 NG2JY-H4JBT-HQXYP-78QH9-4JM2D
Excel 2013 [Preview] Q3BNP-3WXDT-GG8HF-24KMW-HMDBK
Excel 2013 VGPNG-Y7HQW-9RHP7-TKPV3-BG7GB
OneNote 2013 [Preview] VYNYX-8GPBC-7FQMD-D6B7B-7MDFD
OneNote 2013 TGN6P-8MMBC-37P2F-XHXXK-P34VW
Outlook 2013 [Preview] X2KNB-FRRG2-WXDPH-739DM-DM9RH
Outlook 2013 QPN8Q-BJBTJ-334K3-93TGY-2PMBT
PowerPoint 2013 [Preview] B8CT8-BTNFQ-XQXBK-BFWV8-HMDFQ
PowerPoint 2013 4NT99-8RJFH-Q2VDH-KYG2C-4RD4F
Publisher 2013 [Preview] NB67P-J8XP4-XDK9B-V73VH-M4CKR
Publisher 2013 PN2WF-29XG2-T9HJ7-JQPJR-FCXK4
InfoPath 2013 (Preview) 7KPJJ-N8TT7-CK3KR-QTV98-YPVXQ
InfoPath 2013 DKT8B-N7VXH-D963P-Q4PHY-F8894
Lync 2013 [Preview] XNVD3-RYC7T-7R6BT-WX6CF-8BYH7
Lync 2013 2MG3G-3BNTT-3MFW9-KDQW3-TCK7R
Word 2013 [Preview] JBGD4-3JNG7-JWWGV-CR6TP-DC62Q
Word 2013 6Q7VD-NX8JD-WJ2VH-88V73-4GBJ7
Mondo 2013 [Preview] GCGCN-6FJRM-TR9Q3-BGMWJ-78KQV
Mondo 2013 42QTK-RN8M7-J3C4G-BBGYM-88CYV
Mondo 2013 Retail ?????-?????-?????-?????-?????
SharePoint Workspace (Groove) 2013 [Preview] WVCGG-NK4FG-7XKXM-BD4WF-3C624
SharePoint Workspace (Groove) 2013 H7R7V-WPNXQ-WCYYC-76BGV-VT7GH
SharePoint Designer (Frontpage) 2013 Retail [Preview] ?????-?????-?????-?????-?????
SharePoint Designer (Frontpage) 2013 Retail GYJRG-NMYMF-VGBM4-T3QD4-842DW

Office 2010

Product GVLK
Professional Plus 2010 VYBBJ-TRJPB-QFQRF-QFT4D-H3GVB
Standard 2010 V7QKV-4XVVR-XYV4D-F7DFM-8R6BM
Project Professional 2010 YGX6F-PGV49-PGW3J-9BTGG-VHKC6
Project Standard 2010 4HP3K-88W3F-W2K3D-6677X-F9PGB
Visio Professional 2010 7MCW8-VRQVK-G677T-PDJCM-Q8TCP
Visio Standard 2010 767HD-QGMWX-8QTDB-9G3R2-KHFGJ
Visio Premium 2010 D9DWC-HPYVV-JGF4P-BTWQB-WX8BJ
Access 2010 V7Y44-9T38C-R2VJK-666HK-T7DDX
Excel 2010 H62QG-HXVKF-PP4HP-66KMR-CW9BM
OneNote 2010 Q4Y4M-RHWJM-PY37F-MTKWH-D3XHX
Outlook 2010 7YDC2-CWM8M-RRTJC-8MDVC-X3DWQ
PowerPoint 2010 RC8FX-88JRY-3PF7C-X8P67-P4VTT
Publisher 2010 BFK7F-9MYHM-V68C7-DRQ66-83YTP
InfoPath 2010 K96W8-67RPQ-62T9Y-J8FQJ-BT37T
SharePoint Workspace (Groove) 2010 QYYW6-QP4CB-MBV6G-HYMCJ-4T3J4
Word 2010 HVHB3-C6FV7-KQX9W-YQG79-CRY7T
Small Business Basics 2010 D6QFG-VBYP2-XQHM7-J97RH-VVRCK
Starter 2010 Retail VXHHB-W7HBD-7M342-RJ7P8-CHBD6
SharePoint Designer (Frontpage) 2010 Retail H48K6-FB4Y6-P83GH-9J7XG-HDKKX
Office Mondo 1 2010 YBJTT-JG6MD-V9Q7P-DBKXJ-38W9R
Office Mondo 2 2010 7TC2V-WXF6P-TD7RT-BQRXR-B8K32

Troubleshooting

Something does not work as expected ? Before you open an issue, please make sure to at least follow these steps to further diagnose or even resolve your problem. If you not follow this, do not expect that we can or want to help you!

  • Are you activating a legit Windows copy checked with sha256, md5 or is it maybe a warez torrent version ?

  • Did you tried a clean installation (format all) ? You skipped entering any key during installation, turning off internet connection, first activating and then updating Windows (and eventually later upgrading) ?

  • Are you activating Windows or Office on a different machine (physical or virtual) where py-kms runs?

  • Have you installed all latest packages ? Especially before upgrading ? Are you upgrading using the “Update Assistant”/”Media Creation” tool to switch from Windows 7 / 8 / 8.1 to 10 (for me has always worked) ?

  • If isn’t a clean install, so far as you have kept activated your Windows copy ? Have you used some other activator (maybe not trusted) that injects or changes .dll files and therefore may have corrupted something ?

  • Have you forgot to reactivate at least once before 180 (45 or 30, depending on your version) days ?

  • Is your system very tweaked with some service disabled (have you used O&O Shutup 10 or similar tools) ?

  • Have you disabled (or created an exception for) ALL firewalls (Public/Private/Office) / antivirus (Windows defender, etc..), server-side AND client-side ?

  • Have you already activated with a OEM/Retail/other license and now you want to activate using py-kms ? So, have you switched to volume channel with appropriate GVLK ? Make sure you first deleted the previous key (example: #24 (comment)) ?

  • Are you running the commands using the elevated command prompt ?

  • Are you connecting correctly to your py-kms server instance ?

  • Have you tried to fix with “Windows Troubleshoot”, sfc /scannow or other strange Windows tools ?

  • If you activated successfully with py-kms other Windows stuff, consider it could be an error specific for your PC (so you may need a scented clean installation) ?

  • Is your py-kms really running ? Already tried to enable debug logs ?

  • Did you already searched for your issue here ?

  • Are you running the latest version of py-kms ?

  • For Office: Did you made sure to use a Office with GLVK support ?!

  • You found a real bug ? Could you maybe make our life’s easier and describe what goes wrong and also provide some information about your environment (OS, Python-Version, Docker, Commit-Hashes, Network-Setup) ?

  • When you post logs: Please remove personal information (replace IPs with something like [IP_ADDRESS_A])…

If you have already thought about all of this, your last hope to solve your problem is reading some verse of the Holy Bible of activations: “MDL forums” - otherwise “I don’t know !”, but try open up an issue anyways :)

Usage

Start Parameters

pykms_Server.py

Follows a list of usable parameters:

ip <IPADDRESS>

Instructs py-kms to listen on IPADDRESS (can be an hostname too). If this option is not specified, IPADDRESS :: is used.

port <PORT>

Define TCP PORT the KMS service is listening on. Default is 1688.

-e or --epid <EPID>

Enhanced Privacy ID (EPID) is a cryptographic scheme for providing anonymous signatures. Use EPID as Windows EPID. If no EPID is specified, a random one will be generated.

-l or --lcid <LCID>

Specify the LCID part of the EPID. If an EPID is manually specified, this setting is ignored. Default is 1033 (English - US). The Language Code Identifier (LCID) describes localizable information in Windows. This structure is used to identify specific languages for the purpose of customizing software for particular languages and cultures. For example, it can specify the way dates, times, and numbers are formatted as strings. It can also specify paper sizes and preferred sort order based on language elements. The LCID must be specified as a decimal number (example: 1049 for “Russian - Russia”). By default py-kms generates a valid locale ID but this may lead to a value which is unlikely to occur in your country. You may want to select the locale ID of your country instead. See here for a list of valid LCIDs.

-w or --hwid <HWID>

Use specified HWID for all products. Use -w RANDOM to generate a random HWID. Default is random. Hardware Identification is a security measure used by Microsoft upon the activation of the Windows operating system. As part of the Product Activation system, a unique HWID number is generated when the operating system is first installed. The HWID identifies the hardware components that the system is utilizing, and this number is communicated to Microsoft. Every 10 days and at every reboot the operating system will generate another HWID number and compare it to the original to make sure that the operating system is still running on the same device. If the two HWID numbers differ too much then the operating system will shut down until Microsoft reactivates the product. The theory behind HWID is to ensure that the operating system is not being used on any device other than the one for which it was purchased and registered. HWID must be an 16-character string of hex characters that are interpreted as a series of 8 bytes (big endian).

-c or --client-count <CLIENTCOUNT>

Use this flag to specify the current CLIENTCOUNT. Default is None. Remember that a number >=25 is required to enable activation of client OSes while for server OSes and Office >=5.

-a or --activation-interval <ACTIVATIONINTERVAL>

Instructs clients to retry activation every ACTIVATIONINTERVAL minutes if it was unsuccessful, e.g. because it could not reach the server. The default is 120 minutes (2 hours).

-r or --renewal-interval <RENEWALINTERVAL>

Instructs clients to renew activation every RENEWALINTERVAL minutes. The default is 10080 minutes (7 days).

-s or --sqlite [<SQLFILE>]

Use this option to store request information from unique clients in an SQLite database. Deactivated by default.

-t0 or --timeout-idle <TIMEOUTIDLE>

Maximum inactivity time (in seconds) after which the connection with the client is closed. Default setting is serve forever (no timeout).

-t1 or --timeout-sndrcv <TIMEOUTSNDRCV>

Set the maximum time (in seconds) to wait for sending / receiving a request / response. Default is no timeout.

-y or --async-msg

With high levels of logging (e.g hundreds of log statements), in a traditional synchronous log model, the overhead involved becomes more expensive, so using this option you enable printing (pretty / logging) messages asynchronously reducing time-consuming. Deactivated by default.

-V or --loglevel <{CRITICAL, ERROR, WARNING, INFO, DEBUG, MININFO}>

Use this flag to set a logging loglevel. The default is ERROR. example:

user@host ~/path/to/folder/py-kms $ python3 pykms_Server.py -V INFO

creates pykms_logserver.log with these initial messages:

Mon, 12 Jun 2017 22:09:00 INFO     TCP server listening at :: on port 1688.
Mon, 12 Jun 2017 22:09:00 INFO     HWID: 364F463A8863D35F
-F or --logfile <LOGFILE>

Creates a LOGFILE.log logging file. The default is named pykms_logserver.log. example:

user@host ~/path/to/folder/py-kms $ python3 pykms_Server.py 192.168.1.102 1688 -F ~/path/to/folder/py-kms/newlogfile.log -V INFO -w RANDOM

creates newlogfile.log with these initial messages:

Mon, 12 Jun 2017 22:09:00 INFO     TCP server listening at 192.168.1.102 on port 1688.
Mon, 12 Jun 2017 22:09:00 INFO     HWID: 58C4F4E53AE14224

You can also enable other suboptions of -F doing what is reported in the following table:

command pretty msg logging msg logfile
-F <logfile> ON OFF ON
-F STDOUT OFF ON OFF
-F FILESTDOUT <logfile> OFF ON ON
-F STDOUTOFF <logfile> OFF OFF ON
-F FILEOFF ON OFF OFF
-S or --logsize <MAXSIZE>

Use this flag to set a maximum size (in MB) to the output log file. Deactivated by default.

subparser connect
-n or --listen <'IP,PORT'>

Use this option to add multiple listening ip address - port couples. Note the format with the comma between the ip address and the port number. You can use this option more than once.

-b or --backlog <BACKLOG>

Use this option to specify the maximum length of the queue of pending connections, referred to a ip address - port couple. If placed just after connect refers to the main address and all additive couples without -b option. Default is 5.

-u or --no-reuse

Use this option not to allow binding / listening to the same ip address - port couple specified with -n. If placed just after connect refers to the main address and all additive couples without -u option. Reusing port is activated by default (except when running inside the Windows Sandbox and the current user is WDAGUtilityAccount).

-d or --dual

Use this option to allow listening to an IPv6 address also accepting connections via IPv4. If used it refers to all addresses (main and additional). Deactivated by default.

examples (with fictitious addresses and ports):

command address (main) backlog (main) reuse port (main) address (listen) backlog (listen) reuse port (listen) dualstack (main / listen)
python3 pykms_Server.py connect -b 12 ('::', 1688) 12 True [] [] [] False
python3 pykms_Server.py :: connect -b 12 -u -d ('::', 1688) 12 False [] [] [] True
python3 pykms_Server.py connect -n 1.1.1.1,1699 -b 10 ('::', 1688) 5 True [('1.1.1.1', 1699)] [10] [True] False
python3 pykms_Server.py :: 1655 connect -n 2001:db8:0:200::7,1699 -d -b 10 -n 2.2.2.2,1677 -u ('::', 1655) 5 True [('2001:db8:0:200::7', 1699), ('2.2.2.2', 1677)] [10, 5] [True, False] True
python3 pykms_Server.py connect -b 12 -u -n 1.1.1.1,1699 -b 10 -n 2.2.2.2,1677 -b 15 ('::', 1688) 12 False [('1.1.1.1', 1699), ('2.2.2.2', 1677)] [10, 15] [False, False] False
python3 pykms_Server.py connect -b 12 -n 1.1.1.1,1699 -u -n 2.2.2.2,1677 ('::', 1688) 12 True [('1.1.1.1', 1699), ('2.2.2.2', 1677)] [12, 12] [False, True] False
python3 pykms_Server.py connect -d -u -b 8 -n 1.1.1.1,1699 -n 2.2.2.2,1677 -b 12 ('::', 1688) 8 False [('1.1.1.1', 1699), ('2.2.2.2', 1677)] [8, 12] [False, False] True
python3 pykms_Server.py connect -b 11 -u -n ::,1699 -n 2.2.2.2,1677 ('::', 1688) 11 False [('::', 1699), ('2.2.2.2', 1677)] [11, 11] [False, False] False

pykms_Client.py

If py-kms server doesn’t works correctly, you can test it with the KMS client pykms_Client.py, running on the same machine where you started pykms_Server.py.

For example (in separated bash windows) run these commands:

user@host ~/path/to/folder/py-kms $ python3 pykms_Server.py -V DEBUG
user@host ~/path/to/folder/py-kms $ python3 pykms_Client.py -V DEBUG

If you wish to get KMS server from DNS server: (ie perform a DNS resolution on _vlmcs._tcp.domain.tld, if ever there are several answers, only the first one is selected.). Althought that mode is supposed to be specific to devices connect to an Active Directory domain, setting a fully qualified name and a workgroup may help to use that automatic KMS discovery feature.

user@host ~/path/to/folder/py-kms $ python3 pykms_Client.py -V DEBUG -F STDOUT -D contoso.com
user@host ~/path/to/folder/py-kms $ python3 pykms_Client.py -V DEBUG -F STDOUT -D contoso.com

Or if you want better specify:

user@host ~/path/to/folder/py-kms $ python3 pykms_Server.py <YOUR_IPADDRESS> 1688 -V DEBUG
user@host ~/path/to/folder/py-kms $ python3 pykms_Client.py <YOUR_IPADDRESS> 1688 -V DEBUG

You can also put further parameters as defined below:

ip <IPADDRESS>

Define IPADDRESS (or hostname) of py-kms’ KMS Server. This parameter is always required.

port <PORT>

Define TCP PORT the KMS service is listening on. Default is 1688.

-m or --mode <{WindowsVista, Windows7, Windows8, Windows8.1, Windows10, Office2010, Office2013, Office2016, Office2019}>

Use this flag to manually specify a Microsoft PRODUCTNAME for testing the KMS server. Default is Windows8.1.

-c or --cmid <CMID>

Use this flag to manually specify a CMID to use. If no CMID is specified, a random one will be generated. The Microsoft KMS host machine identifies KMS clients with a unique Client Machine ID (CMID, example: ae3a27d1-b73a-4734-9878-70c949815218). For a KMS client to successfully activate, the KMS server needs to meet a threshold, which is a minimum count for KMS clients. Once a KMS server records a count which meets or exceeds threshold, KMS clients will begin to activate successfully. Each unique CMID recorded by KMS server adds towards the count threshold for KMS clients. This are retained by the KMS server for a maximum of 30 days after the last activation request with that CMID. Note that duplicate CMID only impacts on KMS server machine count of client machines. Once KMS server meets minimum threshold, KMS clients will activate regardless of CMID being unique for a subset of specific machines or not.

-n or --name <MACHINENAME>

Use this flag to manually specify an ASCII MACHINENAME to use. If no MACHINENAME is specified a random one will be generated.

-t0 or --timeout-idle <TIMEOUTIDLE>

Set the maximum time (in seconds) to wait for a connection attempt to KMS server to succeed. Default is no timeout.

-t1 or --timeout-sndrcv <TIMEOUTSNDRCV>

Set the maximum time (in seconds) to wait for sending / receiving a request / response. Default is no timeout.

-y or --async-msg

Prints pretty / logging messages asynchronously. Deactivated by default.

-V or --loglevel <{CRITICAL, ERROR, WARNING, INFO, DEBUG, MININFO}>

Use this flag to set a logging loglevel. The default is ERROR.

-F or --logfile <LOGFILE>

Creates a LOGFILE.log logging file. The default is named pykms_logclient.log. You can enable same pykms_Server.py suboptions of -F.

-S or --logsize <MAXSIZE>

Use this flag to set a maximum size (in MB) to the output log file. Deactivated by default.

Docker Environment

This are the currently used ENV statements from the Dockerfile(s). For further references what exactly the parameters mean, please see the start parameters for the server.

# IP-address
# The IP address to listen on. The default is "::" (all interfaces).
ENV IP ::

# TCP-port
# The network port to listen on. The default is "1688".
ENV PORT 1688

# ePID
# Use this flag to manually specify an ePID to use. If no ePID is specified, a random ePID will be generated.
ENV EPID ""

# lcid
# Use this flag to manually specify an LCID for use with randomly generated ePIDs. Default is 1033 (en-us).
ENV LCID 1033

# The current client count
# Use this flag to specify the current client count. Default is 26.
# A number >=25 is required to enable activation of client OSes; for server OSes and Office >=5.
ENV CLIENT_COUNT 26

# The activation interval (in minutes)
# Use this flag to specify the activation interval (in minutes). Default is 120 minutes (2 hours).
ENV ACTIVATION_INTERVAL 120

# The renewal interval (in minutes)
# Use this flag to specify the renewal interval (in minutes). Default is 10080 minutes (7 days).
ENV RENEWAL_INTERVAL 10080

# hwid
# Use this flag to specify a HWID. 
# The HWID must be an 16-character string of hex characters.
# The default is "RANDOM" to auto-generate the HWID or type a specific value.
ENV HWID RANDOM

# log level ("CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG")
# Use this flag to set a Loglevel. The default is "ERROR".
ENV LOGLEVEL ERROR

# Log file
# Use this flag to set an output Logfile. The default is "/var/log/pykms_logserver.log".
ENV LOGFILE /var/log/pykms_logserver.log

# Log file size in MB
# Use this flag to set a maximum size (in MB) to the output log file. Deactivated by default.
ENV LOGSIZE ""

Activation Procedure

The product asks for a key during installation, so it needs you to enter the GVLK. Then the user can set connection parameters, while KMS server must already be running on server machine. Finally with specific commands, activation occurs automatically and can be extended later every time for another 180 (or 30 or 45) days.

Windows

The //nologo option of cscript was used only to hide the startup logo.

win1

win2

  1. Run a Command Prompt as Administrator (you are directly in C:\Windows\System32 path).

  2. This is optional, it’s for unistalling any existing product key.

  3. Then put in your product’s GVLK.

  4. Set connection parameters.

  5. Try online activation, but if that fails with error…

    • 0xC004F074 You’ll most likely have to configure your firewall that it accepts incoming connections on TCP port 1688. So for Linux users (server-side with pykms_Server.py running): sudo ufw allow 1688 (revert this rule sudo ufw delete allow 1688) should fix that.

    • 0xC004F069 Take a look into the issue here, it will may help you…

  6. Attempt online activation (now with traffic on 1688 enabled).

  7. View license informations (optional).

Office

Note that you’ll have to install a volume license (VL) version of Office. Office versions downloaded from MSDN and / or Technet are non-VL.

off1

off2

off3

off4

  1. Run a Command Prompt as Administrator and navigate to Office folder cd C:\ProgramFiles\Microsoft Office\OfficeXX (64-bit path) or cd C:\ProgramFiles(x86)\Microsoft Office\OfficeXX (32-bit path), where XX = 14 for Office 2010, 15 for Office 2013, 16 for Office 2016 or Office 2019.

  2. As you can see, running /dstatus, my Office is expiring (14 days remaining).

  3. Only for example, let’s go to uninstall this product.

  4. This is confirmed running /dstatus again.

  5. Now i put my product’s GVLK (and you your key).

  6. Set the connection parameter KMS server address.

  7. Set the connection parameter KMS server port.

  8. Activate installed Office product key.

  9. View license informations (in my case product is now licensed and remaining grace 180 days as expected).

Changelog

py-kms_2022-12-16

  • Added support for new web-gui into Docker

  • Implemented whole-new web-based GUI with Flask

  • Removed old GUI (Etrigan) from code and resources

  • Removed sqliteweb

  • Removed Etrigan (GUI)

py-kms_2022-12-07

  • Added warning about Etrigan (GUI) being deprecated

  • More docs (do not run on same machine as client)

  • Added Docker support for multiple listen IPs

  • Added graceful Docker shutdowns

py-kms_2021-12-23

  • More Windows 10/11 keys

  • Fixed some deprecation warnings

  • Fixed SO_REUSEPORT platform checks

  • Fixed loglevel “MININFO” with Docker

  • Added Docker healthcheck

  • Added UID/GID change support for Docker

  • Dependabot alerts

py-kms_2021-10-22

  • Integrated Office 2021 GLVK keys & database

  • Docker entrypoint fixes

  • Updated docs to include SQLite stuff

  • Fix for undefined timezones

  • Removed LOGFILE extension checks

  • Added support for Windows 11

py-kms_2021-10-07

  • Helm charts for Kubernetes deployment

  • Windows 2022 updates

  • Faster Github Action builds

py-kms_2021-11-12

  • Addded GHCR support

  • Docs table reformatted

  • Updated GUI

  • Windows Sandbox fix

  • Added contribution guidelines

  • Docker multiarch

  • Reshot screenshots in docs

py-kms_2020-10-01

  • Sql database path customizable.

  • Sql database file keeps different AppId.

  • Support for multi-address connection.

  • Added timeout send / receive.

py-kms_2020-07-01

  • py-kms Gui: now matches all cli options, added modes onlyserver / onlyclient, added some animations.

  • Added suboptions FILEOFF and STDOUTOFF of -F.

  • Created option for asynchronous messages.

  • Cleaned options parsing process.

py-kms_2020-02-02

  • Optimized pretty-print messages process.

  • Added -F FILESTDOUT option.

  • Added deamonization options (via Etrigan project).

  • py-kms GUI resurrected (and improved).

  • Cleaned, cleaned, cleaned.

py-kms_2019-05-15

  • Merging for Python2 / Python3 compatibility all-in-one.

  • Added new options:

    • timeout, logsize.

    • more control on logging and info visualization (custom loglevel and stdout logfile redirection) to match this request.

  • Setup for multithreading support.

  • Graphical improvements:

    • added a (“really silly”) tkinter GUI as an alternative to command line.

  • Dockerized with sqlite-web.

  • Fixed activation threshold.

  • Renamed files, cosmetics and many other little big adjustments.

py-kms_2018-11-15

  • Implemented some good modifications inspired by this other fork.

    • Clean up code ( deleted no longer useful files randomHWID.py, randomEPID.py, timezones.py; erased useless functions and import modules )

    • Reading parameters directly from a slightly modified KmsDataBase.xml ( created with LicenseManager 5.0 by Hotbird64 HGM ) with kmsDB2Dict.py

  • Added support for Windows Server 2019 and Office 2019.

  • Improved random EPID generation.

  • Corrected this in kmsBase.py

py-kms_2018-03-01

  • py-kms NOW is for Python3 too ( py3-kms ), the previous one ( written with Python2 ) is renamed py2-kms

  • Repaired logging messages

  • Added pretty processing messages

py-kms_2017-06-01

  • Added option verbose logging in a file

  • Updated “kmsBase.py” with new SKUIDs

  • Added a brief guide “py-kms-Guide.pdf” ( replaced “client-activation.txt” )

  • Added a well formatted and more complete list of volume keys “py-kms-ClientKeys.pdf” ( replaced “client-keys.txt” )

py-kms_2016-12-30

  • Updated kmsBase.py (Matches LicenseManager 4.6.0 by Hotbird64 HGM)

py-kms_2016-08-13

  • Fixed major bug on Response function

  • Fixed Random PID Generator (thanks: mkuba50)

py-kms_2016-08-12

  • Added missing UUID, credits: Hotbird64

  • Added Windows Server 2016 in random PID generator

py-kms_2016-08-11

  • Added Windows Server 2016 UUID

  • Fixed GroupID and PIDRange

  • Added Office 2016 CountKMSID

py-kms_2015-07-29

  • Added Windows 10 UUID

py-kms_2014-10-13 build 3:

  • Added Client Activation Examples: “client-activation.txt”

  • Added Volume Keys: “client-keys.txt”

py-kms_2014-10-13 build 2:

  • Added missing skuIds in file “kmsbase.py”. Thanks (user_hidden)

py-kms_2014-10-13 build 1:

  • The server now outputs the hwid in use.

  • The server hwid can be random by using parameter: “-w random”. Example: “python server.py -w random”

  • Included file “randomHWID.py” to generate random hwid on demand.

  • Included file “randomPID.py” to generate random epid and hwid on demand.

py-kms_2014-03-21T232943Z:

  • The server HWID can now be specified on the command line.

  • The client will print the HWID when using the v6 protocol.

py-kms_2014-01-03T032458Z:

  • Made the sqlite3 module optional.

  • Changed the “log” flag to an “sqlite” flag and made a real log flag in preparation for when real request logging is implemented.

py-kms_2014-01-03T025524Z:

  • Added RPC response decoding to the KMS client emulator.

py-kms_2013-12-30T064443Z:

  • The v4 hash now uses the proper pre-expanded key.

py-kms_2013-12-28T073506Z:

  • Modified the v4 code to use the custom aes module in order to make it more streamlined and efficient.

py-kms_2013-12-20T051257Z:

  • Removed the need for the pre-computed table (tablecomplex.py) for v4 CMAC calculation, cutting the zip file size in half.

py-kms_2013-12-16T214638Z:

  • Switched to getting the to-be-logged request time from the KMS server instead of the client.

py-kms_2013-12-16T030001Z:

  • You can now specify the CMID and the Machine Name to use with the client emulator.

py-kms_2013-12-16T021215Z:

  • Added a request-logging feature to the server. It stores requests in an SQLite database and uses the ePIDs stored there on a per-CMID basis.

  • The client emulator now works for v4, v5, and v6 requests.

  • The client emulator now also verifies the KMS v4 responses it receives.

py-kms_2013-12-14T230215Z

  • Added a client (work in progress) that right now can only generate and send RPC bind requests.

  • Added a bunch of new classes to handle RPC client stuff, but I might just end up moving their functions back into the old classes at some point.

  • Lots of other code shuffling.

  • Made the verbose and debug option help easier to read.

  • Added some server error messages.

py-kms_2013-12-08T051332Z:

  • Made some really huge internal changes to streamline packet parsing.

py-kms_2013-12-06T034100Z:

  • Added tons of new SKU IDs

py-kms_2013-12-05T044849Z:

  • Added Office SKU IDs

  • Small internal changes

py-kms_2013-12-04T010942Z:

  • Made the rpcResponseArray in rpcRequest output closer to spec

py-kms_2013-12-01T063938Z:

  • SKUID conversion: Converts the SKUID UUID into a human-readable product version for SKUIDs in its SKUID dictionary.

  • Fancy new timezone conversion stuff.

  • Enabled setting custom LCIDs.

  • Data parsing is now handled by structure.py.

  • Some other minor stuff you probably won’t notice.

py-kms_2013-11-27T061658Z:

  • Got rid of custom functions module (finally)

py-kms_2013-11-27T054744Z:

  • Simplified custom functions module

  • Got rid of “v4” subfolder

  • Cleaned up a bunch of code

py-kms_2013-11-23T044244Z:

  • Added timestamps to verbose output

  • Made the verbose output look better

py-kms_2013-11-21T014002Z:

  • Moved some stuff into verbose output

  • Enabled server ePIDs of arbitrary length

py-kms_2013-11-20T180347Z:

  • Permanently fixed machineName decoding

  • Adheres closer to the DCE/RPC protocol spec

  • Added client info to program output

  • Small formatting changes

py-kms_2013-11-13:

  • First working release added to the Mega folder.

Readme

repo-size open-issues last-commit read-the-docs


Keep in mind that this project is not intended for production use. Feel free to use it to test your own systems or maybe even learn something from the protocol structure. :)

History

py-kms is a port of node-kms created by cyrozap, which is a port of either the C#, C++, or .NET implementations of KMS Emulator. The original version was written by CODYQX4 and is derived from the reverse-engineered code of Microsoft’s official KMS. This version of py-kms is for itself a fork of the original implementation by SystemRage, which was abandoned early 2021.

Features

  • Responds to v4, v5, and v6 KMS requests.

  • Supports activating:

    • Windows Vista

    • Windows 7

    • Windows 8

    • Windows 8.1

    • Windows 10 ( 1511 / 1607 / 1703 / 1709 / 1803 / 1809 )

    • Windows 10 ( 1903 / 1909 / 20H1, 20H2, 21H1, 21H2 )

    • Windows 11 ( 21H2 )

    • Windows Server 2008

    • Windows Server 2008 R2

    • Windows Server 2012

    • Windows Server 2012 R2

    • Windows Server 2016

    • Windows Server 2019

    • Windows Server 2022

    • Microsoft Office 2010 ( Volume License )

    • Microsoft Office 2013 ( Volume License )

    • Microsoft Office 2016 ( Volume License )

    • Microsoft Office 2019 ( Volume License )

    • Microsoft Office 2021 ( Volume License )

    • It’s written in Python (tested with Python 3.10.1).

    • Supports execution by Docker, systemd and many more…

    • Uses sqlite for persistent data storage (with a simple web-based explorer).

Documentation

The wiki has been completly reworked and is now available on readthedocs.io. It should provide you all the necessary information about how to setup and to use py-kms , all without clumping this readme. The documentation also houses more details about activation with py-kms and how to get GVLK keys.

Quick start

  • To start the server, execute python3 pykms_Server.py [IPADDRESS] [PORT], the default IPADDRESS is :: ( all interfaces ) and the default PORT is 1688. Note that both the address and port are optional. It’s allowed to use IPv4 and IPv6 addresses. If you have a IPv6-capable dual-stack OS, a dual-stack socket is created when using a IPv6 address. In case your OS does not support IPv6, make sure to explicitly specify the legacy IPv4 of 0.0.0.0!

  • To start the server automatically using Docker, execute docker run -d --name py-kms --restart always -p 1688:1688 ghcr.io/py-kms-organization/py-kms.

  • To show the help pages type: python3 pykms_Server.py -h and python3 pykms_Client.py -h.

License

  • py-kms is Unlicense