自行搭建kms服务

发布时间 2023-09-05 17:33:47作者: 一个坏的芒果

一、使用Docker搭建KMS服务器

  • 安装docker

  Docker 教程 | 菜鸟教程 (runoob.com)

  • 拉取kms镜像文件
docker pull luodaoyi/kms-server
  • 运行镜像
docker run -itd -p 1688:1688 --name kms luodaoyi/kms-server
  • 搭建完毕

  把服务器IP内网DNS解析为kms.yourdomain.com,则kms服务地址:kms.yourdomain.com:1688

二、使用批处理写激活脚本

1. Windows激活脚本

@echo off
setlocal enabledelayedexpansion
title KMS激活工具

::::::::::::::::::::::::::::::::::run as admin::::::::::::::::::::::::::::::::::
::mode con lines=30 cols=60
::%1 mshta vbscript:createobject("shell.application").shellexecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
::cd /d "%~dp0"
::请求管理员权限
%1 %2
mshta vbscript:createobject("shell.application").shellexecute("%~s0","goto :start","","runas",1)(window.close)&goto :eof
:::::::::::::::::::::::::::::::::::color echo:::::::::::::::::::::::::::::::::::
::https://stackoverflow.com/questions/4339649/how-to-have-multiple-colors-in-a-windows-batch-file
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:color
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
  set "DEL=%%a"
)
rem Prepare a file "X" with only one dot
<nul > X set /p ".=."
:: %1 颜色,%2~5输出内容
call :colorset %1 %2 %3 %4 %5
exit /b

:colorset
set "param=^%~2 %~3 %~4 %~5" !
set "param=!param:"=\"!"
findstr /p /A:%1 "." "!param!\..\X" nul
<nul set /p ".=%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%"
echo.
exit /b
:::::::::::::::::::::::start:::::::::::::::::::::::start:::::::::::::::::::::::
:start
cls
::!!!添加你自己的kms服务地址!!!
::set kmsserver=kms.yourdomain.com
set kmsserver=kms.yourdomain.com
if not defined kmsserver goto connectfail
echo 检查能否连接到公司KMS服务器……
::万能的ping >. <
ping -n 3 %kmsserver% > nul 2>&1
if %errorlevel% neq 0 (
    echo 公司KMS服务器连接失败,检查外部KMS服务器
    set kmsserver=kms.ghpym.com
    echo 检查能否连接到外部KMS服务器……
    ::万能的ping >. <
    ping -n 3 %kmsserver% > nul 2>&1 goto connectfail
)
echo.
call :color 0a 连接到KMS服务器成功
echo.
echo 检查系统激活状态
cscript //Nologo %windir%\system32\slmgr.vbs /xpr | find "批量激活" > nul && goto activewindowsdone 
cscript //Nologo %windir%\system32\slmgr.vbs /xpr | find "批量激活" > nul || goto getosver

:connectfail
cls
echo.
echo =====================================================
call :color 04 无法连接到服务器……
call :color 04 此脚本需要结合kms服务,请勿单独使用!!!
call :color 04 请确保已经正确配置kms服务,并设置变量 kmsserver !!!
echo =====================================================
echo.
pause
goto :eof

:: 获取系统版本
:: key https://docs.microsoft.com/en-us/windows-server/get-started/kmsclientkeys
:: for /f "tokens=3 delims= " %%i in ('reg QUERY "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v "EditionID" ^| find "ProductName"') do set EditionID=%%i
:getosver
::注意,winversion=%%i %%j,%%j后面不要有空格
for /f "tokens=3*" %%i IN ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName ^| find "ProductName"') do set winversion=%%i %%j
echo %winversion% | find /I "Windows 7" && set osver=win7
echo %winversion% | find /I "Windows 8" && set osver=win8
echo %winversion% | find /I "Windows 8.1" && set osver=win8.1
echo %winversion% | find /I "Windows 10" && set osver=win10
echo %winversion% | find /I "Server 2008"  && set osver=2008
echo %winversion% | find /I "Server 2008 R2" && set osver=2008r2
echo %winversion% | find /I "Server 2012"  && set osver=2012
echo %winversion% | find /I "Server 2012 R2" && set osver=2012r2
echo %winversion% | find /I "Server 2016" && set osver=2016
echo %winversion% | find /I "Server 2019" && set osver=2019
::if DEFINED osver goto %osver%
if not defined winversion goto getosverfail
if defined osver (goto %osver%) else (goto getosverfail)

:getosverfail
cls
echo.
call :color 04 QAQ不支持的系统版本……
echo.
pause
goto :eof

