From efa1353e6b08bd013ccebb5a2dcd41e24a7b33e9 Mon Sep 17 00:00:00 2001 From: Viktor Barzin Date: Mon, 1 Jun 2026 08:05:31 +0000 Subject: [PATCH] kms-website: activate against vlmcs.viktorbarzin.me, drop ODT-install + deep-legacy GVLKs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- data/products.yaml | 125 ------------------------------- hugo.toml | 8 +- layouts/index.html | 22 ++++-- static/scripts/kms-bootstrap.ps1 | 75 ++----------------- static/scripts/setup-kms.ps1 | 2 +- 5 files changed, 30 insertions(+), 202 deletions(-) diff --git a/data/products.yaml b/data/products.yaml index 5f9614a..a6bc9cc 100644 --- a/data/products.yaml +++ b/data/products.yaml @@ -82,67 +82,6 @@ windows: edition: "Enterprise N LTSB 2015" 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: - family: "Windows Server 2025" edition: "Standard" @@ -192,70 +131,6 @@ windows_server: - family: "Windows Server 2016" edition: "Essentials" 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 LTSC 2024 — current - family: "Office LTSC 2024" diff --git a/hugo.toml b/hugo.toml index 4fc7d39..0919514 100644 --- a/hugo.toml +++ b/hugo.toml @@ -5,8 +5,12 @@ disableKinds = ["taxonomy", "term", "RSS", "sitemap", "404"] [params] description = "Public KMS host for activating Microsoft Volume License Windows, Office, Project, and Visio. Free, no signup, no tracking." - kmsHost = "kms.viktorbarzin.me" - kmsHostLan = "kms.viktorbarzin.lan" + # siteHost serves this website + the /scripts/*.ps1 downloads (Traefik). + # 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 bootstrapURL = "/scripts/kms-bootstrap.ps1" setupURL = "/scripts/setup-kms.ps1" diff --git a/layouts/index.html b/layouts/index.html index fc3e4c4..e59f82a 100644 --- a/layouts/index.html +++ b/layouts/index.html @@ -70,15 +70,15 @@
Windows only
-
$env:KMS_AUTO='win'; iwr -UseBasicParsing https://{{ .Site.Params.kmsHost }}{{ .Site.Params.bootstrapURL }} | iex
+
$env:KMS_AUTO='win'; iwr -UseBasicParsing https://{{ .Site.Params.siteHost }}{{ .Site.Params.bootstrapURL }} | iex
Office / Project / Visio
-
$env:KMS_AUTO='office,project,visio'; iwr -UseBasicParsing https://{{ .Site.Params.kmsHost }}{{ .Site.Params.bootstrapURL }} | iex
+
$env:KMS_AUTO='office,project,visio'; iwr -UseBasicParsing https://{{ .Site.Params.siteHost }}{{ .Site.Params.bootstrapURL }} | iex
Windows + Office
-
$env:KMS_AUTO='win,office,project,visio'; iwr -UseBasicParsing https://{{ .Site.Params.kmsHost }}{{ .Site.Params.bootstrapURL }} | iex
+
$env:KMS_AUTO='win,office,project,visio'; iwr -UseBasicParsing https://{{ .Site.Params.siteHost }}{{ .Site.Params.bootstrapURL }} | iex

@@ -111,7 +111,7 @@ cscript "C:\Program Files\Microsoft Office\Office16\ospp.vbs" /act Click any key to copy.

- {{ $order := slice "Windows 11 / 10" "Windows LTSC" "Legacy desktop" }} + {{ $order := slice "Windows 11 / 10" "Windows LTSC" }} {{ range $family := $order }} {{ $items := where $windows "family" $family }} {{ if $items }} @@ -131,6 +131,13 @@ cscript "C:\Program Files\Microsoft Office\Office16\ospp.vbs" /act {{ end }} {{ end }} +

+ Legacy desktop (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 + KMS client key list + and activate with the same slmgr steps below. +

+
How to use a GVLK on Windows
:: open cmd.exe as Administrator
@@ -146,7 +153,7 @@ slmgr /dlv                                       :: verify (look for "LICEN
   

Windows Server

Server SKUs need only 5 unique clients to satisfy the KMS activation count threshold (vs. 25 for desktop).

- {{ $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 }} {{ $items := where $servers "family" $family }} {{ if $items }} @@ -165,6 +172,11 @@ slmgr /dlv :: verify (look for "LICEN {{ end }} {{ end }} +

+ Server 2012 R2 / 2012 / 2008 R2 / 2008 are end-of-life and omitted. + Their GVLKs still activate here — see Microsoft's + KMS client key list. +

diff --git a/static/scripts/kms-bootstrap.ps1 b/static/scripts/kms-bootstrap.ps1 index a02fdf9..08ec094 100644 --- a/static/scripts/kms-bootstrap.ps1 +++ b/static/scripts/kms-bootstrap.ps1 @@ -1,18 +1,15 @@ # 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. +# Interactive KMS activator. Asks what you want to activate (Windows / +# already-installed Office / Project / Visio) and runs only what you confirm. +# Points each product at the public KMS host (default: vlmcs.viktorbarzin.me:1688). # # 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) +# (comma list of: win, office, project, visio) # # Custom KMS host: # $env:KMS_HOST = 'kms.example.com'; iwr ... | iex @@ -22,7 +19,7 @@ [CmdletBinding()] 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 }) ) @@ -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 $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)) { +if (-not ($doWin -or $doOfficeAct -or $doProjAct -or $doVisioAct)) { Warn "Nothing selected. Exiting." return } @@ -124,62 +117,6 @@ 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." diff --git a/static/scripts/setup-kms.ps1 b/static/scripts/setup-kms.ps1 index 3aee970..2d15aa4 100644 --- a/static/scripts/setup-kms.ps1 +++ b/static/scripts/setup-kms.ps1 @@ -15,7 +15,7 @@ [CmdletBinding()] 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 }) )