Occasionally we run into situations where Windows or the Office Suite fails to activate.
The solution: Use the built-in product-specific scripts to activate.
The problem: Many people in IT are not aware of these scripts, and thus how to use them, which results in a guaranteed call or email to the appropriate team.
Since I’m all about empowering people, I figured I’d put together a little script to help facilitate all this.
Enter: KMSActivate-MicrosoftProducts
I probably could have just left it as ‘Activate-MicrosoftProducts’ but I wanted to make sure potential users knew this was specifically for KMS scenarios, not MAK which has it’s own procedure.
[cmdletbinding()] Param ( [Parameter(Mandatory=$false)] [Switch]$ActivateOS = $true, [Parameter(Mandatory=$false)] [Switch]$ActivateOffice = $true ) Function Check-IfRunningWithAdministratorRights { If (!([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]“Administrator”)) { Write-Warning “ERROR: You DO NOT have Administrator rights to run this script!`nPlease re-run this script as an Administrator!”; Break } } Function Get-KMSHost { try { return (nslookup -type=srv _vlmcs._tcp | ? { $_ -like '*svr hostname*' }).Replace('svr hostname','').Replace('=','').Trim() } catch { throw $_ } } Function Get-KMSClientSetupKey { # https://technet.microsoft.com/en-us/library/jj612867(v=ws.11).aspx [cmdletbinding()] Param ( [Parameter(Mandatory=$false)] [string]$OperatingSystemCaption = (Get-CimInstance -ClassName win32_operatingsystem).caption ) Switch -Wildcard ($OperatingSystemCaption) { '*Windows Server 2016 Datacenter*' { return 'CB7KF-BWN84-R7R2Y-793K2-8XDDG' } '*Windows Server 2016 Standard*' { return 'WC2BQ-8NRM3-FDDYY-2BFGV-KHKQY' } '*Windows Server 2016 Essentials*' { return 'JCKRF-N37P4-C2D82-9YXRT-4M63B' } '*Windows 10 Enterprise*' { return 'NPPR9-FWDCX-D2C8J-H872K-2YT43' } '*Windows 7 Enterprise*' { return '33PXH-7Y6KF-2VJC9-XBBR8-HVTHH' } default { write-host "ERROR INVALID OPERATING SYSTEM CAPTION: $_"; throw } } } Function KMSActivate-OperatingSystem { [cmdletbinding()] Param ( [Parameter(Mandatory=$false)] [string]$KMSHost = $(Get-KMSHost), [Parameter(Mandatory=$false)] [string]$KMSClientSetupKey = $(Get-KMSClientSetupKey) ) Start-Process -FilePath 'cscript' -ArgumentList "/nologo `"$env:windir\System32\slmgr.vbs`" -dlv" -Wait Start-Process -FilePath 'cscript' -ArgumentList "/nologo `"$env:windir\System32\slmgr.vbs`" -skms $KMSHost" -Wait Start-Process -FilePath 'cscript' -ArgumentList "/nologo `"$env:windir\System32\slmgr.vbs`" -ipk $KMSClientSetupKey" -Wait Start-Process -FilePath 'cscript' -ArgumentList "/nologo `"$env:windir\System32\slmgr.vbs`" -ato" -Wait Start-Process -FilePath 'cscript' -ArgumentList "/nologo `"$env:windir\System32\slmgr.vbs`" -dlv" -Wait } Function KMSActivate-OfficeSuite { [cmdletbinding()] Param ( [Parameter(Mandatory=$false)] [string]$KMSHost = $(Get-KMSHost) ) #write-host "KMSHost [$KMSHost]" [System.Collections.ArrayList]$OfficeInstallationDirs = @() foreach($ProgFilePath in $env:ProgramFiles,${env:ProgramFiles(x86)}) { if(!(Test-Path -Path $ProgFilePath -PathType Container)) { continue } foreach($OfficeVersion in (gci "$ProgFilePath\Microsoft Office" -Filter Office* -ErrorAction SilentlyContinue)) { $OfficeInstallationDirs += $OfficeVersion.Fullname } } foreach($OfficeInstallationDir in $OfficeInstallationDirs) { if(!(Test-Path -Path "$OfficeInstallationDir\ospp.vbs" -PathType Leaf)) { continue } Start-Process -FilePath 'cscript' -ArgumentList "/nologo `"$OfficeInstallationDir\ospp.vbs`" /dstatusall" -Wait Start-Process -FilePath 'cscript' -ArgumentList "/nologo `"$OfficeInstallationDir\ospp.vbs`" /sethst:$KMSHost" -Wait Start-Process -FilePath 'cscript' -ArgumentList "/nologo `"$OfficeInstallationDir\ospp.vbs`" /act" -Wait Start-Process -FilePath 'cscript' -ArgumentList "/nologo `"$OfficeInstallationDir\ospp.vbs`" /dstatusall" -Wait } } Check-IfRunningWithAdministratorRights if($ActivateOS -eq $true) { KMSActivate-OperatingSystem } if($ActivateOffice -eq $true) { KMSActivate-OfficeSuite }
The script will attempt to:
- Confirm it’s running elevated otherwise it’ll quit
- Determine the KMS server (or use the one supplied)
- Determine the OS to set the correct client setup key
- Determine the version(s) of Office installed (if any)
- Activate Windows 7, 10 and a few flavors of Server 2016
- Activate any various versions of Office if present
Not saying this is the best way – just a way. I merely wanted a turn-key solution for our IT staff and this was what made sense as it solves some of the more infrequent issues that occasionally arose.
Good Providence to you!