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 }