:2008
if "%winversion%" == "Windows Web Server 2008" set pkey=WYR28-R7TFJ-3X2YQ-YCY4H-M249D
if "%winversion%" == "Windows Server 2008 Standard" set pkey=TM24T-X9RMF-VWXK6-X8JC9-BFGM2
if "%winversion%" == "Windows Server 2008 Standard without Hyper-V" set pkey=W7VD6-7JFBR-RX26B-YKQ3Y-6FFFJ
if "%winversion%" == "Windows Server 2008 Enterprise" set pkey=YQGMW-MPWTJ-34KDK-48M3W-X4Q6V
if "%winversion%" == "Windows Server 2008 Enterprise without Hyper-V" set pkey=39BXF-X8Q23-P2WWT-38T2F-G3FPG
if "%winversion%" == "Windows Server 2008 HPC" set pkey=RCTX3-KWVHP-BR6TB-RB6DM-6X7HP
if "%winversion%" == "Windows Server 2008 Datacenter" set pkey=7M67G-PC374-GR742-YH8V4-TCBY3
if "%winversion%" == "Windows Server 2008 Datacenter without Hyper-V" set pkey=22XQ2-VRXRG-P8D42-K34TD-G3QQC
if "%winversion%" == "Windows Server 2008 for Itanium-Based Systems" set pkey=4DWFP-JF3DJ-B7DTH-78FJB-PDRHK
goto activewindows

:2008r2
if "%winversion%" == "Windows Server 2008 R2 Web" set pkey=6TPJF-RBVHG-WBW2R-86QPH-6RTM4
if "%winversion%" == "Windows Server 2008 R2 HPC edition" set pkey=TT8MH-CG224-D3D7Q-498W2-9QCTX
if "%winversion%" == "Windows Server 2008 R2 Standard" set pkey=YC6KT-GKW9T-YTKYR-T4X34-R7VHC
if "%winversion%" == "Windows Server 2008 R2 Enterprise" set pkey=489J6-VHDMP-X63PK-3K798-CPX3Y
if "%winversion%" == "Windows Server 2008 R2 Datacenter" set pkey=74YFP-3QFB3-KQT8W-PMXWJ-7M648
if "%winversion%" == "Windows Server 2008 R2 for Itanium-based Systems" set pkey=GT63C-RJFQ3-4GMB6-BRFB9-CB83V
goto activewindows

:2012
if "%winversion%" == "Windows Server 2012" set pkey=BN3D2-R7TKB-3YPBD-8DRP2-27GG4
if "%winversion%" == "Windows Server 2012 N" set pkey=8N2M2-HWPGY-7PGT9-HGDD8-GVGGY
if "%winversion%" == "Windows Server 2012 Single Language" set pkey=2WN2H-YGCQR-KFX6K-CD6TF-84YXQ
if "%winversion%" == "Windows Server 2012 Country Specific" set pkey=4K36P-JN4VD-GDC6V-KDT89-DYFKP
if "%winversion%" == "Windows Server 2012 Server Standard" set pkey=XC9B7-NBPP2-83J2H-RHMBY-92BT4
if "%winversion%" == "Windows Server 2012 MultiPoint Standard" set pkey=HM7DN-YVMH3-46JC3-XYTG7-CYQJJ
if "%winversion%" == "Windows Server 2012 MultiPoint Premium" set pkey=XNH6W-2V9GX-RGJ4K-Y8X6F-QGJ2G
if "%winversion%" == "Windows Server 2012 Datacenter" set pkey=48HP8-DN98B-MYWDG-T2DCC-8W83P
goto activewindows

:2012r2
if "%winversion%" == "Windows Server 2012 R2 Server Standard" set pkey=D2N9P-3P6X9-2R39C-7RTCD-MDVJX
if "%winversion%" == "Windows Server 2012 R2 Datacenter" set pkey=W3GGN-FT8W3-Y4M27-J84CP-Q3VJ9
if "%winversion%" == "Windows Server 2012 R2 Essentials" set pkey=KNC87-3J2TX-XB4WP-VCPJV-M4FWM
goto activewindows

:2016
if "%winversion%" == "Windows Server 2016 Datacenter" set pkey=CB7KF-BWN84-R7R2Y-793K2-8XDDG
if "%winversion%" == "Windows Server 2016 Standard" set pkey=WC2BQ-8NRM3-FDDYY-2BFGV-KHKQY
if "%winversion%" == "Windows Server 2016 Essentials" set pkey=JCKRF-N37P4-C2D82-9YXRT-4M63B
goto activewindows

:2019
if "%winversion%" == "Windows Server 2019 Datacenter" set pkey=WMDGN-G9PQG-XVVXX-R3X43-63DFG
if "%winversion%" == "Windows Server 2019 Standard" set pkey=N69G4-B89J2-4G8F4-WWYCC-J464C
if "%winversion%" == "Windows Server 2019 Essentials" set pkey=WVDHN-86M7X-466P6-VHXV7-YY726
goto activewindows

::desktop
:win7
if "%winversion%" == "Windows 7 Professional" set pkey=FJ82H-XT6CR-J8D7P-XQJJ2-GPDD4
if "%winversion%" == "Windows 7 Professional N" set pkey=MRPKT-YTG23-K7D7T-X2JMM-QY7MG
if "%winversion%" == "Windows 7 Professional E" set pkey=W82YF-2Q76Y-63HXB-FGJG9-GF7QX
if "%winversion%" == "Windows 7 Enterprise" set pkey=33PXH-7Y6KF-2VJC9-XBBR8-HVTHH
if "%winversion%" == "Windows 7 Enterprise N" set pkey=YDRBP-3D83W-TY26F-D46B2-XCKRJ
if "%winversion%" == "Windows 7 Enterprise E" set pkey=C29WB-22CC8-VJ326-GHFJW-H9DH4
goto activewindows

