kms-website: activate against vlmcs.viktorbarzin.me, drop ODT-install + deep-legacy GVLKs

The page advertised kms.viktorbarzin.me:1688 as the KMS host, but that name
is the website (Traefik) — internally it resolves to 10.0.20.203 which has no
:1688 listener, so LAN clients failed with "KMS server cannot be reached".
Split the concern: siteHost (kms.viktorbarzin.me) serves the page + /scripts
downloads; kmsHost is now the dedicated A-only vlmcs.viktorbarzin.me endpoint
that resolves to the vlmcsd MetalLB IP (10.0.20.202) on the LAN (Technitium)
and to the public IP over the internet (Cloudflare -> pfSense WAN NAT :1688).

Moderate cleanup:
- remove the Office-install-via-ODT path from kms-bootstrap.ps1 (activation
  only now; manual ODT install docs stay on the page)
- collapse Windows 8.1/8/7/Vista + Server 2012/2008 GVLK tables into a legacy
  note (those keys still activate; just no longer tabled)
- drop the unused kmsHostLan param

Pairs with the infra /scripts Anubis carve-out that makes `iwr | iex` work.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Viktor Barzin 2026-06-01 08:05:31 +00:00
parent 8bcb64bf99
commit efa1353e6b
5 changed files with 30 additions and 202 deletions

View file

