Have you ever needed to programmatically set the KMS keys on a bunch of systems? This PowerShell script allows you to do that.
Feed the script with the name of the KMS server, or you can hard-code it if you prefer.
The script detects the OS version and sets the appropriate GVLK (generic) KMS key. It then sets the location of the KMS server itself and attempts to activate the system. Lastly it pops up the result. Everything is done by leveraging the existing SLMGR VB script on every Windows system.
Place the script on a common server and call it from the system to be activated. That can be from a one-time run key, manually, or from a remote PowerShell session.
I also included the full list of GVLK keys and Windows OS version numbers at the end for reference. Remember that by themselves these keys will not activate systems, you need to use them in conjunction with a fully licensed KMS server.
#======================================================================================
# File Name : Register-GVLK.ps1
# Original Author : Kenneth C. Mazie (kcmjr AT
kcmjr.com)
# :
# Description : Used to set generic KMS keys on target system.
# :
# Notes : Can be used with command line option to specify KMS server or not.
# :
# :
# Warnings :
# :
# Legal : Public Domain. Modify and
redistribute freely. No rights reserved.
# : SCRIPT PROVIDED "AS
IS" WITHOUT WARRANTIES OR GUARANTEES OF
# : ANY KIND. USE AT YOUR OWN
RISK. NO TECHNICAL SUPPORT PROVIDED.
# :
# Credits : Code snippets and/or ideas
came from many sources including but
# : not limited to the following:
# :
# Last Update by : Kenneth C. Mazie
# Version History : v1.0 - 06-15-14 - Original
# Change History : v1.1 -
# :
# :
#=======================================================================================
Clear-Host
$computer = "localhost"
#$Server = "mykms-server"
Param(
[string]$Server
)
$Rearm = $False #--[ Change to $true if you want to
rearm the registration.
#--[ Force to execute with admin
priviledge ]--
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
$principal = new-object Security.Principal.WindowsPrincipal $identity
if ($principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) -eq $false) {
$Args = '-noprofile -nologo -executionpolicy bypass -file
"{0}"' -f $MyInvocation.MyCommand.Path
Start-Process -FilePath 'powershell.exe' -ArgumentList $Args -Verb RunAs
exit
}
If ($Rearm -eq $True){
If(!(test-path "c:\Scripts\rearm.flag")){
New-Item "c:\scripts\rearm.flag" -type file
iex "slmgr
-rearm"
sleep -sec 3
iex "shutdown
-r -t 0"
}
}
$os = Get-WmiObject -class Win32_OperatingSystem -computerName $computer
Switch ($os.Version)
{
"5.1.2600" { $ProdDesc = "xp" }
"5.1.3790" { $ProdDesc = "2003" }
"6.0.6001"
{
If($os.ProductType -eq "1"){$ProdKey = "VKK3X-68KWM-X2YGT-QR4M6-4BWMV"; $ProdDesc = "Windows
Vista" }
If($os.ProductType -eq "2"){$ProdKey = "TM24T-X9RMF-VWXK6-X8JC9-BFGM2"; $ProdDesc = "Windows
Server 2008"}
If($os.ProductType -eq "3"){$ProdKey = "TM24T-X9RMF-VWXK6-X8JC9-BFGM2"; $ProdDesc = "Windows
Server 2008"}
}
"6.1.7601"
{
If($os.ProductType -eq "1"){$ProdKey = "FJ82H-XT6CR-J8D7P-XQJJ2-GPDD4"; $ProdDesc = "Windows
7"}
If($os.ProductType -eq "2"){$ProdKey = "YC6KT-GKW9T-YTKYR-T4X34-R7VHC"; $ProdDesc = "Windows
Server 2008 R2 Domain Controller"}
If($os.ProductType -eq "3"){$ProdKey = "YC6KT-GKW9T-YTKYR-T4X34-R7VHC"; $ProdDesc = "Windows
Server 2008 R2"}
}
"6.2.9200"
{
If($os.ProductType -eq "1"){$ProdKey = "NG4HW-VH26C-733KW-K6F98-J8CK4"; $ProdDesc = "Windows
8"}
If($os.ProductType -eq "2"){$ProdKey = "48HP8-DN98B-MYWDG-T2DCC-8W83P"; $ProdDesc = "Windows
Server 2012 Domain Controller"}
If($os.ProductType -eq "3"){$ProdKey = "48HP8-DN98B-MYWDG-T2DCC-8W83P"; $ProdDesc = "Windows
Server 2012"}
}
"6.3.9600"
{
If($os.ProductType -eq "1"){$ProdKey = "GCRJD-8NW9H-F2CDX-CCM8D-9D6T9"; $ProdDesc = "Windows
8.1"}
If($os.ProductType -eq "2"){$ProdKey = "W3GGN-FT8W3-Y4M27-J84CP-Q3VJ9"; $ProdDesc = "Windows
Server 2012 R2 Domain Controller"}
If($os.ProductType -eq "3"){$ProdKey = "W3GGN-FT8W3-Y4M27-J84CP-Q3VJ9"; $ProdDesc = "Windows
Server 2012 R2"}
}
DEFAULT { "Version not listed" }
}
$wShell = New-Object -ComObject Wscript.Shell
$Message = $wShell.Popup("Activating
$ProdDesc",5,"Windows Activation Script",64)
If ($Server = "DNS"){
iex "slmgr /ckms"
}Else{
iex "slmgr /skms $Server:1688"
}
sleep -Seconds 3
iex "slmgr
/ipk $ProdKey"
sleep -Seconds 3
iex "slmgr
/ato"
iex "slmgr
/dlv"
#$ProdDesc
$wshell = $null
<#------ NOTES ------
Operating system edition KMS Client GVLK Setup Key
-------------------------
-----------------------------
Windows 8.1 Professional GCRJD-8NW9H-F2CDX-CCM8D-9D6T9
Windows 8.1 Professional N
HMCNV-VVBFX-7HMBH-CTY9B-B4FXY
Windows 8.1 Enterprise
MHF9N-XY6XB-WVXMC-BTDCT-MKKG7
Windows 8.1 Enterprise N
TT4HM-HN7YT-62K67-RGRQJ-JFFXW
Windows 8 Professional
NG4HW-VH26C-733KW-K6F98-J8CK4
Windows 8 Professional N
XCVCF-2NXM9-723PB-MHCB7-2RYQQ
Windows 8 Enterprise
32JNW-9KQ84-P47T8-D8GGY-CWCK7
Windows 8 Enterprise N
JMNMF-RHW7P-DMY6X-RF3DR-X2BQT
Windows Server 2012 R2 Server
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 Core
BN3D2-R7TKB-3YPBD-8DRP2-27GG4
Windows Server 2012 Core N
8N2M2-HWPGY-7PGT9-HGDD8-GVGGY
Windows Server 2012 Core Single
Language
2WN2H-YGCQR-KFX6K-CD6TF-84YXQ
Windows Server 2012 Core Country
Specific
4K36P-JN4VD-GDC6V-KDT89-DYFKP
Windows Server 2012 Server
Standard XC9B7-NBPP2-83J2H-RHMBY-92BT4
Windows Server 2012 Standard Core
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 Server 2012 Datacenter
Core 48HP8-DN98B-MYWDG-T2DCC-8W83P
Windows 7 Professional
FJ82H-XT6CR-J8D7P-XQJJ2-GPDD4
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 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
GT63C-RJFQ3-4GMB6-BRFB9-CB83V
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 Web Server 2008 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
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
Systems 4DWFP-JF3DJ-B7DTH-78FJB-PDRHK
ProductType 1 = Desktop OS
ProductType 2 = Server OS –
Domain Controller
ProductType 3 = Server OS – Not a
Domain Controller
Windows 1.0 1.04
Windows 2.0 2.11
Windows 3.0 3
Windows NT 3.1 3.10.528
Windows for Workgroups 3.11 3.11
Windows NT Workstation 3.5 3.5.807
Windows NT Workstation 3.51 3.51.1057
Windows 95 4.0.950
Windows NT Workstation 4.0 4.0.1381
Windows 98 4.1.1998
Windows 98 Second Edition 4.1.2222
Windows Me 4.90.3000
Windows 2000 Professional 5.0.2195
Windows XP 5.1.2600
Windows Vista 6.0.6000
Windows 7 6.1.7600
Windows 95 OEM Service Release 1
(95A) 4.00.950 A *)
Windows 95 OEM Service Release 2
(95B) 4.00.1111 B *)
Windows 95 OEM Service Release
2.1 4.03.1212-1214 B *)
Windows 95 OEM Service Release
2.5 C 4.03.1214 C *)
Windows 98
4.10.1998
Windows 98 Second Edition
(SE) 4.10.2222 A
Windows Millenium Beta 4.90.2476
Windows Millenium 4.90.3000
Windows NT 3.1
3.10.528 (27.07.1993)
Windows NT 3.5
3.50.807 (21.09.1994)
Windows NT 3.51 3.51.1057 (30.05.1995)
Windows NT 4.00
4.00.1381 (24.08.1996)
Windows NT 5.00 (Beta 2) 5.00.1515
Windows 2000 (Beta 3) 5.00.2031
Windows 2000 (Beta 3 RC2) 5.00.2128
Windows 2000 (Beta 3) 5.00.2183
Windows 2000 5.00.2195 (17.02.2000)
Whistler Server Preview 2250
Whistler Server alpha 2257
Whistler Server interim
release 2267
Whistler Server interim
release 2410
Windows XP (RC 1) 5.1.2505
Windows XP
5.1.2600 (25.10.2001)
Windows XP, Service Pack 1
5.1.2600.1105-1106
Windows XP, Service Pack 2 5.1.2600.2180
Windows XP, Service Pack 3 5.1.2600
(21.04.2008)
Windows .NET Server interim 5.2.3541
Windows .NET Server Beta 3 5.2.3590
Windows .NET Server Release
Candidate 1 (RC1) 5.2.3660
Windows .NET Server 2003 RC2 5.2.3718
Windows Server 2003 (Beta?) 5.2.3763
Windows Server 2003 5.2.3790
(24.04.2003)
Windows Server 2003, Service Pack
1 5.2.3790.1180
Windows Server 2003
5.2.3790.1218
Windows Home Server 5.2.3790
(16.06.2007)
Windows Longhorn 6.0.5048
Windows Vista, Beta 1 6.0.5112
(20.07.2005)
Windows Vista, Community
Technology Preview (CTP) 6.0.5219
(30.08.2005)
Windows Vista, TAP Preview 6.0.5259
(17.11.2005)
Windows Vista, CTP
(Dezember)
6.0.5270 (14.12.2005)
Windows Vista, CTP (Februar) 6.0.5308
(17.02.2006)
Windows Vista, CTP (Refresh) 6.0.5342
(21.03.2006)
Windows Vista, April EWD 6.0.5365
(19.04.2006)
Windows Vista, Beta 2 Previw 6.0.5381 (01.05.2006)
Windows Vista, Beta 2 6.0.5384 (18.05.2006)
Windows Vista, Pre-RC1 6.0.5456 (20.06.2006)
Windows Vista, Pre-RC1, Build
5472 6.0.5472 (13.07.2006)
Windows Vista, Pre-RC1, Build
5536 6.0.5536
(21.08.2006)
Windows Vista, RC1 6.0.5600.16384 (29.08.2006)
Windows Vista, Pre-RC2 6.0.5700
(10.08.2006)
Windows Vista, Pre-RC2, Build
5728 6.0.5728
(17.09.2006)
Windows Vista, RC2 6.0.5744.16384 (03.10.2006)
Windows Vista, Pre-RTM, Build
5808 6.0.5808
(12.10.2006)
Windows Vista, Pre-RTM, Build
5824 6.0.5824
(17.10.2006)
Windows Vista, Pre-RTM, Build
5840 6.0.5840
(18.10.2006)
Windows Vista, RTM (Release to
Manufacturing) 6.0.6000.16386 (01.11.2006)
Windows Vista
6.0.6000 (08.11.2006)
Windows Vista, Service Pack 2 6.0.6002 (04.02.2008)
Windows Server 2008 6.0.6001
(27.02.2008)
Windows 7, RTM (Release to
Manufacturing)
6.1.7600.16385 (22.10.2009)
Windows 7 6.1.7601
Windows Server 2008 R2, RTM (Release
to Manufacturing) 6.1.7600.16385
(22.10.2009)
Windows Server 2008 R2, SP1 6.1.7601
Windows Home Server 2011 6.1.8400
(05.04.2011)
Windows Server 2012 6.2.9200
(04.09.2012)
Windows 8
6.2.9200 (04.09.2012)
Windows Phone 8
6.2.10211 (29.10.2012)
Windows Server 2012 R2 6.3.9200
(04.09.2012)
Windows 8.1
6.3.9200 (04.09.2012)
Windows Phone 8
6.3.10211 (29.10.2012)
The OperatingSystemSKU property
identifies the SKU of the operating system.
$OperatingSystemSKU_ReturnValue =
@{
0='Undefined'
1='Ultimate Edition'
2='Home Basic Edition'
3='Home Premium Edition'
4='Enterprise Edition'
5='Home Basic N Edition'
6='Business Edition'
7='Standard Server Edition'
8='Datacenter Server Edition'
9='Small Business Server Edition'
10='Enterprise Server Edition'
11='Starter Edition'
12='Datacenter Server Core Edition'
13='Standard Server Core Edition'
14='Enterprise Server Core Edition'
15='Enterprise Server IA64 Edition'
16='Business N Edition'
17='Web Server Edition'
18='Cluster Server Edition'
19='Home Server Edition'
20='Storage Express Server Edition'
21='Storage Standard Server Edition'
22='Storage Workgroup Server Edition'
23='Storage Enterprise Server Edition'
24='Server For Small Business Edition'
25='Small Business Server Premium Edition'
26='(unknown)'
}
The OSProductSuite property
identifies installed and licensed system product additions to the operating
system.
$SmallBusiness=1
$Enterprise=2
$BackOffice=4
$CommunicationServer=8
$TerminalServer=16
$SmallBusinessRestricted=32
$EmbeddedNT=64
$DataCenter=128
$OSProductSuite = $TerminalServer
+ $SmallBusinessRestricted
The ProductType property
indicates additional information about the system. This member can be one of
the following values:
$ProductType_ReturnValue =
@{
1='Work Station'
2='Domain Controller'
3='Server'
}
http://www.codeguru.com/cpp/misc/misc/system/article.php/c8973/Determine-Windows-Version-and-Edition.htm
#>