:win8
if "%winversion%" == "Windows 8 Pro" set pkey=NG4HW-VH26C-733KW-K6F98-J8CK4
if "%winversion%" == "Windows 8 Pro N" set pkey=XCVCF-2NXM9-723PB-MHCB7-2RYQQ
if "%winversion%" == "Windows 8 Enterprise" set pkey=32JNW-9KQ84-P47T8-D8GGY-CWCK7
if "%winversion%" == "Windows 8 Enterprise N" set pkey=JMNMF-RHW7P-DMY6X-RF3DR-X2BQT
goto activewindows

:win8.1
if "%winversion%" == "Windows 8.1 Pro" set pkey=GCRJD-8NW9H-F2CDX-CCM8D-9D6T9
if "%winversion%" == "Windows 8.1 Pro N" set pkey=HMCNV-VVBFX-7HMBH-CTY9B-B4FXY
if "%winversion%" == "Windows 8.1 Enterprise" set pkey=MHF9N-XY6XB-WVXMC-BTDCT-MKKG7
if "%winversion%" == "Windows 8.1 Enterprise N" set pkey=TT4HM-HN7YT-62K67-RGRQJ-JFFXW
goto activewindows

:win10
if "%winversion%" == "Windows 10 Pro" set pkey=W269N-WFGWX-YVC9B-4J6C9-T83GX
if "%winversion%" == "Windows 10 Pro N" set pkey=MH37W-N47XK-V7XM9-C7227-GCQG9
if "%winversion%" == "Windows 10 Pro Workstations" set pkey=NRG8B-VKK3Q-CXVCJ-9G2XF-6Q84J
if "%winversion%" == "Windows 10 Pro Workstations N" set pkey=9FNHH-K3HBT-3W4TD-6383H-6XYWF
if "%winversion%" == "Windows 10 Pro Education" set pkey=6TP4R-GNPTD-KYYHQ-7B7DP-J447Y
if "%winversion%" == "Windows 10 Pro Education N" set pkey=YVWGF-BXNMC-HTQYQ-CPQ99-66QFC
if "%winversion%" == "Windows 10 Education" set pkey=NW6C2-QMPVW-D7KKK-3GKT6-VCFB2
if "%winversion%" == "Windows 10 Education N" set pkey=2WH4N-8QGBV-H22JP-CT43Q-MDWWJ
if "%winversion%" == "Windows 10 Enterprise" set pkey=NPPR9-FWDCX-D2C8J-H872K-2YT43
if "%winversion%" == "Windows 10 Enterprise N" set pkey=DPH2V-TTNVB-4X9Q3-TJR4H-KHJW4
if "%winversion%" == "Windows 10 Enterprise G" set pkey=YYVX9-NTFWV-6MDM3-9PT4T-4M68B
if "%winversion%" == "Windows 10 Enterprise G N" set pkey=44RPN-FTY23-9VTTB-MP9BX-T84FV
if "%winversion%" == "Windows 10 Enterprise LTSC 2019" set pkey=M7XTQ-FN8P6-TTKYV-9D4CC-J462D
if "%winversion%" == "Windows 10 Enterprise N LTSC 2019" set pkey=92NFX-8DJQP-P6BBQ-THF9C-7CG2H
if "%winversion%" == "Windows 10 Enterprise LTSB 2016" set pkey=DCPHK-NFMTC-H88MJ-PFHPY-QJ4BJ
if "%winversion%" == "Windows 10 Enterprise N LTSB 2016" set pkey=QFFDN-GRT3P-VKWWX-X7T3R-8B639
if "%winversion%" == "Windows 10 Enterprise 2015 LTSB" set pkey=WNMTR-4C88C-JK8YV-HQ7T2-76DF9
if "%winversion%" == "Windows 10 Enterprise 2015 LTSB N" set pkey=2F77B-TNFGY-69QQF-B8YKP-D69TJ
goto activewindows

:activewindows
echo.
echo 系统版本为: %winversion%
echo 对应的key:%pkey%
echo.
cscript //Nologo %windir%\system32\slmgr.vbs -ipk %pkey%
cscript //Nologo %windir%\system32\slmgr.vbs /skms %kmsserver%
cscript //Nologo %windir%\system32\slmgr.vbs /ato
cscript //Nologo %windir%\system32\slmgr.vbs /xpr | find "未激活" || find "通知模式" > nul && goto activewindowsfailed

:activewindowsdone
echo.
call :color 0a 系统激活成功
echo.
pause
goto :eof

:activewindowssuccess
echo.
call :color 0a 系统已经永久激活成功
echo.
pause
goto :eof

:activewindowsfailed
echo.
call :color 04 系统激活失败
echo.
pause
goto :eof

2. office激活脚本

@echo off
setlocal enabledelayedexpansion
title KMS激活工具

::::::::::::::::::::::::::::::::::run as admin::::::::::::::::::::::::::::::::::
::mode con lines=30 cols=60
::%1 mshta vbscript:createobject("shell.application").shellexecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
::cd /d "%~dp0"
::请求管理员权限
%1 %2
mshta vbscript:createobject("shell.application").shellexecute("%~s0","goto :start","","runas",1)(window.close)&goto :eof
:::::::::::::::::::::::::::::::::::color echo:::::::::::::::::::::::::::::::::::
::https://stackoverflow.com/questions/4339649/how-to-have-multiple-colors-in-a-windows-batch-file
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:color
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
  set "DEL=%%a"
)
rem Prepare a file "X" with only one dot
<nul > X set /p ".=."
:: %1 颜色,%2~5输出内容
call :colorset %1 %2 %3 %4 %5
exit /b