@ -82,67 +82,6 @@ windows:
edition: "Enterprise N LTSB 2015" edition: "Enterprise N LTSB 2015"
gvlk: "2F77B-TNFGY-69QQF-B8YKP-D69TJ" gvlk: "2F77B-TNFGY-69QQF-B8YKP-D69TJ"
# Legacy desktop
- family: "Legacy desktop"
edition: "Windows 8.1 Pro"
gvlk: "GCRJD-8NW9H-F2CDX-CCM8D-9D6T9"
notes: "Out of support since Jan 2023."
- family: "Legacy desktop"
edition: "Windows 8.1 Pro N"
gvlk: "HMCNV-VVBFX-7HMBH-CTY9B-B4FXY"
- family: "Legacy desktop"
edition: "Windows 8.1 Enterprise"
gvlk: "MHF9N-XY6XB-WVXMC-BTDCT-MKKG7"
- family: "Legacy desktop"
edition: "Windows 8.1 Enterprise N"
gvlk: "TT4HM-HN7YT-62K67-RGRQJ-JFFXW"
- family: "Legacy desktop"
edition: "Windows 8 Pro"
gvlk: "NG4HW-VH26C-733KW-K6F98-J8CK4"
notes: "EOL Jan 2016."
- family: "Legacy desktop"
edition: "Windows 8 Pro N"
gvlk: "XCVCF-2NXM9-723PB-MHCB7-2RYQQ"
- family: "Legacy desktop"
edition: "Windows 8 Enterprise"
gvlk: "32JNW-9KQ84-P47T8-D8GGY-CWCK7"
- family: "Legacy desktop"
edition: "Windows 8 Enterprise N"
gvlk: "JMNMF-RHW7P-DMY6X-RF3DR-X2BQT"
- family: "Legacy desktop"
edition: "Windows 7 Professional"
gvlk: "FJ82H-XT6CR-J8D7P-XQJJ2-GPDD4"
notes: "EOL Jan 2020 (ESU through 2023)."
- family: "Legacy desktop"
edition: "Windows 7 Professional N"
gvlk: "MRPKT-YTG23-K7D7T-X2JMM-QY7MG"
- family: "Legacy desktop"
edition: "Windows 7 Professional E"
gvlk: "W82YF-2Q76Y-63HXB-FGJG9-GF7QX"
- family: "Legacy desktop"
edition: "Windows 7 Enterprise"
gvlk: "33PXH-7Y6KF-2VJC9-XBBR8-HVTHH"
- family: "Legacy desktop"
edition: "Windows 7 Enterprise N"
gvlk: "YDRBP-3D83W-TY26F-D46B2-XCKRJ"
- family: "Legacy desktop"
edition: "Windows 7 Enterprise E"
gvlk: "C29WB-22CC8-VJ326-GHFJW-H9DH4"
notes: "Win7 Ultimate is NOT KMS-activatable — not a Volume License SKU."
- family: "Legacy desktop"
edition: "Windows Vista Business"
gvlk: "YFKBB-PQJJV-G996G-VWGXY-2V3X8"
notes: "EOL Apr 2017."
- family: "Legacy desktop"
edition: "Windows Vista Business N"
gvlk: "HMBQG-8H2RH-C77VX-27R82-VMQBT"
- family: "Legacy desktop"
edition: "Windows Vista Enterprise"
gvlk: "VKK3X-68KWM-X2YGT-QR4M6-4BWMV"
- family: "Legacy desktop"
edition: "Windows Vista Enterprise N"
gvlk: "VTC42-BM838-43QHV-84HX6-XJXKV"
windows_server: windows_server:
- family: "Windows Server 2025" - family: "Windows Server 2025"
edition: "Standard" edition: "Standard"
@ -192,70 +131,6 @@ windows_server:
- family: "Windows Server 2016" - family: "Windows Server 2016"
edition: "Essentials" edition: "Essentials"
gvlk: "JCKRF-N37P4-C2D82-9YXRT-4M63B" gvlk: "JCKRF-N37P4-C2D82-9YXRT-4M63B"
- family: "Windows Server 2012 R2"
edition: "Standard"
gvlk: "D2N9P-3P6X9-2R39C-7RTCD-MDVJX"
notes: "EOL Oct 2023; ESU available."
- family: "Windows Server 2012 R2"
edition: "Datacenter"
gvlk: "W3GGN-FT8W3-Y4M27-J84CP-Q3VJ9"
- family: "Windows Server 2012 R2"
edition: "Essentials"
gvlk: "KNC87-3J2TX-XB4WP-VCPJV-M4FWM"
- family: "Windows Server 2012"
edition: "Standard"
gvlk: "XC9B7-NBPP2-83J2H-RHMBY-92BT4"
- family: "Windows Server 2012"
edition: "Datacenter"
gvlk: "48HP8-DN98B-MYWDG-T2DCC-8W83P"
- family: "Windows Server 2012"
edition: "Essentials"
gvlk: "HTDQM-NBMMG-KGYDT-2DTKT-J2MPV"
- family: "Windows Server 2012"
edition: "MultiPoint Standard"
gvlk: "HM7DN-YVMH3-46JC3-XYTG7-CYQJJ"
- family: "Windows Server 2012"
edition: "MultiPoint Premium"
gvlk: "XNH6W-2V9GX-RGJ4K-Y8X6F-QGJ2G"
- family: "Windows Server 2008 R2"
edition: "Standard"
gvlk: "YC6KT-GKW9T-YTKYR-T4X34-R7VHC"
notes: "EOL Jan 2020 (ESU 2023)."
- family: "Windows Server 2008 R2"
edition: "Enterprise"
gvlk: "489J6-VHDMP-X63PK-3K798-CPX3Y"
- family: "Windows Server 2008 R2"
edition: "Datacenter"
gvlk: "74YFP-3QFB3-KQT8W-PMXWJ-7M648"
- family: "Windows Server 2008 R2"
edition: "Web"
gvlk: "6TPJF-RBVHG-WBW2R-86QPH-6RTM4"
- family: "Windows Server 2008 R2"
edition: "HPC"
gvlk: "TT8MH-CG224-D3D7Q-498W2-9QCTX"
- family: "Windows Server 2008 R2"
edition: "Itanium"
gvlk: "GT63C-RJFQ3-4GMB6-BRFB9-CB83V"
- family: "Windows Server 2008"
edition: "Standard"
gvlk: "TM24T-X9RMF-VWXK6-X8JC9-BFGM2"
notes: "EOL Jan 2020."
- family: "Windows Server 2008"
edition: "Enterprise"
gvlk: "YQGMW-MPWTJ-34KDK-48M3W-X4Q6V"
- family: "Windows Server 2008"
edition: "Datacenter"
gvlk: "7M67G-PC374-GR742-YH8V4-TCBY3"
- family: "Windows Server 2008"
edition: "Web"
gvlk: "WYR28-R7TFJ-3X2YQ-YCY4H-M249D"
- family: "Windows Server 2008"
edition: "HPC"
gvlk: "RCTX3-KWVHP-BR6TB-RB6DM-6X7HP"
- family: "Windows Server 2008"
edition: "Itanium"
gvlk: "4DWFP-JF3DJ-B7DTH-78FJB-PDRHK"
office: office:
# Office LTSC 2024 — current # Office LTSC 2024 — current
- family: "Office LTSC 2024" - family: "Office LTSC 2024"

