Activate Microsoft Volume License products in seconds.
- One private KMS host, every supported edition. Auto-discovery via DNS SRV from inside the network,
- manual /skms from outside. No keys to remember — just install a Volume License edition
- and it activates itself.
+ Public KMS host. Point any VL Windows / Office / Project / Visio at it and it activates —
+ no keys to remember, no account, no logs of personal data beyond the activation event itself.
+ Run the one-liner below, or use the GVLK tables further down.
- Internal LAN host
+ Public KMS host
{{ .Site.Params.kmsHost }}:{{ .Site.Params.kmsPort }}
- External / off-LAN host
- {{ .Site.Params.kmsHostExt }}:{{ .Site.Params.kmsPort }}
+ Reachable from
+ any IPv4 internet
- Auto-discovery SRV
- _vlmcs._tcp.viktorbarzin.lan
+ Cost
+ free, forever
@@ -60,24 +60,29 @@
- Quick start — fully automatic on a new machine
+ Quick start
- On the home / lab network, a freshly-installed Volume License edition will activate itself
- once Windows can find the SRV record. The bootstrap script below sets the Primary DNS Suffix,
- optionally installs Office + Project (LTSC 2024 VL), triggers slmgr /ato + ospp.vbs /act,
- and prompts for a single reboot.
+ Open PowerShell as Administrator on a Volume License Windows install
+ and paste the one-liner. The script asks what you want to activate (Windows, Office,
+ Project, Visio), points each at {{ .Site.Params.kmsHost }}:{{ .Site.Params.kmsPort }},
+ runs the activation, and prints the result.
-
PowerShell (run as Administrator)
-
powershell -ExecutionPolicy Bypass -File "\\nas.viktorbarzin.lan\Emo shared\kms-bootstrap.ps1"
+
One-liner — interactive
+
iwr -UseBasicParsing https://{{ .Site.Params.kmsHost }}{{ .Site.Params.bootstrapURL }} | iex
- Off-LAN? Skip auto-discovery and pin the host explicitly:
+
+ Prefer to read the script first? View kms-bootstrap.ps1
+ or setup-kms.ps1 (a smaller, non-interactive variant
+ that just points Windows at the KMS host and runs slmgr /ato).
+
+ Want to skip the script entirely? Two cmd.exe lines do the same job:
-
cmd.exe — explicit KMS host
-
slmgr /skms kms.viktorbarzin.me
+ cmd.exe — manual
+slmgr /skms {{ .Site.Params.kmsHost }}:{{ .Site.Params.kmsPort }}
slmgr /ato
-cscript "C:\Program Files\Microsoft Office\Office16\ospp.vbs" /sethst:kms.viktorbarzin.me
+cscript "C:\Program Files\Microsoft Office\Office16\ospp.vbs" /sethst:{{ .Site.Params.kmsHost }}
cscript "C:\Program Files\Microsoft Office\Office16\ospp.vbs" /act
@@ -117,11 +122,11 @@ cscript "C:\Program Files\Microsoft Office\Office16\ospp.vbs" /act
How to use a GVLK on Windows
:: open cmd.exe as Administrator
-slmgr /upk :: remove existing key
-slmgr /ipk <PASTE-GVLK-HERE> :: install GVLK
-slmgr /skms kms.viktorbarzin.me :: optional: skip auto-discovery
-slmgr /ato :: activate
-slmgr /dlv :: verify (look for "LICENSED")
+slmgr /upk :: remove existing key
+slmgr /ipk <PASTE-GVLK-HERE> :: install GVLK
+slmgr /skms {{ .Site.Params.kmsHost }}:{{ .Site.Params.kmsPort }} :: point at this server
+slmgr /ato :: activate
+slmgr /dlv :: verify (look for "LICENSED")
@@ -201,7 +206,8 @@ slmgr /dlv :: verify (look for "LICENSED")<
Activation — bare commands
cd "C:\Program Files\Microsoft Office\Office16"
-cscript ospp.vbs /sethst:kms.viktorbarzin.me
+cscript ospp.vbs /sethst:{{ .Site.Params.kmsHost }}
+cscript ospp.vbs /setprt:{{ .Site.Params.kmsPort }}
cscript ospp.vbs /inpkey:<PASTE-GVLK>
cscript ospp.vbs /act
cscript ospp.vbs /dstatus :: verify --LICENSED--
@@ -231,11 +237,18 @@ cscript ospp.vbs /dstatus :: verify --LICENSED--
{{ end }}
- Bootstrap script
- One-shot PowerShell that wires DNS suffix, Office install, and activation:
-
- kms-bootstrap.ps1 ↗
-
+ PowerShell scripts
+ Both scripts are open-source, single-file, no dependencies. Read before running.
+
+ -
+ kms-bootstrap.ps1 ↗
+ — interactive: prompts for Windows / Office / Project / Visio and activates each.
+
+ -
+ setup-kms.ps1 ↗
+ — minimal:
slmgr /skms + /ato. No Office install.
+
+
@@ -267,12 +280,31 @@ cscript ospp.vbs /dstatus :: verify --LICENSED--
first, then install the VL edition.
- How does auto-discovery work?
- The Software Protection Service queries DNS for
- _vlmcs._tcp.<primary-dns-suffix>. If the SRV resolves it connects to that
- host on the returned port (1688 by default). On this network the suffix is
- viktorbarzin.lan and the SRV resolves to kms.viktorbarzin.lan:1688.
- Set the suffix once via System Properties → Computer Name → More → Primary DNS suffix.
+ How does auto-discovery work? Do I need it?
+ No — the Quick Start one-liner pins the host explicitly so auto-discovery is irrelevant
+ for internet visitors. It exists for managed corporate networks: the Software Protection
+ Service queries DNS for _vlmcs._tcp.<primary-dns-suffix>, and if the SRV
+ resolves, Windows connects there on the returned port. If you want it on your own LAN,
+ publish a SRV record pointing at {{ .Site.Params.kmsHost }}:{{ .Site.Params.kmsPort }}
+ (or any vlmcsd you self-host) and set the matching DNS suffix on each client.
+
+
+ Will my activation be logged? What about privacy?
+ The KMS protocol itself sends your machine's hostname, your client IP (from the TCP
+ socket), and the product ID being activated. The server records the event in a log so
+ the operator can see overall traffic. No personal data beyond what the KMS protocol
+ itself transmits is collected; nothing is shared, sold, or retained beyond the operator's
+ monitoring. If that bothers you, run your own vlmcsd — it's a single binary, the source
+ is on GitHub.
+
+
+ Is this legal? Can I use it for anything?
+ KMS activates only Volume License (VL) editions of Microsoft software.
+ VL keys are licensed per-organization by Microsoft; using a VL edition without a real VL
+ agreement violates Microsoft's licensing terms. This server exists for personal lab /
+ learning / unsupported-OS-revival use. If you don't have a VL agreement, evaluate
+ Windows + Office through Microsoft's free trial channels instead. The site operator is
+ not responsible for how visitors use the host.
How long does a KMS license last?
diff --git a/static/scripts/kms-bootstrap.ps1 b/static/scripts/kms-bootstrap.ps1
new file mode 100644
index 0000000..267b324
--- /dev/null
+++ b/static/scripts/kms-bootstrap.ps1
@@ -0,0 +1,186 @@
+# kms-bootstrap.ps1
+#
+# Interactive activator for a public KMS host (default: kms.viktorbarzin.me:1688).
+# Asks what you want to activate (Windows / already-installed Office / Project /
+# Visio), and optionally what you want to *install* (Office LTSC 2024 ProPlus,
+# Project Pro 2024, Visio Pro 2024 — all VL editions installed via the official
+# Microsoft Office Deployment Tool). Runs only what you confirm.
+#
+# Usage:
+# iwr -UseBasicParsing https://kms.viktorbarzin.me/scripts/kms-bootstrap.ps1 | iex
+#
+# Non-interactive (CI / automation):
+# $env:KMS_AUTO = 'win,office'; iwr ... | iex
+# (comma list of: win, office, project, visio, install-office,
+# install-project, install-visio)
+#
+# Custom KMS host:
+# $env:KMS_HOST = 'kms.example.com'; iwr ... | iex
+#
+# Source: https://forgejo.viktorbarzin.me/viktor/kms-website
+# Licence: MIT, no warranty, KMS activates Volume License SKUs only.
+
+[CmdletBinding()]
+param(
+ [string]$KmsHost = $(if ($env:KMS_HOST) { $env:KMS_HOST } else { 'kms.viktorbarzin.me' }),
+ [int] $KmsPort = $(if ($env:KMS_PORT) { [int]$env:KMS_PORT } else { 1688 })
+)
+
+$ErrorActionPreference = 'Stop'
+$ProgressPreference = 'SilentlyContinue'
+
+function Step($m) { Write-Host "==> $m" -ForegroundColor Cyan }
+function OK($m) { Write-Host " OK: $m" -ForegroundColor Green }
+function Warn($m) { Write-Host " !! $m" -ForegroundColor Yellow }
+function Bad($m) { Write-Host " !! $m" -ForegroundColor Red }
+
+# --- Pre-flight ----------------------------------------------------------
+if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
+ Bad "Must run as Administrator. Right-click PowerShell -> 'Run as administrator', then re-run the one-liner."
+ return
+}
+
+Write-Host ""
+Write-Host " kms.viktorbarzin.me bootstrap" -ForegroundColor White
+Write-Host " KMS host: $KmsHost`:$KmsPort"
+Write-Host " Read the script: https://kms.viktorbarzin.me/scripts/kms-bootstrap.ps1"
+Write-Host ""
+
+# --- Decide what to do ---------------------------------------------------
+function Ask([string]$question, [bool]$default) {
+ $hint = if ($default) { '[Y/n]' } else { '[y/N]' }
+ Write-Host -NoNewline " $question $hint " -ForegroundColor Yellow
+ $a = Read-Host
+ if ([string]::IsNullOrWhiteSpace($a)) { return $default }
+ return $a -match '^[yY]'
+}
+
+$auto = @{}
+if ($env:KMS_AUTO) { $env:KMS_AUTO.Split(',') | ForEach-Object { $auto[$_.Trim().ToLower()] = $true } }
+
+function Choice([string]$key, [string]$prompt, [bool]$default) {
+ if ($auto.Count -gt 0) { return [bool]$auto[$key] }
+ return Ask $prompt $default
+}
+
+Step "What would you like to do?"
+$doWin = Choice 'win' "Activate this Windows installation against KMS?" $true
+$doOfficeAct = Choice 'office' "Activate an already-installed Office (Pro Plus 2024 / 2021 / 2019 / 2016)?" $false
+$doProjAct = Choice 'project' "Activate an already-installed Project (Pro 2024 / 2021 / 2019 / 2016)?" $false
+$doVisioAct = Choice 'visio' "Activate an already-installed Visio (Pro 2024 / 2021 / 2019 / 2016)?" $false
+
+$doInstOff = Choice 'install-office' "Install Office LTSC 2024 ProPlus (VL, ~3 GB) and activate?" $false
+$doInstProj = Choice 'install-project' "Install Project Pro 2024 (VL) and activate?" $false
+$doInstVis = Choice 'install-visio' "Install Visio Pro 2024 (VL) and activate?" $false
+
+if (-not ($doWin -or $doOfficeAct -or $doProjAct -or $doVisioAct -or $doInstOff -or $doInstProj -or $doInstVis)) {
+ Warn "Nothing selected. Exiting."
+ return
+}
+
+# --- Windows -------------------------------------------------------------
+function Activate-Windows {
+ Step "Windows activation"
+ $slmgr = "$env:WINDIR\System32\slmgr.vbs"
+ & cscript //Nologo $slmgr /skms "$KmsHost`:$KmsPort" | Out-Host
+ if ($LASTEXITCODE -ne 0) { Bad "slmgr /skms failed"; return }
+ & cscript //Nologo $slmgr /ato | Out-Host
+ if ($LASTEXITCODE -ne 0) {
+ Bad "slmgr /ato failed. Most likely cause: not a Volume License edition (Home/retail/OEM cannot KMS-activate)."
+ Write-Host " See https://kms.viktorbarzin.me/#faq"
+ return
+ }
+ $dlv = & cscript //Nologo $slmgr /dlv 2>&1 | Out-String
+ if ($dlv -match 'License Status:\s*Licensed') { OK "Windows licensed" } else { Warn "Status not 'Licensed' yet — try 'slmgr /dlv' in a minute" }
+}
+if ($doWin) { Activate-Windows }
+
+# --- Office / Project / Visio: activate already-installed ----------------
+function Find-Ospp {
+ $candidates = @(
+ "${env:ProgramFiles}\Microsoft Office\Office16\ospp.vbs",
+ "${env:ProgramFiles(x86)}\Microsoft Office\Office16\ospp.vbs",
+ "${env:ProgramFiles}\Microsoft Office\Office15\ospp.vbs",
+ "${env:ProgramFiles(x86)}\Microsoft Office\Office15\ospp.vbs"
+ )
+ foreach ($c in $candidates) { if (Test-Path $c) { return $c } }
+ return $null
+}
+
+function Activate-Ospp([string]$label) {
+ $ospp = Find-Ospp
+ if (-not $ospp) {
+ Warn "$label`: ospp.vbs not found (Office not installed?). Skipping."
+ return
+ }
+ Step "$label activation via $ospp"
+ & cscript //Nologo $ospp /sethst:$KmsHost | Out-Host
+ & cscript //Nologo $ospp /setprt:$KmsPort | Out-Host
+ & cscript //Nologo $ospp /act | Out-Host
+ $st = & cscript //Nologo $ospp /dstatus 2>&1 | Out-String
+ if ($st -match '---LICENSED---') { OK "$label licensed" } else { Warn "$label status not LICENSED yet" }
+}
+if ($doOfficeAct) { Activate-Ospp 'Office' }
+if ($doProjAct) { Activate-Ospp 'Project' }
+if ($doVisioAct) { Activate-Ospp 'Visio' }
+
+# --- Install via ODT -----------------------------------------------------
+$ODT_URL = 'https://download.microsoft.com/download/2/7/A/27AF1BE6-DD20-4CB4-B154-EBAB8A7D4A7E/officedeploymenttool_19127-20198.exe'
+
+function Install-Odt-Bundle([string[]]$products) {
+ $tmp = Join-Path $env:TEMP "kms-odt-$(Get-Random)"
+ New-Item -ItemType Directory -Force -Path $tmp | Out-Null
+ $odtExe = Join-Path $tmp 'odt.exe'
+ Step "Downloading Office Deployment Tool to $tmp"
+ Invoke-WebRequest -UseBasicParsing -Uri $ODT_URL -OutFile $odtExe
+ Step "Extracting ODT"
+ Start-Process -FilePath $odtExe -ArgumentList "/extract:`"$tmp`"", '/quiet' -Wait
+ $setup = Join-Path $tmp 'setup.exe'
+ if (-not (Test-Path $setup)) { Bad "ODT extraction failed (no setup.exe in $tmp)"; return }
+
+ # Build Configuration.xml — only the requested VL Products.
+ $productXml = ($products | ForEach-Object { "" }) -join ''
+ $cfgXml = @"
+
+
+ $productXml
+
+
+
+
+
+
+"@
+ $cfg = Join-Path $tmp 'Configuration.xml'
+ Set-Content -Path $cfg -Value $cfgXml -Encoding UTF8
+
+ Step "Running setup.exe /configure (this can take 5-15 min depending on bandwidth)"
+ Start-Process -FilePath $setup -ArgumentList '/configure', "`"$cfg`"" -Wait
+ if ($LASTEXITCODE -ne 0 -and $LASTEXITCODE -ne $null) { Warn "ODT exit code $LASTEXITCODE" }
+
+ # Pin KMS host + activate
+ $ospp = Find-Ospp
+ if ($ospp) {
+ Step "Pinning Office at $KmsHost`:$KmsPort and activating"
+ & cscript //Nologo $ospp /sethst:$KmsHost | Out-Host
+ & cscript //Nologo $ospp /setprt:$KmsPort | Out-Host
+ & cscript //Nologo $ospp /act | Out-Host
+ $st = & cscript //Nologo $ospp /dstatus 2>&1 | Out-String
+ if ($st -match '---LICENSED---') { OK "Office bundle licensed" } else { Warn "Status not LICENSED yet" }
+ } else {
+ Warn "ospp.vbs still not found post-install — manual /act needed."
+ }
+
+ Remove-Item -Recurse -Force $tmp -ErrorAction SilentlyContinue
+}
+
+$installList = @()
+if ($doInstOff) { $installList += 'ProPlus2024Volume' }
+if ($doInstProj) { $installList += 'ProjectPro2024Volume' }
+if ($doInstVis) { $installList += 'VisioPro2024Volume' }
+if ($installList.Count -gt 0) { Install-Odt-Bundle $installList }
+
+Write-Host ""
+Step "Done."
+Write-Host " Re-run any time to re-check status. KMS licences renew automatically every 7 days."
+Write-Host " Operator-side: this activation has been logged. Privacy notes: https://kms.viktorbarzin.me/#faq"
diff --git a/static/scripts/setup-kms.ps1 b/static/scripts/setup-kms.ps1
new file mode 100644
index 0000000..46c7a05
--- /dev/null
+++ b/static/scripts/setup-kms.ps1
@@ -0,0 +1,67 @@
+# setup-kms.ps1
+#
+# Minimal KMS-host wiring for an already-installed Volume License Windows.
+# Runs `slmgr /skms :` + `slmgr /ato` and prints the licence status.
+# Does NOT install Office. Does NOT change DNS suffix. Pin only.
+#
+# Usage:
+# iwr -UseBasicParsing https://kms.viktorbarzin.me/scripts/setup-kms.ps1 | iex
+#
+# Or with a custom KMS host (e.g. self-hosted):
+# $env:KMS_HOST = 'kms.example.com'; iwr ... | iex
+#
+# Source: https://forgejo.viktorbarzin.me/viktor/kms-website
+# Licence: MIT, no warranty, KMS activates Volume License SKUs only.
+
+[CmdletBinding()]
+param(
+ [string]$KmsHost = $(if ($env:KMS_HOST) { $env:KMS_HOST } else { 'kms.viktorbarzin.me' }),
+ [int] $KmsPort = $(if ($env:KMS_PORT) { [int]$env:KMS_PORT } else { 1688 })
+)
+
+$ErrorActionPreference = 'Stop'
+
+function Step($m) { Write-Host "==> $m" -ForegroundColor Cyan }
+function OK($m) { Write-Host " OK: $m" -ForegroundColor Green }
+function Bad($m) { Write-Host " !! $m" -ForegroundColor Red }
+
+if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
+ Bad "Must run as Administrator. Right-click PowerShell -> 'Run as administrator', then retry."
+ return
+}
+
+Step "KMS host = $KmsHost`:$KmsPort"
+$slmgr = "$env:WINDIR\System32\slmgr.vbs"
+
+Step "slmgr /skms $KmsHost`:$KmsPort"
+$out = & cscript //Nologo $slmgr /skms "$KmsHost`:$KmsPort" 2>&1
+Write-Host $out
+if ($LASTEXITCODE -ne 0) { Bad "slmgr /skms failed (exit $LASTEXITCODE)"; return }
+OK "KMS host pinned"
+
+Step "slmgr /ato (activate)"
+$out = & cscript //Nologo $slmgr /ato 2>&1
+Write-Host $out
+if ($LASTEXITCODE -ne 0) {
+ Bad "slmgr /ato failed (exit $LASTEXITCODE)"
+ Write-Host ""
+ Write-Host "Most common cause: this Windows is not a Volume License edition."
+ Write-Host "KMS activates only VL SKUs (Pro, Enterprise, Education, LTSC, Server)."
+ Write-Host "Home / retail / OEM keys reject KMS responses. See https://kms.viktorbarzin.me/#faq"
+ return
+}
+OK "Activation request sent"
+
+Step "slmgr /dlv (status)"
+$out = & cscript //Nologo $slmgr /dlv 2>&1
+Write-Host $out
+
+if ($out -match 'License Status:\s*Licensed') {
+ Write-Host ""
+ Write-Host "==> SUCCESS: Windows is now licensed via KMS." -ForegroundColor Green
+ Write-Host " Licence renews automatically every 7 days; lasts 180 days per renewal."
+} else {
+ Write-Host ""
+ Write-Host "==> Activation request sent but status is not 'Licensed' yet." -ForegroundColor Yellow
+ Write-Host " Re-run 'slmgr /dlv' in a minute, or check https://kms.viktorbarzin.me/#faq"
+}