:colorset
set "param=^%~2 %~3 %~4 %~5" !
set "param=!param:"=\"!"
findstr /p /A:%1 "." "!param!\..\X" nul
<nul set /p ".=%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%"
echo.
exit /b
:::::::::::::::::::::::start:::::::::::::::::::::::start:::::::::::::::::::::::
:start
cls
::!!!添加你自己的kms服务地址!!!
::set kmsserver=kms.yourdomain.com
set kmsserver=kms.yourdomain.com
if not defined kmsserver goto connectfail
echo 检查能否连接到公司KMS服务器……
::万能的ping >. <
ping -n 3 %kmsserver% > nul 2>&1
if %errorlevel% neq 0 (
    echo 公司KMS服务器连接失败,检查外部KMS服务器
    set kmsserver=kms.ghpym.com
    echo 检查能否连接到外部KMS服务器……
    ::万能的ping >. <
    ping -n 3 %kmsserver% > nul 2>&1 goto connectfail
)
echo.
call :color 0a 连接到KMS服务器成功
echo.
goto office

:connectfail
cls
echo.
echo =====================================================
call :color 04 无法连接到服务器……
call :color 04 此脚本需要结合kms服务,请勿单独使用!!!
call :color 04 请确保已经正确配置kms服务,并设置变量 kmsserver !!!
echo =====================================================
echo.
pause
goto :eof

:office
echo 开始激活office
echo 注意:只能激活默认安装路径(C:\Program Files)的office
if exist "%ProgramFiles%\Microsoft Office\Office16\ospp.vbs" set officepath=%ProgramFiles%\Microsoft Office\Office16 & set officever=office2016 x64
if exist "%ProgramFiles(x86)%\Microsoft Office\Office16\ospp.vbs" set officepath=%ProgramFiles(x86)%\Microsoft Office\Office16 & set officever=office2016 x32
if exist "%ProgramFiles%\Microsoft Office\Office19\ospp.vbs" set officepath=%ProgramFiles%\Microsoft Office\Office19 & set officever=office2019 x64
if exist "%ProgramFiles(x86)%\Microsoft Office\Office19\ospp.vbs" set officepath=%ProgramFiles(x86)%\Microsoft Office\Office19 & set officever=office2019 x32
cd /d %officepath%
cscript //Nologo ospp.vbs /act | find /i "ERR" > nul && goto activeoffice
echo.
call :color 0a %officever%已经激活,无须再激活
echo.
cd /d "%~dp0"
pause
goto :eof

:activeoffice
echo %officever% | find /I "office2016" && goto licens16
echo %officever% | find /I "office2019" && goto licens19

:licens16
if exist "..\root\" (
  echo 转换office为 vol 版本...
  for /f %%x in ('dir /b ..\root\Licenses16\project???vl_kms*.xrm-ms') do cscript //Nologo ospp.vbs /inslic:"..\root\Licenses16\%%x" >nul
  for /f %%x in ('dir /b ..\root\Licenses16\proplusvl_kms*.xrm-ms') do cscript //Nologo ospp.vbs /inslic:"..\root\Licenses16\%%x" >nul
  for /f %%x in ('dir /b ..\root\Licenses16\standardvl_kms*.xrm-ms') do cscript //Nologo ospp.vbs /inslic:"..\root\Licenses16\%%x" >nul
  for /f %%x in ('dir /b ..\root\Licenses16\visio???vl_kms*.xrm-ms') do cscript //Nologo ospp.vbs /inslic:"..\root\Licenses16\%%x" >nul
  for /f %%x in ('dir /b ..\root\Licenses16\project???vl_mak*.xrm-ms') do cscript //Nologo ospp.vbs /inslic:"..\root\Licenses16\%%x" >nul
  for /f %%x in ('dir /b ..\root\Licenses16\proplusvl_mak*.xrm-ms') do cscript //Nologo ospp.vbs /inslic:"..\root\Licenses16\%%x" >nul
  for /f %%x in ('dir /b ..\root\Licenses16\standardvl_mak*.xrm-ms') do cscript //Nologo ospp.vbs /inslic:"..\root\Licenses16\%%x" >nul
  for /f %%x in ('dir /b ..\root\Licenses16\visio???vl_mak*.xrm-ms') do cscript //Nologo ospp.vbs /inslic:"..\root\Licenses16\%%x" >nul
)
::Visio Professional 2016
cscript //Nologo ospp.vbs /inpkey:PD3PC-RHNGV-FXJ29-8JK7D-RJRJK >nul
::office Professional 2016
cscript //Nologo ospp.vbs /inpkey:QCKNG-29MKJ-74G4B-X7DT8-JFHBB >nul
cscript //Nologo ospp.vbs /inpkey:2xd8d-6VnBw-G9CwQ-K3RT4-w8GdY >nul
cscript //Nologo ospp.vbs /inpkey:XQNVK-8JYDB-WJ9W3-YJ8YR-WFG99 >nul


