使用vlmcsd作为服务端。

vlmcsd is

  • a replacement for Microsoft’s KMS server
  • It contains vlmcs, a KMS test client, mainly for debugging purposes, that also can “charge” a genuine KMS server
  • designed to run on an always-on or often-on device, e.g. router, NAS Box, …
  • intended to help people who lost activation of their legally-owned licenses, e.g. due to a change of hardware (motherboard, CPU, …)

软件地址:GitHub – Wind4/vlmcsd: KMS Emulator in C

1. 下载到本地

root@LucasFedoraV3 /lucas
0 % git clone https://github.com/Wind4/vlmcsd.git
Cloning into 'vlmcsd'...
remote: Enumerating objects: 1626, done.
remote: Counting objects: 100% (12/12), done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 1626 (delta 2), reused 12 (delta 2), pack-reused 1614
Receiving objects: 100% (1626/1626), 12.31 MiB | 737.00 KiB/s, done.
Resolving deltas: 100% (847/847), done.

2. 编译

root@LucasFedoraV3 /lucas/vlmcsd
2 master % gmake
gmake[1]: Entering directory '/lucas/vlmcsd/src'
        CC      vlmcs.o <- vlmcs.c
        CC      kmsdata-full.o <- kmsdata-full.c
        CC      crypto.o <- crypto.c
        CC      kms.o <- kms.c
        CC      endian.o <- endian.c
        CC      output.o <- output.c
        CC      shared_globals.o <- shared_globals.c
        CC      helpers.o <- helpers.c
        CC      network.o <- network.c
        CC      rpc.o <- rpc.c
        CC      crypto_internal.o <- crypto_internal.c
        CC      dns_srv.o <- dns_srv.c
kms.c: In function ‘getEpid’:
kms.c:502:9: warning: dangling pointer ‘pid’ to ‘ePid’ may be used [-Wdangling-pointer=]
  502 |         getEpidFromString(baseResponse, pid);
      |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
kms.c:473:30: note: ‘ePid’ declared here
  473 |                         char ePid[PID_BUFFER_SIZE];
      |                              ^~~~
        CC      vlmcsd.o <- vlmcsd.c
        CC      kmsdata.o <- kmsdata.c
        LD      ../bin/vlmcs <- vlmcs.o kmsdata-full.o crypto.o kms.o endian.o output.o shared_globals.o helpers.o network.o rpc.o crypto_internal.o dns_srv.o
        LD      ../bin/vlmcsd <- vlmcsd.o kmsdata.o crypto.o kms.o endian.o output.o shared_globals.o helpers.o network.o rpc.o crypto_internal.o
gmake[1]: Leaving directory '/lucas/vlmcsd/src'

3. 将编译好的文件扔到应该到的位置

root@LucasFedoraV3 /lucas/vlmcsd/etc/
0 master % cp .* /etc/
root@LucasFedoraV3 /lucas/vlmcsd/bin
0 master % cp * /usr/bin/

4. 把ini文件转为unix

root@LucasFedoraV3 /lucas/vlmcsd/bin
0 master % dos2unix /etc/vlmcsd.ini

5. 创建kms.pid文件

root@LucasFedoraV3 /
0 % touch /var/run/kms.pid

5. 配置服务文件

root@LucasFedoraV3 /etc
0 % vim /usr/lib/systemd/system/kms.service
[Unit]
Description=KMS
After=network.target
[Service]
Type=forking
PIDFile=/var/run/kms.pid
ExecStart=/usr/bin/vlmcsd -i /etc/vlmcsd.ini
ExecStop=/bin/kill -HUP $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target

6. 启动服务

root@LucasFedoraV3 /
0 % systemctl enable --now kms 

7. 使用KMS服务器激活系统 (Windows端)

slmgr /skms [KMS IP地址]
slmgr /ato