View file

@ -5,8 +5,12 @@ disableKinds = ["taxonomy", "term", "RSS", "sitemap", "404"]
[params] [params]
description = "Public KMS host for activating Microsoft Volume License Windows, Office, Project, and Visio. Free, no signup, no tracking." description = "Public KMS host for activating Microsoft Volume License Windows, Office, Project, and Visio. Free, no signup, no tracking."
kmsHost = "kms.viktorbarzin.me" # siteHost serves this website + the /scripts/*.ps1 downloads (Traefik).
kmsHostLan = "kms.viktorbarzin.lan" # kmsHost is the raw KMS endpoint on :1688 (vlmcsd) — a SEPARATE A-only host
# so it resolves to the KMS server both on the LAN and over the internet.
# They must stay distinct: kms.viktorbarzin.me:1688 hits Traefik (no KMS).
siteHost = "kms.viktorbarzin.me"
kmsHost = "vlmcs.viktorbarzin.me"
kmsPort = 1688 kmsPort = 1688
bootstrapURL = "/scripts/kms-bootstrap.ps1" bootstrapURL = "/scripts/kms-bootstrap.ps1"
setupURL = "/scripts/setup-kms.ps1" setupURL = "/scripts/setup-kms.ps1"

View file

@ -70,15 +70,15 @@
<div class="quickstart-grid"> <div class="quickstart-grid">
<div class="card terminal"> <div class="card terminal">
<div class="card-head"><span>Windows only</span><button class="btn-copy" data-copy-target="quickstart-win">Copy</button></div> <div class="card-head"><span>Windows only</span><button class="btn-copy" data-copy-target="quickstart-win">Copy</button></div>
<pre id="quickstart-win"><code>$env:KMS_AUTO='win'; iwr -UseBasicParsing https://{{ .Site.Params.kmsHost }}{{ .Site.Params.bootstrapURL }} | iex</code></pre> <pre id="quickstart-win"><code>$env:KMS_AUTO='win'; iwr -UseBasicParsing https://{{ .Site.Params.siteHost }}{{ .Site.Params.bootstrapURL }} | iex</code></pre>
</div> </div>
<div class="card terminal"> <div class="card terminal">
<div class="card-head"><span>Office / Project / Visio</span><button class="btn-copy" data-copy-target="quickstart-office">Copy</button></div> <div class="card-head"><span>Office / Project / Visio</span><button class="btn-copy" data-copy-target="quickstart-office">Copy</button></div>
<pre id="quickstart-office"><code>$env:KMS_AUTO='office,project,visio'; iwr -UseBasicParsing https://{{ .Site.Params.kmsHost }}{{ .Site.Params.bootstrapURL }} | iex</code></pre> <pre id="quickstart-office"><code>$env:KMS_AUTO='office,project,visio'; iwr -UseBasicParsing https://{{ .Site.Params.siteHost }}{{ .Site.Params.bootstrapURL }} | iex</code></pre>
</div> </div>
<div class="card terminal"> <div class="card terminal">
<div class="card-head"><span>Windows + Office</span><button class="btn-copy" data-copy-target="quickstart-both">Copy</button></div> <div class="card-head"><span>Windows + Office</span><button class="btn-copy" data-copy-target="quickstart-both">Copy</button></div>
<pre id="quickstart-both"><code>$env:KMS_AUTO='win,office,project,visio'; iwr -UseBasicParsing https://{{ .Site.Params.kmsHost }}{{ .Site.Params.bootstrapURL }} | iex</code></pre> <pre id="quickstart-both"><code>$env:KMS_AUTO='win,office,project,visio'; iwr -UseBasicParsing https://{{ .Site.Params.siteHost }}{{ .Site.Params.bootstrapURL }} | iex</code></pre>
</div> </div>
</div> </div>
<p class="hint"> <p class="hint">
@ -111,7 +111,7 @@ cscript "C:\Program Files\Microsoft Office\Office16\ospp.vbs" /act</code></pre>
Click any key to copy. Click any key to copy.
</p> </p>
{{ $order := slice "Windows 11 / 10" "Windows LTSC" "Legacy desktop" }} {{ $order := slice "Windows 11 / 10" "Windows LTSC" }}
{{ range $family := $order }} {{ range $family := $order }}
{{ $items := where $windows "family" $family }} {{ $items := where $windows "family" $family }}
{{ if $items }} {{ if $items }}
@ -131,6 +131,13 @@ cscript "C:\Program Files\Microsoft Office\Office16\ospp.vbs" /act</code></pre>
{{ end }} {{ end }}
{{ end }} {{ end }}
<p class="hint">
<strong>Legacy desktop</strong> (Windows 8.1 / 8 / 7 / Vista) is out of support and omitted.
Those GVLKs still work against this KMS — look them up in Microsoft's
<a href="https://learn.microsoft.com/en-us/windows-server/get-started/kms-client-activation-keys" target="_blank" rel="noopener">KMS client key list</a>
and activate with the same <code>slmgr</code> steps below.
</p>
<details class="card"> <details class="card">
<summary>How to use a GVLK on Windows</summary> <summary>How to use a GVLK on Windows</summary>
<pre><code>:: open cmd.exe as Administrator <pre><code>:: open cmd.exe as Administrator
@ -146,7 +153,7 @@ slmgr /dlv :: verify (look for &quot;LICEN
<h2>Windows Server</h2> <h2>Windows Server</h2>
<p class="muted">Server SKUs need only 5 unique clients to satisfy the KMS activation count threshold (vs. 25 for desktop).</p> <p class="muted">Server SKUs need only 5 unique clients to satisfy the KMS activation count threshold (vs. 25 for desktop).</p>
{{ $serverOrder := slice "Windows Server 2025" "Windows Server 2022" "Windows Server 2019" "Windows Server 2016" "Windows Server 2012 R2" "Windows Server 2012" "Windows Server 2008 R2" "Windows Server 2008" }} {{ $serverOrder := slice "Windows Server 2025" "Windows Server 2022" "Windows Server 2019" "Windows Server 2016" }}
{{ range $family := $serverOrder }} {{ range $family := $serverOrder }}
{{ $items := where $servers "family" $family }} {{ $items := where $servers "family" $family }}
{{ if $items }} {{ if $items }}
@ -165,6 +172,11 @@ slmgr /dlv :: verify (look for &quot;LICEN
</table> </table>
{{ end }} {{ end }}
{{ end }} {{ end }}
<p class="hint">
<strong>Server 2012 R2 / 2012 / 2008 R2 / 2008</strong> are end-of-life and omitted.
Their GVLKs still activate here — see Microsoft's
<a href="https://learn.microsoft.com/en-us/windows-server/get-started/kms-client-activation-keys" target="_blank" rel="noopener">KMS client key list</a>.
</p>
</section> </section>
<section id="office"> <section id="office">

View file

@ -1,18 +1,15 @@
# kms-bootstrap.ps1 # kms-bootstrap.ps1
# #
# Interactive activator for a public KMS host (default: kms.viktorbarzin.me:1688). # Interactive KMS activator. Asks what you want to activate (Windows /
# Asks what you want to activate (Windows / already-installed Office / Project / # already-installed Office / Project / Visio) and runs only what you confirm.
# Visio), and optionally what you want to *install* (Office LTSC 2024 ProPlus, # Points each product at the public KMS host (default: vlmcs.viktorbarzin.me:1688).
# Project Pro 2024, Visio Pro 2024 — all VL editions installed via the official
# Microsoft Office Deployment Tool). Runs only what you confirm.
# #
# Usage: # Usage:
# iwr -UseBasicParsing https://kms.viktorbarzin.me/scripts/kms-bootstrap.ps1 | iex # iwr -UseBasicParsing https://kms.viktorbarzin.me/scripts/kms-bootstrap.ps1 | iex
# #
# Non-interactive (CI / automation): # Non-interactive (CI / automation):
# $env:KMS_AUTO = 'win,office'; iwr ... | iex # $env:KMS_AUTO = 'win,office'; iwr ... | iex
# (comma list of: win, office, project, visio, install-office, # (comma list of: win, office, project, visio)
# install-project, install-visio)
# #
# Custom KMS host: # Custom KMS host:
# $env:KMS_HOST = 'kms.example.com'; iwr ... | iex # $env:KMS_HOST = 'kms.example.com'; iwr ... | iex
@ -22,7 +19,7 @@
[CmdletBinding()] [CmdletBinding()]
param( param(
[string]$KmsHost = $(if ($env:KMS_HOST) { $env:KMS_HOST } else { 'kms.viktorbarzin.me' }), [string]$KmsHost = $(if ($env:KMS_HOST) { $env:KMS_HOST } else { 'vlmcs.viktorbarzin.me' }),
[int] $KmsPort = $(if ($env:KMS_PORT) { [int]$env:KMS_PORT } else { 1688 }) [int] $KmsPort = $(if ($env:KMS_PORT) { [int]$env:KMS_PORT } else { 1688 })
) )
@ -69,11 +66,7 @@ $doOfficeAct = Choice 'office' "Activate an already-installed Office (P
$doProjAct = Choice 'project' "Activate an already-installed Project (Pro 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 $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 if (-not ($doWin -or $doOfficeAct -or $doProjAct -or $doVisioAct)) {
$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." Warn "Nothing selected. Exiting."
return return
} }
@ -124,62 +117,6 @@ if ($doOfficeAct) { Activate-Ospp 'Office' }
if ($doProjAct) { Activate-Ospp 'Project' } if ($doProjAct) { Activate-Ospp 'Project' }
if ($doVisioAct) { Activate-Ospp 'Visio' } 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 { "<Product ID=`"$_`"><Language ID=`"en-us`" /></Product>" }) -join ''
$cfgXml = @"
<Configuration>
<Add OfficeClientEdition="64" Channel="PerpetualVL2024">
$productXml
</Add>
<Updates Enabled="TRUE" Channel="PerpetualVL2024" />
<Display Level="None" AcceptEULA="TRUE" />
<Property Name="AUTOACTIVATE" Value="1" />
<Property Name="FORCEAPPSHUTDOWN" Value="TRUE" />
</Configuration>
"@
$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 "" Write-Host ""
Step "Done." Step "Done."
Write-Host " Re-run any time to re-check status. KMS licences renew automatically every 7 days." Write-Host " Re-run any time to re-check status. KMS licences renew automatically every 7 days."

View file

@ -15,7 +15,7 @@
[CmdletBinding()] [CmdletBinding()]
param( param(
[string]$KmsHost = $(if ($env:KMS_HOST) { $env:KMS_HOST } else { 'kms.viktorbarzin.me' }), [string]$KmsHost = $(if ($env:KMS_HOST) { $env:KMS_HOST } else { 'vlmcs.viktorbarzin.me' }),
[int] $KmsPort = $(if ($env:KMS_PORT) { [int]$env:KMS_PORT } else { 1688 }) [int] $KmsPort = $(if ($env:KMS_PORT) { [int]$env:KMS_PORT } else { 1688 })
) )