:licens19
if exist "..\root\" (
  echo 转换office为 vol 版本...
  for /f %%x in ('dir /b ..\root\Licenses16\ProPlus2019VL*.xrm-ms') do cscript //Nologo ospp.vbs /inslic:"..\root\Licenses16\%%x" >nul
  for /f %%x in ('dir /b ..\root\Licenses16\ProPlus2019VL*.xrm-ms') do cscript //Nologo ospp.vbs /inslic:"..\root\Licenses16\%%x" >nul
)
cscript //Nologo ospp.vbs /inpkey:NMMKJ-6RK4F-KMJVX-8D9MJ-6MWKP >nul
cscript //Nologo ospp.vbs /inpkey:6NWWJ-YQWMR-QKGCB-6TMB3-9D9HK >nul
cscript //Nologo ospp.vbs /inpkey:9BGNQ-K37YR-RQHF2-38RQ3-7VCBB >nul

echo 激活中...
cscript //Nologo ospp.vbs /sethst:%kmsserver% > nul
cscript //Nologo ospp.vbs /act | find /i "successful" > nul || goto activeofficefail
echo.
call :color 0a %officever%激活成功
echo.
cd /d "%~dp0"
pause
goto :eof

:activeofficefail
cls
echo.
call :color 04 %officever%激活失败
echo.
cd /d "%~dp0"
pause
goto :eof

三、使用winform写exe工具激活

using Microsoft.Win32;
using System;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO;
using System.Linq;
using System.Net.NetworkInformation;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
using Timer = System.Windows.Forms.Timer;

namespace template
{
    public partial class ActiveTool : Form
    {
        //文字闪烁
        private Timer timer;
        private bool isLabelVisible;
        //文字闪烁

        //窗体移动
        private bool isDragging = false;
        private Point lastCursorPos;
        private Point lastFormPos;
        //窗体移动

        //窗体美化
        private const int CS_DropSHADOW = 0x20000;
        private const int GCL_STYLE = (-26);
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int SetClassLong(IntPtr hwnd, int nIndex, int dwNewLong);
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int GetClassLong(IntPtr hwnd, int nIndex);
        //窗体美化

        private static readonly string[] LicensePatterns =
        {
            "proplusvl_kms*.xrm-ms",
            "proplusvl_mak*.xrm-ms",
            "ProPlus2019VL_KMS*.xrm-ms",
            "ProPlus2019VL_MAK*.xrm-ms"
        };

        private static readonly string[] ProductKeys =
        {
            "NMMKJ-6RK4F-KMJVX-8D9MJ-6MWKP",
            "6NWWJ-YQWMR-QKGCB-6TMB3-9D9HK",
            "9BGNQ-K37YR-RQHF2-38RQ3-7VCBB"
        };

        private const string KmsServerAddress = "kms.yourdomain.com";
        private const int KmsServerPort = 1688;


