activator

Easily activate Windows 10. Provide your own keys and key management servers, and run as administrator.
Log | Files | Refs | README

main.go (4837B)


      1 package main
      2 
      3 import (
      4 	"fmt"
      5 	"os"
      6 	"os/exec"
      7 	"strings"
      8 
      9 	"github.com/pkg/errors"
     10 )
     11 
     12 var (
     13 	// populate with key management servers.
     14 	servers []string = []string{
     15 		"kms.srv.crsoo.com",
     16 		"cy2617.jios.org",
     17 		"kms.digiboy.ir",
     18 		"kms.cangshui.net",
     19 		"kms.library.hk",
     20 		"hq1.chinancce.com",
     21 		"kms.loli.beer",
     22 		"kms.v0v.bid",
     23 		"54.223.212.31",
     24 		"kms.jm33.me",
     25 		"nb.shenqw.win",
     26 		"kms.izetn.cn",
     27 		"kms.cin.ink",
     28 		"222.184.9.98",
     29 		"kms.ijio.net",
     30 		"fourdeltaone.net:1688",
     31 		"kms.iaini.net",
     32 		"kms.cnlic.com",
     33 		"kms.51it.wang",
     34 		"key.17108.com",
     35 		"kms.chinancce.com",
     36 		"kms.ddns.net",
     37 		"windows.kms.app",
     38 		"kms.ddz.red",
     39 		"franklv.ddns.net",
     40 		"kms.mogeko.me",
     41 		"k.zpale.com",
     42 		"amrice.top",
     43 		"m.zpale.com",
     44 		"mvg.zpale.com",
     45 		"kms.shuax.com",
     46 		"kensol263.imwork.net:1688",
     47 		"xykz.f3322.org",
     48 		"kms789.com",
     49 		"dimanyakms.sytes.net:1688",
     50 		"kms8.MSGuides.com",
     51 		"kms.03k.org:1688",
     52 		"kms.ymgblog.com",
     53 		"kms.bige0.com",
     54 		"kms9.MSGuides.com",
     55 		"kms.cz9.cn",
     56 		"kms.lolico.moe",
     57 		"kms.ddddg.cn",
     58 		"kms.zhuxiaole.org",
     59 		"kms.moeclub.org",
     60 		"kms.lotro.cc",
     61 		"zh.us.to",
     62 		"noair.strangled.net:1688",
     63 	}
     64 	// populate with keys for the windows version you want to activate.
     65 	keys map[winVer][]string = map[winVer][]string{
     66 		pro: {},
     67 	}
     68 )
     69 
     70 func main() {
     71 	print("Activate Windows 10 All Versions\n", underscore)
     72 	if err := uninstallProductKey(); err != nil {
     73 		infof("%v", errors.Wrap(err, "uninstalling existing product key"))
     74 	}
     75 	if err := clearRegistry(); err != nil {
     76 		infof("%v", errors.Wrap(err, "clearing registry"))
     77 	}
     78 	version, err := version()
     79 	if err != nil {
     80 		failedf("%v", errors.Wrap(err, "detecting windows version"))
     81 	}
     82 	infof("Activating for %v version\n", version)
     83 	keylist, ok := keys[version]
     84 	if !ok {
     85 		failedf("no configured keys for %v version", version)
     86 	}
     87 	for _, key := range keylist {
     88 		ok, err := installProductKey(key)
     89 		if err != nil {
     90 			failedf("%v", errors.Wrap(err, "installing product key"))
     91 		}
     92 		if ok {
     93 			break
     94 		}
     95 	}
     96 	var successful bool
     97 	for _, server := range servers {
     98 		if err := setKeyManagementServer(server); err != nil {
     99 			failedf("%v", errors.Wrap(err, "setting key management server"))
    100 		}
    101 		if err := activateWindows(); err == nil {
    102 			successful = true
    103 			fmt.Printf("Activated!\n")
    104 			break
    105 		}
    106 		infof("could not connect to %q: %v, trying another\n", server, err)
    107 	}
    108 	if !successful {
    109 		failedf("activation failed.\n")
    110 	}
    111 }
    112 
    113 const (
    114 	underscore = iota
    115 )
    116 
    117 func print(msg string, flag int) {
    118 	fmt.Print(msg)
    119 	if flag == underscore {
    120 		if msg[len(msg)-1] != '\n' {
    121 			fmt.Printf("\n")
    122 		}
    123 		for ii := 0; ii < len(msg)-1; ii++ {
    124 			fmt.Printf("=")
    125 		}
    126 		fmt.Printf("\n")
    127 	}
    128 }
    129 
    130 type winVer string
    131 
    132 const (
    133 	enterprise winVer = "Enterprise"
    134 	pro        winVer = "Pro"
    135 	home       winVer = "Home"
    136 	unknown    winVer = "Unknown"
    137 )
    138 
    139 func version() (winVer, error) {
    140 	out, err := exec.Command(`C:\Windows\System32\wbem\wmic.exe`, "os").CombinedOutput()
    141 	if err != nil {
    142 		return unknown, err
    143 	}
    144 	stdout := string(out)
    145 	switch {
    146 	case strings.Contains(stdout, "enterprise"):
    147 		return enterprise, nil
    148 	case strings.Contains(stdout, "10 Pro"):
    149 		return pro, nil
    150 	case strings.Contains(stdout, "home"):
    151 		return home, nil
    152 	default:
    153 		return unknown, fmt.Errorf("could not determine Windows version")
    154 	}
    155 }
    156 
    157 func uninstallProductKey() error {
    158 	out, err := slmgr("/upk")
    159 	if err != nil {
    160 		return errors.Wrap(err, "/upk")
    161 	}
    162 	if !strings.Contains(out, "successfully") {
    163 		return fmt.Errorf(out)
    164 	}
    165 	return nil
    166 }
    167 
    168 func clearRegistry() error {
    169 	out, err := slmgr("/cpky")
    170 	if err != nil {
    171 		return errors.Wrap(err, "/cpky")
    172 	}
    173 	if !strings.Contains(out, "successfully") {
    174 		return fmt.Errorf(out)
    175 	}
    176 	return nil
    177 }
    178 
    179 func installProductKey(key string) (bool, error) {
    180 	out, err := slmgr("/ipk", key)
    181 	if err != nil {
    182 		return false, errors.Wrapf(err, "/ipk %s", key)
    183 	}
    184 	if !strings.Contains(out, "successfully") {
    185 		return false, nil
    186 	}
    187 	return true, nil
    188 }
    189 
    190 func setKeyManagementServer(server string) error {
    191 	out, err := slmgr("/skms", server)
    192 	if err != nil {
    193 		return errors.Wrap(err, "/skms")
    194 	}
    195 	if !strings.Contains(out, "successfully") {
    196 		return fmt.Errorf(out)
    197 	}
    198 	return nil
    199 }
    200 
    201 func activateWindows() error {
    202 	out, err := slmgr("/ato")
    203 	if err != nil {
    204 		return errors.Wrap(err, "/ato")
    205 	}
    206 	if !strings.Contains(out, "successfully") {
    207 		return fmt.Errorf("activation failed")
    208 	}
    209 	return nil
    210 }
    211 
    212 func slmgr(args ...string) (string, error) {
    213 	cmd := []string{
    214 		"cscript",
    215 		"//nologo",
    216 		`C:\Windows\System32\slmgr.vbs`,
    217 	}
    218 	cmd = append(cmd, args...)
    219 	out, err := exec.Command(cmd[0], cmd[1:]...).CombinedOutput()
    220 	return string(out), err
    221 }
    222 
    223 func failedf(format string, v ...interface{}) {
    224 	fmt.Printf(fmt.Sprintf("[error] %s", format), v...)
    225 	os.Exit(1)
    226 }
    227 
    228 func infof(format string, v ...interface{}) {
    229 	fmt.Printf(fmt.Sprintf("[info] %v\n", format), v...)
    230 }