        public ActiveTool()
        {
            InitializeComponent();

            //文字闪烁
            InitializeTimer();
            //文字闪烁

            MouseDown += Form1_MouseDown;

            GraphicsPath path = new GraphicsPath();
            path.AddArc(0, 0, 40, 40, 180, 90);
            path.AddArc(this.Width - 40, 0, 40, 40, 270, 90);
            path.AddArc(this.Width - 40, this.Height - 40, 40, 40, 0, 90);
            path.AddArc(0, this.Height - 40, 40, 40, 90, 90);
            path.CloseFigure();
            this.Region = new Region(path);

            SetClassLong(this.Handle, GCL_STYLE, GetClassLong(this.Handle, GCL_STYLE) | CS_DropSHADOW);
        }
        //文字闪烁
        private void InitializeTimer()
        {
            timer = new Timer();
            timer.Interval = 500; // 闪烁间隔,单位为毫秒
            timer.Tick += Timer_Tick;
        }
        private void Timer_Tick(object sender, EventArgs e)
        {
            isLabelVisible = !isLabelVisible;
            uiLabel1.Visible = isLabelVisible;
        }
        //文字闪烁

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            //mouseOffset = new Point(-e.X, -e.Y);
            if (e.Button == MouseButtons.Left)
            {
                isDragging = true;
                lastCursorPos = Cursor.Position;
                lastFormPos = Location;
            }
        }

        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (isDragging)
            {
                int deltaX = Cursor.Position.X - lastCursorPos.X;
                int deltaY = Cursor.Position.Y - lastCursorPos.Y;
                Location = new Point(lastFormPos.X + deltaX, lastFormPos.Y + deltaY);
            }
        }
        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                isDragging = false;
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

            // 隐藏等待效果
            pictureBox2.Invoke(new Action(() =>
            {
                pictureBox2.Visible = false;               
            }));
        }


        private void uiButton5_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }


        private void uiButton2_Click(object sender, EventArgs e)
        {
            // 创建一个新的线程
            Thread thread = new Thread(new ThreadStart(OfficeActivation));
            // 设置为后台线程,主线程结束后自动退出
            thread.IsBackground = true;
            // 启动线程
            thread.Start();

            timer.Start();
            // 显示等待效果
            pictureBox2.Visible = true;
        }


        //获取office32位或者64位的安装路径
        public static string GetOfficeInstallationPath()
        {
            string officePath = null;

            // 64位 Office 安装路径
            officePath = GetOfficeInstallationPathFromRegistry(RegistryView.Registry64);

            // 如果未找到 64位 Office 安装路径,则尝试找到 32位 Office 安装路径
            if (string.IsNullOrEmpty(officePath))
            {
                officePath = GetOfficeInstallationPathFromRegistry(RegistryView.Registry32);
            }
            return officePath;
        }

        //通过注册表获取office的安装路径
        private static string GetOfficeInstallationPathFromRegistry(RegistryView registryView)
        {
            string officePath = null;

            // 根据 Office 版本进行相应的更改
            string officeKey = @"SOFTWARE\Microsoft\Office\ClickToRun\Configuration";

            using (RegistryKey registryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, registryView))
            {
                using (RegistryKey officeRegistryKey = registryKey.OpenSubKey(officeKey))
                {
                    if (officeRegistryKey != null)
                    {
                        officePath = officeRegistryKey.GetValue("InstallationPath") as string;
                    }
                }
            }

            return officePath;
        }

        //主要激活程序
        private void OfficeActivation()
        {
            //程序执行过程的效果
            Invoke(new Action(() =>
            {
                uiLabel1.Text = "激活中,请稍等";
                uiLabel1.Font = new Font("幼圆", 14, FontStyle.Bold);
                uiButton2.Text = "正在激活...";
                uiButton2.Enabled = false;
            }));

            //检查kms连接状态

            CheckDomainConnection(KmsServerAddress);

            //获取ospp.vbs的路径
            string osppVbsPath = Path.Combine(GetOfficeInstallationPath(),"Office16","ospp.vbs");
            //如果存在ospp.vbs路径
            if (File.Exists(osppVbsPath))
            {
                //安装证书
                InstallLicenses(osppVbsPath);
                InstallProductKeys(osppVbsPath);
                SetKmsServer(osppVbsPath);
                //激活
                ActivateOffice(osppVbsPath);

            }
            else
            {
                MessageBox.Show("未找到office的安装路径", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void FinishProcess()
        {
            // 操作完成后的效果
            pictureBox2.Invoke(new Action(() =>
            {
                pictureBox2.Visible = false;
                uiLabel1.Text = "激活工具";
                uiLabel1.Font = new Font("幼圆", 18, FontStyle.Bold);
                uiButton2.Text = "office激活";
                uiButton2.Enabled = true;
                //文字闪烁
                timer.Stop();
                uiLabel1.Visible = true;
                //文字闪烁
            }));
            // 操作完成后的效果
        }

        //判断kms是否能连接
        private void CheckDomainConnection(string domain)
        {
            try
            {
                using (Ping ping = new Ping())
                {
                    PingReply reply = ping.Send(domain);
                    bool isConnected = (reply.Status == IPStatus.Success);
                    if (!isConnected)
                    {
                        MessageBox.Show("公司的kms服务器无法连接");
                        Application.Exit();
                    }

                }
            }
            catch (Exception)
            {
                MessageBox.Show("连接公司kms服务出错");
            }
        }

        private void InstallLicenses(string officePath)
        {
            //证书路径C:\Program Files\Microsoft Office\root\Licenses16
            string licensesPath = Path.Combine(GetOfficeInstallationPath(), "root", "Licenses16");

            foreach (string pattern in LicensePatterns)
            {
                string[] licenses = Directory.GetFiles(licensesPath, pattern);
                InstallLicenses(licenses);
            }
        }

        private void InstallLicenses(string[] licenses)
        {
            foreach (string license in licenses)
            {
                RunOsppCommand($"/inslic:\"{license}\"");
            }
        }

        private void InstallProductKeys(string officePath)
        {
            foreach (string productKey in ProductKeys)
            {
                RunOsppCommand($"/inpkey:{productKey}");
            }
        }

        private void SetKmsServer(string officePath)
        {
            RunOsppCommand($"/sethst:{KmsServerAddress}");
            RunOsppCommand($"/setprt:{KmsServerPort}");
        }

        private void ActivateOffice(string officePath)
        {
            string result;
            do
            {
                result = RunOsppCommand("/act");
                if (result.Contains("ERR"))
                {
                    string ErrKey = GetErrorKey(result);
                    RunOsppCommand($"/unpkey:{ErrKey}");
                }
            } while (result.Contains("ERR"));

            if (!string.IsNullOrEmpty(result) && result.Contains("successful"))
            {
                FinishProcess();
                MessageBox.Show("office激活成功", "success", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                FinishProcess();
                MessageBox.Show("激活时发生未知错误", "未知错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Application.Exit();  // 退出程序
            }
        }

        private string GetErrorKey(string result)
        {
            string[] lines = result.Split('\n');
            string errKey = "";

            for (int i = 1; i < lines.Length; i++) // 从索引1开始,无需检查第一行
            {
                if (lines[i].Contains("ERROR CODE: 0xC004F017"))
                {
                    string previousLine = lines[i - 1];
                    int startIndex = Math.Max(previousLine.Length - 5, 0); // 使用Math.Max确保startIndex不小于0
                    errKey = previousLine.Substring(startIndex);
                    break;
                }
            }

            return errKey;
        }

        private string RunOsppCommand(string arguments)
        {
            try
            {
                ProcessStartInfo startInfo = new ProcessStartInfo
                {
                    FileName = "cscript.exe",
                    Arguments = $"/nologo \"{Path.Combine(GetOfficeInstallationPath(), "Office16", "ospp.vbs")}\" {arguments}",
                    CreateNoWindow = true,
                    UseShellExecute = false,
                    RedirectStandardOutput = true
                };

                using (Process process = Process.Start(startInfo))
                {
                    process.WaitForExit();
                    if (process.ExitCode != 0)
                    {
                        throw new Exception("ospp.vbs命令执行失败");
                    }

                    string output = process.StandardOutput.ReadToEnd();
                    return output.Trim();
                }
            }
            catch (Exception ex)
            {
                FinishProcess();
                MessageBox.Show($"Error: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return string.Empty;
            }
        }

        private void uiButton1_Click(object sender, EventArgs e)
        {
            // 创建一个新的线程
            Thread thread = new Thread(new ThreadStart(MainActiveWin));
            // 设置为后台线程,主线程结束后自动退出
            thread.IsBackground = true;
            // 启动线程
            thread.Start();

            timer.Start();
            // 显示等待效果
            pictureBox2.Visible = true;
        }

        private void MainActiveWin()
        {
            //程序执行过程的效果
            Invoke(new Action(() =>
            {
                uiLabel1.Text = "激活中,请稍等";
                uiLabel1.Font = new Font("幼圆", 14, FontStyle.Bold);
                uiButton1.Text = "正在激活...";
                uiButton1.Enabled = false;
            }));

            //检查kms连接状态

            CheckDomainConnection(KmsServerAddress);

            //开始激活
            MainActivate();

            // 操作完成后的效果
            pictureBox2.Invoke(new Action(() =>
            {
                uiButton1.Enabled = true;
                pictureBox2.Visible = false;
                uiLabel1.Text = "激活工具";
                uiLabel1.Font = new Font("幼圆", 18, FontStyle.Bold);
                uiButton1.Text = "Windows激活";
                //文字闪烁
                timer.Stop();
                uiLabel1.Visible = true;
                //文字闪烁
            }));
        }

        private void MainActivate()
        {
            string result = RunCommand("cscript", $"//Nologo {Environment.SystemDirectory}\\slmgr.vbs /xpr");
            if (result.Contains("永久激活") || result.Contains("批量激活"))
            {
                FinishProcess();
                MessageBox.Show("系统已经激活,无需重新激活", "激活成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                ActivateWindows();
            }

        }

        private void ActivateWindows()
        {
            string output = RunCommand("reg", "query \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\" /v ProductName");
            string[] lines = output.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
            string productName = lines.FirstOrDefault(line => line.Contains("ProductName"));
            if (productName != null)
            {
                string winversion = productName.Split(new[] { "ProductName" }, StringSplitOptions.RemoveEmptyEntries)[1].Trim();

                if (winversion.Contains("Windows Server 2016 Datacenter"))
                {
                    string pkey = "CB7KF-BWN84-R7R2Y-793K2-8XDDG";
                    string winVersion = "Windows Server 2016 Datacenter";
                    ToActivateWindows(winVersion, pkey);

                }
                else if (winversion.Contains("Windows Server 2016 Standard"))
                {
                    string pkey = "WC2BQ-8NRM3-FDDYY-2BFGV-KHKQY";
                    string winVersion = "Windows Server 2016 Standard";
                    ToActivateWindows(winVersion, pkey);
                }
                else if (winversion.Contains("Windows Server 2016 Essentials"))
                {
                    string pkey = "JCKRF-N37P4-C2D82-9YXRT-4M63B";
                    string winVersion = "Windows Server 2016 Essentials";
                    ToActivateWindows(winVersion, pkey);
                }
                else if (winversion.Contains("Windows Server 2019 Datacenter"))
                {
                    string pkey = "WMDGN-G9PQG-XVVXX-R3X43-63DFG";
                    string winVersion = "Windows Server 2019 Datacenter";
                    ToActivateWindows(winVersion, pkey);
                }
                else if (winversion.Contains("Windows Server 2019 Standard"))
                {
                    string pkey = "N69G4-B89J2-4G8F4-WWYCC-J464C";
                    string winVersion = "Windows Server 2019 Standard";
                    ToActivateWindows(winVersion, pkey);
                }
                else if (winversion.Contains("Windows Server 2019 Essentials"))
                {
                    string pkey = "WVDHN-86M7X-466P6-VHXV7-YY726";
                    string winVersion = "Windows Server 2019 Essentials";
                    ToActivateWindows(winVersion, pkey);
                }
                else if (winversion.Contains("Windows 10 Pro"))
                {
                    string pkey = "W269N-WFGWX-YVC9B-4J6C9-T83GX";
                    string winVersion = "Windows 10 Pro";
                    ToActivateWindows(winVersion, pkey);
                }
                else if (winversion.Contains("Windows 10 Pro N"))
                {
                    string pkey = "MH37W-N47XK-V7XM9-C7227-GCQG9";
                    string winVersion = "Windows 10 Pro N";
                    ToActivateWindows(winVersion, pkey);
                }
                else if (winversion.Contains("Windows 10 Pro Workstations"))
                {
                    string pkey = "NRG8B-VKK3Q-CXVCJ-9G2XF-6Q84J";
                    string winVersion = "Windows 10 Pro Workstations";
                    ToActivateWindows(winVersion, pkey);
                }
                else if (winversion.Contains("Windows 10 Pro Workstations N"))
                {
                    string pkey = "9FNHH-K3HBT-3W4TD-6383H-6XYWF";
                    string winVersion = "Windows 10 Pro Workstations N";
                    ToActivateWindows(winVersion, pkey);
                }
                else if (winversion.Contains("Windows 10 Pro Education"))
                {
                    string pkey = "6TP4R-GNPTD-KYYHQ-7B7DP-J447Y";
                    string winVersion = "Windows 10 Pro Education";
                    ToActivateWindows(winVersion, pkey);
                }
                else if (winversion.Contains("Windows 10 Pro Education N"))
                {
                    string pkey = "YVWGF-BXNMC-HTQYQ-CPQ99-66QFC";
                    string winVersion = "Windows 10 Pro Education N";
                    ToActivateWindows(winVersion, pkey);
                }
                else if (winversion.Contains("Windows 10 Education"))
                {
                    string pkey = "NW6C2-QMPVW-D7KKK-3GKT6-VCFB2";
                    string winVersion = "Windows 10 Education";
                    ToActivateWindows(winVersion, pkey);
                }
                else if (winversion.Contains("Windows 10 Education N"))
                {
                    string pkey = "2WH4N-8QGBV-H22JP-CT43Q-MDWWJ";
                    string winVersion = "Windows 10 Education N";
                    ToActivateWindows(winVersion, pkey);
                }
                else if (winversion.Contains("Windows 10 Enterprise"))
                {
                    string pkey = "NPPR9-FWDCX-D2C8J-H872K-2YT43";
                    string winVersion = "Windows 10 Enterprise";
                    ToActivateWindows(winVersion, pkey);
                }
                else if (winversion.Contains("Windows 10 Enterprise N"))
                {
                    string pkey = "DPH2V-TTNVB-4X9Q3-TJR4H-KHJW4";
                    string winVersion = "Windows 10 Enterprise N";
                    ToActivateWindows(winVersion, pkey);
                }
                else if (winversion.Contains("Windows 10 Enterprise G"))
                {
                    string pkey = "YYVX9-NTFWV-6MDM3-9PT4T-4M68B";
                    string winVersion = "Windows 10 Enterprise G";
                    ToActivateWindows(winVersion, pkey);
                }
                else if (winversion.Contains("Windows 10 Enterprise G N"))
                {
                    string pkey = "44RPN-FTY23-9VTTB-MP9BX-T84FV";
                    string winVersion = "Windows 10 Enterprise G N";
                    ToActivateWindows(winVersion, pkey);
                }
                else
                {
                    FinishProcess();
                    MessageBox.Show("QAQ不支持的系统版本……", "不支持的系统版本", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                FinishProcess();
                MessageBox.Show("QAQ不支持的系统版本……", "不支持的系统版本", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private string RunCommand(string command, string arguments)
        {
            ProcessStartInfo startInfo = new ProcessStartInfo
            {
                FileName = command,
                Arguments = arguments,
                RedirectStandardOutput = true,
                UseShellExecute = false,
                CreateNoWindow = true
            };

            using (Process process = new Process())
            {
                process.StartInfo = startInfo;
                process.Start();
                string output = process.StandardOutput.ReadToEnd();
                process.WaitForExit();
                return output;
            }
        }
        private void ToActivateWindows(string winVersion, string productKey)
        {
            RunCommand("cscript", $"//Nologo {Environment.SystemDirectory}\\slmgr.vbs -ipk {productKey}");
            RunCommand("cscript", $"//Nologo {Environment.SystemDirectory}\\slmgr.vbs /skms {KmsServerAddress}");
            RunCommand("cscript", $"//Nologo {Environment.SystemDirectory}\\slmgr.vbs /ato");

            string result = RunCommand("cscript", $"//Nologo {Environment.SystemDirectory}\\slmgr.vbs /xpr");
            if (result.Contains("未激活") || result.Contains("处于通知模式"))
            {
                FinishProcess();
                MessageBox.Show("系统激活失败", "系统激活失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                FinishProcess();
                MessageBox.Show($"系统版本为:{winVersion}\n{productKey}\n系统已激活成功", "系统激活成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void pictureBox2_Click(object sender, EventArgs e)
        {
            MessageBox.Show("本激活工具只合适公司内使用:\nWindows支持激活的版本有\nServer 2016\nServer 2019\nWindows 10(部分版本)\noffice支持激活的版本有:\noffice2016\noffice2019", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void pictureBox1_Click_1(object sender, EventArgs e)
        {
            MessageBox.Show("本激活工具只合适公司内使用:\nWindows支持激活的版本有\nServer 2016\nServer 2019\nWindows 10(部分版本)\noffice支持激活的版本有:\noffice2016\noffice2019", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
}