Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Windows/MAS/Separate-Files-Version/Activators/KMS38_Activation.cmd
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
1915 lines (1503 sloc)
74.8 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@set masver=2.8 | |
@echo off | |
::============================================================================ | |
:: | |
:: Homepage: mass grave[.]dev | |
:: Email: mas.help@outlook.com | |
:: | |
::============================================================================ | |
:: To activate, run the script with "/KMS38" parameter or change 0 to 1 in below line | |
set _act=0 | |
:: To remove KMS38 protection, run the script with /KMS38-RemoveProtection parameter or change 0 to 1 in below line | |
set _rem=0 | |
:: To disable changing edition if current edition doesn't support KMS38 activation, change the value to 1 from 0 or run the script with "/KMS38-NoEditionChange" parameter | |
set _NoEditionChange=0 | |
:: To run the script in debug mode, change 0 to "/KMS38" in below line | |
set "_debug=0" | |
:: If value is changed in above lines or parameter is used then script will run in unattended mode | |
::======================================================================================================================================== | |
:: Set environment variables, it helps if they are misconfigured in the system | |
setlocal EnableExtensions | |
setlocal DisableDelayedExpansion | |
set "PathExt=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC" | |
set "SysPath=%SystemRoot%\System32" | |
set "Path=%SystemRoot%\System32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SystemRoot%\System32\WindowsPowerShell\v1.0\" | |
if exist "%SystemRoot%\Sysnative\reg.exe" ( | |
set "SysPath=%SystemRoot%\Sysnative" | |
set "Path=%SystemRoot%\Sysnative;%SystemRoot%;%SystemRoot%\Sysnative\Wbem;%SystemRoot%\Sysnative\WindowsPowerShell\v1.0\;%Path%" | |
) | |
set "ComSpec=%SysPath%\cmd.exe" | |
set "PSModulePath=%ProgramFiles%\WindowsPowerShell\Modules;%SysPath%\WindowsPowerShell\v1.0\Modules" | |
set re1= | |
set re2= | |
set "_cmdf=%~f0" | |
for %%# in (%*) do ( | |
if /i "%%#"=="re1" set re1=1 | |
if /i "%%#"=="re2" set re2=1 | |
) | |
:: Re-launch the script with x64 process if it was initiated by x86 process on x64 bit Windows | |
:: or with ARM64 process if it was initiated by x86/ARM32 process on ARM64 Windows | |
if exist %SystemRoot%\Sysnative\cmd.exe if not defined re1 ( | |
setlocal EnableDelayedExpansion | |
start %SystemRoot%\Sysnative\cmd.exe /c ""!_cmdf!" %* re1" | |
exit /b | |
) | |
:: Re-launch the script with ARM32 process if it was initiated by x64 process on ARM64 Windows | |
if exist %SystemRoot%\SysArm32\cmd.exe if %PROCESSOR_ARCHITECTURE%==AMD64 if not defined re2 ( | |
setlocal EnableDelayedExpansion | |
start %SystemRoot%\SysArm32\cmd.exe /c ""!_cmdf!" %* re2" | |
exit /b | |
) | |
::======================================================================================================================================== | |
:: Debug code | |
if "%_debug%" EQU "0" ( | |
set "nul1=1>nul" | |
set "nul2=2>nul" | |
set "nul6=2^>nul" | |
set "nul=>nul 2>&1" | |
goto :_debug | |
) | |
set "nul1=" | |
set "nul2=" | |
set "nul6=" | |
set "nul=" | |
@echo on | |
@prompt $G | |
@call :_debug "%_debug%" >"%~dp0_tmp.log" 2>&1 | |
@cmd /u /c type "%~dp0_tmp.log">"%~dp0_Debug.log" | |
@del "%~dp0_tmp.log" | |
@echo off | |
@exit /b | |
:_debug | |
::======================================================================================================================================== | |
set "blank=" | |
set "mas=ht%blank%tps%blank%://mass%blank%grave.dev/" | |
:: Check if Null service is working, it's important for the batch script | |
sc query Null | find /i "RUNNING" | |
if %errorlevel% NEQ 0 ( | |
echo: | |
echo Null service is not running, script may crash... | |
echo: | |
echo: | |
echo Help - %mas%troubleshoot | |
echo: | |
echo: | |
ping 127.0.0.1 -n 20 | |
) | |
cls | |
:: Check LF line ending | |
pushd "%~dp0" | |
>nul findstr /v "$" "%~nx0" && ( | |
echo: | |
echo Error - Script either has LF line ending issue or an empty line at the end of the script is missing. | |
echo: | |
echo: | |
echo Help - %mas%troubleshoot | |
echo: | |
echo: | |
ping 127.0.0.1 -n 20 >nul | |
popd | |
exit /b | |
) | |
popd | |
::======================================================================================================================================== | |
cls | |
color 07 | |
title KMS38 Activation %masver% | |
set _args= | |
set _elev= | |
set _unattended=0 | |
set _args=%* | |
if defined _args set _args=%_args:"=% | |
if defined _args set _args=%_args:re1=% | |
if defined _args set _args=%_args:re2=% | |
if defined _args ( | |
for %%A in (%_args%) do ( | |
if /i "%%A"=="/KMS38" set _act=1 | |
if /i "%%A"=="/KMS38-RemoveProtection" set _rem=1 | |
if /i "%%A"=="/KMS38-NoEditionChange" set _NoEditionChange=1 | |
if /i "%%A"=="-el" set _elev=1 | |
) | |
) | |
for %%A in (%_act% %_rem% %_NoEditionChange%) do (if "%%A"=="1" set _unattended=1) | |
::======================================================================================================================================== | |
set _k38= | |
call :dk_setvar | |
set "specific_kms=SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform\55c92734-d682-4d71-983e-d6ec3f16059f" | |
if %winbuild% LSS 14393 ( | |
%eline% | |
echo Unsupported OS version detected [%winbuild%]. | |
echo KMS38 activation is only supported on Windows 10/11/Server, build 14393 and later. | |
echo: | |
if %winbuild% LSS 10240 ( | |
call :dk_color %Blue% "Use Online KMS activation option." | |
) else ( | |
call :dk_color %Blue% "Use HWID activation option." | |
) | |
goto dk_done | |
) | |
::======================================================================================================================================== | |
:: Fix special character limitations in path name | |
set "_work=%~dp0" | |
if "%_work:~-1%"=="\" set "_work=%_work:~0,-1%" | |
set "_batf=%~f0" | |
set "_batp=%_batf:'=''%" | |
set _PSarg="""%~f0""" -el %_args% | |
set _PSarg=%_PSarg:'=''% | |
set "_ttemp=%userprofile%\AppData\Local\Temp" | |
setlocal EnableDelayedExpansion | |
::======================================================================================================================================== | |
echo "!_batf!" | find /i "!_ttemp!" %nul1% && ( | |
if /i not "!_work!"=="!_ttemp!" ( | |
%eline% | |
echo The script was launched from the temp folder. | |
echo You are most likely running the script directly from the archive file. | |
echo: | |
echo Extract the archive file and launch the script from the extracted folder. | |
goto dk_done | |
) | |
) | |
::======================================================================================================================================== | |
:: Check PowerShell | |
REM :PowerShellTest: $ExecutionContext.SessionState.LanguageMode :PowerShellTest: | |
cmd /c "%psc% "$f=[io.file]::ReadAllText('!_batp!') -split ':PowerShellTest:\s*';iex ($f[1])"" | find /i "FullLanguage" %nul1% || ( | |
%eline% | |
cmd /c "%psc% "$ExecutionContext.SessionState.LanguageMode"" | |
echo: | |
cmd /c "%psc% "$ExecutionContext.SessionState.LanguageMode"" | find /i "FullLanguage" %nul1% && ( | |
echo Failed to run Powershell command but Powershell is working. | |
echo: | |
cmd /c "%psc% ""$av = Get-WmiObject -Namespace root\SecurityCenter2 -Class AntiVirusProduct; $n = @(); foreach ($i in $av) { if ($i.displayName -notlike '*windows*') { $n += $i.displayName } }; if ($n) { Write-Host ('Installed 3rd party Antivirus might be blocking the script - ' + ($n -join ', ')) -ForegroundColor White -BackgroundColor Blue }""" | |
echo: | |
set fixes=%fixes% %mas%troubleshoot | |
call :dk_color2 %Blue% "Help - " %_Yellow% " %mas%troubleshoot" | |
) || ( | |
echo PowerShell is not working. Aborting... | |
echo If you have applied restrictions on Powershell then undo those changes. | |
echo: | |
set fixes=%fixes% %mas%fix_powershell | |
call :dk_color2 %Blue% "Help - " %_Yellow% " %mas%fix_powershell" | |
) | |
goto dk_done | |
) | |
::======================================================================================================================================== | |
:: Elevate script as admin and pass arguments and preventing loop | |
%nul1% fltmc || ( | |
if not defined _elev %psc% "start cmd.exe -arg '/c \"!_PSarg!\"' -verb runas" && exit /b | |
%eline% | |
echo This script needs admin rights. | |
echo Right click on this script and select 'Run as administrator'. | |
goto dk_done | |
) | |
::======================================================================================================================================== | |
:: Disable QuickEdit and launch from conhost.exe to avoid Terminal app | |
if %winbuild% GEQ 17763 ( | |
set terminal=1 | |
) else ( | |
set terminal= | |
) | |
:: Check if script is running in Terminal app | |
set r1=$TB = [AppDomain]::CurrentDomain.DefineDynamicAssembly(4, 1).DefineDynamicModule(2, $False).DefineType(0); | |
set r2=%r1% [void]$TB.DefinePInvokeMethod('GetConsoleWindow', 'kernel32.dll', 22, 1, [IntPtr], @(), 1, 3).SetImplementationFlags(128); | |
set r3=%r2% [void]$TB.DefinePInvokeMethod('SendMessageW', 'user32.dll', 22, 1, [IntPtr], @([IntPtr], [UInt32], [IntPtr], [IntPtr]), 1, 3).SetImplementationFlags(128); | |
set d1=%r3% $hIcon = $TB.CreateType(); $hWnd = $hIcon::GetConsoleWindow(); | |
set d2=%d1% echo $($hIcon::SendMessageW($hWnd, 127, 0, 0) -ne [IntPtr]::Zero); | |
if defined terminal ( | |
%psc% "%d2%" %nul2% | find /i "True" %nul1% && set terminal= | |
) | |
if defined ps32onArm goto :skipQE | |
if %_unattended%==1 goto :skipQE | |
for %%# in (%_args%) do (if /i "%%#"=="-qedit" goto :skipQE) | |
if defined terminal ( | |
set "launchcmd=start conhost.exe %psc%" | |
) else ( | |
set "launchcmd=%psc%" | |
) | |
:: Disable QuickEdit in current session | |
set "d1=$t=[AppDomain]::CurrentDomain.DefineDynamicAssembly(4, 1).DefineDynamicModule(2, $False).DefineType(0);" | |
set "d2=$t.DefinePInvokeMethod('GetStdHandle', 'kernel32.dll', 22, 1, [IntPtr], @([Int32]), 1, 3).SetImplementationFlags(128);" | |
set "d3=$t.DefinePInvokeMethod('SetConsoleMode', 'kernel32.dll', 22, 1, [Boolean], @([IntPtr], [Int32]), 1, 3).SetImplementationFlags(128);" | |
set "d4=$k=$t.CreateType(); $b=$k::SetConsoleMode($k::GetStdHandle(-10), 0x0080);" | |
%launchcmd% "%d1% %d2% %d3% %d4% & cmd.exe '/c' '!_PSarg! -qedit'" && (exit /b) || (set terminal=1) | |
:skipQE | |
::======================================================================================================================================== | |
:: Check for updates | |
set -= | |
set old= | |
for /f "delims=[] tokens=2" %%# in ('ping -4 -n 1 updatecheck.mass%-%grave.dev') do ( | |
if not "%%#"=="" (echo "%%#" | find "127.69" %nul1% && (echo "%%#" | find "127.69.%masver%" %nul1% || set old=1)) | |
) | |
if defined old ( | |
echo ________________________________________________ | |
%eline% | |
echo Your version of MAS [%masver%] is outdated. | |
echo ________________________________________________ | |
echo: | |
if not %_unattended%==1 ( | |
echo [1] Get Latest MAS | |
echo [0] Continue Anyway | |
echo: | |
call :dk_color %_Green% "Choose a menu option using your keyboard [1,0] :" | |
choice /C:10 /N | |
if !errorlevel!==2 rem | |
if !errorlevel!==1 (start ht%-%tps://github.com/mass%-%gravel/Microsoft-Acti%-%vation-Scripts & start %mas% & exit /b) | |
) | |
) | |
cls | |
::======================================================================================================================================== | |
if %_rem%==1 goto :k_uninstall | |
:k_menu | |
if %_unattended%==0 ( | |
cls | |
if not defined terminal mode 76, 25 | |
title KMS38 Activation %masver% | |
echo: | |
echo: | |
echo: | |
echo: | |
echo: ______________________________________________________ | |
echo: | |
echo [1] KMS38 Activation | |
echo ____________________________________________ | |
echo: | |
echo [2] Remove KM38 Protection | |
echo: | |
echo [0] %_exitmsg% | |
echo: ______________________________________________________ | |
echo: | |
call :dk_color2 %_White% " " %_Green% "Choose a menu option using your keyboard [1,2,0]" | |
choice /C:120 /N | |
set _el=!errorlevel! | |
if !_el!==3 exit /b | |
if !_el!==2 goto :k_uninstall | |
if !_el!==1 goto :k_menu2 | |
goto :k_menu | |
) | |
::======================================================================================================================================== | |
:k_menu2 | |
cls | |
if not defined terminal ( | |
mode 110, 34 | |
if exist "%SysPath%\spp\store_test\" mode 134, 34 | |
) | |
title KMS38 Activation %masver% | |
echo: | |
echo Initializing... | |
call :dk_chkmal | |
if exist "%SystemRoot%\Servicing\Packages\Microsoft-Windows-Server*CorEdition~*.mum" if not exist "%SysPath%\clipup.exe" set a_cor=1 | |
if not exist %SysPath%\sppsvc.exe (set _fmiss=sppsvc.exe) | |
if not exist %SysPath%\ClipUp.exe if not defined a_cor (set _fmiss=%_fmiss%ClipUp.exe) | |
if defined _fmiss ( | |
%eline% | |
echo [%_fmiss%] file is missing, aborting... | |
echo: | |
set fixes=%fixes% %mas%troubleshoot | |
call :dk_color2 %Blue% "Help - " %_Yellow% " %mas%troubleshoot" | |
goto dk_done | |
) | |
::======================================================================================================================================== | |
set spp=SoftwareLicensingProduct | |
set sps=SoftwareLicensingService | |
call :dk_ckeckwmic | |
call :dk_checksku | |
call :dk_product | |
call :dk_sppissue | |
::======================================================================================================================================== | |
:: Check if system is permanently activated or not | |
call :dk_checkperm | |
if defined _perm ( | |
cls | |
echo ___________________________________________________________________________________________ | |
echo: | |
call :dk_color2 %_White% " " %Green% "%winos% is already permanently activated." | |
call :dk_color2 %_White% " " %Gray% "Activation is not required." | |
echo ___________________________________________________________________________________________ | |
if %_unattended%==1 goto dk_done | |
echo: | |
choice /C:10 /N /M "> [1] Activate Anyway [0] %_exitmsg% : " | |
if errorlevel 2 exit /b | |
) | |
cls | |
::======================================================================================================================================== | |
:: Check Evaluation version | |
set _eval= | |
set _evalserv= | |
if exist "%SystemRoot%\Servicing\Packages\Microsoft-Windows-*EvalEdition~*.mum" set _eval=1 | |
if exist "%SystemRoot%\Servicing\Packages\Microsoft-Windows-Server*EvalEdition~*.mum" set _evalserv=1 | |
if exist "%SystemRoot%\Servicing\Packages\Microsoft-Windows-Server*EvalCorEdition~*.mum" set _eval=1 & set _evalserv=1 | |
if defined _eval ( | |
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v EditionID %nul2% | find /i "Eval" %nul1% && ( | |
%eline% | |
echo [%winos% ^| %winbuild%] | |
if defined _evalserv ( | |
echo Server Evaluation cannot be activated. Convert it to full Server OS. | |
echo: | |
call :dk_color %Blue% "Go Back to main menu and use [Change Edition] option." | |
) else ( | |
echo Evaluation editions cannot be activated outside of their evaluation period. | |
echo: | |
set fixes=%fixes% %mas%evaluation_editions | |
call :dk_color2 %Blue% "Help - " %_Yellow% " %mas%evaluation_editions" | |
) | |
goto dk_done | |
) | |
) | |
::======================================================================================================================================== | |
:: Check clipup.exe for the detection and activation of server cor and acor editions | |
if defined a_cor ( | |
if not exist "!_work!\clipup.exe" ( | |
%eline% | |
echo clipup.exe doesn't exist in Server Cor/Acor [No GUI] versions. | |
echo The file is required for KMS38 activation. | |
echo Check the below page for instructions on how to activate it. | |
call :dk_color2 %Blue% "Help - " %_Yellow% " %mas%kms38" | |
goto dk_done | |
) | |
) | |
:: Check file signature | |
if defined a_cor ( | |
%psc% "if (-not (Get-AuthenticodeSignature -FilePath '!_work!\clipup.exe').IsOSBinary) {Exit 3}" %nul% | |
if !errorlevel!==3 ( | |
%eline% | |
echo Valid digital signature not found in clipup.exe file. | |
call :dk_color2 %Blue% "Help - " %_Yellow% " %mas%troubleshoot" | |
goto dk_done | |
) | |
) | |
::======================================================================================================================================== | |
set error= | |
cls | |
echo: | |
call :dk_showosinfo | |
::======================================================================================================================================== | |
echo Initiating Diagnostic Tests... | |
set "_serv=ClipSVC sppsvc KeyIso Winmgmt" | |
:: Client License Service (ClipSVC) | |
:: Software Protection | |
:: CNG Key Isolation | |
:: Windows Management Instrumentation | |
call :dk_errorcheck | |
::======================================================================================================================================== | |
:: Check if GVLK (KMS key) is already installed or not | |
call :k_channel | |
:: Detect Key | |
set key= | |
set pkey= | |
set altkey= | |
set changekey= | |
set altedition= | |
call :dk_actids 55c92734-d682-4d71-983e-d6ec3f16059f | |
if defined allapps call :kms38data key | |
if not defined key call :k_gvlk %nul% | |
if defined allapps if not defined key call :kms38fallback | |
if defined altkey (set key=%altkey%&set changekey=1) | |
set /a UBR=0 | |
if %osSKU%==191 if defined altkey if defined altedition ( | |
for /f "skip=2 tokens=2*" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v UBR %nul6%') do if not errorlevel 1 set /a UBR=%%b | |
if %winbuild% LSS 22598 if !UBR! LSS 2788 ( | |
call :dk_color %Blue% "Windows must be updated to build 19044.2788 or higher for IotEnterpriseS KMS38 activation." | |
) | |
) | |
if not defined key if defined notfoundaltactID ( | |
call :dk_color %Red% "Checking Alternate Edition for KMS38 [%altedition% Activation ID Not Found]" | |
) | |
if not defined key if not defined _gvlk ( | |
echo: | |
echo [%winos% ^| %winbuild% ^| SKU:%osSKU%] | |
if exist "%SysPath%\spp\tokens\skus\%osedition%\*GVLK*.xrm-ms" set sppks=1 | |
if defined skunotfound ( | |
call :dk_color %Red% "Required license files not found in %SysPath%\spp\tokens\skus\" | |
set fixes=%fixes% %mas%troubleshoot | |
call :dk_color2 %Blue% "Help - " %_Yellow% " %mas%troubleshoot" | |
) | |
if defined sppks ( | |
call :dk_color %Red% "KMS38 activation is supported but failed to find the key." | |
set fixes=%fixes% %mas%troubleshoot | |
call :dk_color2 %Blue% "Help - " %_Yellow% " %mas%troubleshoot" | |
) | |
if not defined skunotfound if not defined sppks ( | |
call :dk_color %Red% "This product does not support KMS38 activation." | |
call :dk_color %Blue% "Make sure you are using the latest version of the script." | |
set fixes=%fixes% %mas% | |
echo %mas% | |
) | |
echo: | |
goto dk_done | |
) | |
::======================================================================================================================================== | |
:: Install key | |
echo: | |
if defined changekey ( | |
call :dk_color %Blue% "[%altedition%] edition product key will be used to enable KMS38 activation." | |
echo: | |
) | |
if defined winsub ( | |
call :dk_color %Blue% "Windows Subscription edition [SKU ID-%slcSKU%] found. Script will activate the base edition [SKU ID-%regSKU%]." | |
echo: | |
) | |
set _partial= | |
if not defined key ( | |
if %_wmic% EQU 1 for /f "tokens=2 delims==" %%# in ('wmic path %spp% where "ApplicationID='55c92734-d682-4d71-983e-d6ec3f16059f' and PartialProductKey<>null AND LicenseDependsOn is NULL" Get PartialProductKey /value %nul6%') do set "_partial=%%#" | |
if %_wmic% EQU 0 for /f "tokens=2 delims==" %%# in ('%psc% "(([WMISEARCHER]'SELECT PartialProductKey FROM %spp% WHERE ApplicationID=''55c92734-d682-4d71-983e-d6ec3f16059f'' AND PartialProductKey IS NOT NULL AND LicenseDependsOn is NULL').Get()).PartialProductKey | %% {echo ('PartialProductKey='+$_)}" %nul6%') do set "_partial=%%#" | |
call echo Checking Installed Product Key [Partial Key - %%_partial%%] [Volume:GVLK] | |
) | |
if defined key ( | |
call :dk_inskey "[%key%]" | |
) | |
::======================================================================================================================================== | |
:: Check activation ID for setting specific KMS host | |
set app= | |
if %_wmic% EQU 1 for /f "tokens=2 delims==" %%a in ('"wmic path %spp% where (ApplicationID='55c92734-d682-4d71-983e-d6ec3f16059f' and Description like '%%KMSCLIENT%%' and PartialProductKey is not NULL AND LicenseDependsOn is NULL) get ID /VALUE" %nul6%') do call set "app=%%a" | |
if %_wmic% EQU 0 for /f "tokens=2 delims==" %%a in ('%psc% "(([WMISEARCHER]'SELECT ID FROM %spp% WHERE ApplicationID=''55c92734-d682-4d71-983e-d6ec3f16059f'' AND Description like ''%%KMSCLIENT%%'' AND PartialProductKey IS NOT NULL AND LicenseDependsOn is NULL').Get()).ID | %% {echo ('ID='+$_)}" %nul6%') do call set "app=%%a" | |
if not defined app ( | |
call :dk_color %Red% "Checking Installed GVLK Activation ID [Not Found] Aborting..." | |
set fixes=%fixes% %mas%troubleshoot | |
call :dk_color2 %Blue% "Help - " %_Yellow% " %mas%troubleshoot" | |
goto :dk_done | |
) | |
::======================================================================================================================================== | |
:: Set specific KMS host to Local Host | |
:: By doing this, global KMS IP can not replace KMS38 activation but can be used with Office and other Windows Editions | |
echo: | |
%nul% reg delete "HKLM\%specific_kms%" /f | |
%nul% reg delete "HKU\S-1-5-20\%specific_kms%" /f | |
%nul% reg query "HKLM\%specific_kms%" && ( | |
%psc% "$f=[io.file]::ReadAllText('!_batp!') -split ':regdel\:.*';iex ($f[1])" | |
%nul% reg delete "HKLM\%specific_kms%" /f | |
) | |
set k_error= | |
%nul% reg add "HKLM\%specific_kms%\%app%" /f /v KeyManagementServiceName /t REG_SZ /d "127.0.0.2" || set k_error=1 | |
%nul% reg add "HKLM\%specific_kms%\%app%" /f /v KeyManagementServicePort /t REG_SZ /d "1688" || set k_error=1 | |
if not defined k_error ( | |
echo Adding Specific KMS Host [LocalHost 127.0.0.2] [Successful] | |
) else ( | |
call :dk_color %Red% "Adding Specific KMS Host [LocalHost 127.0.0.2] [Failed]" | |
) | |
::======================================================================================================================================== | |
:: Copy clipup.exe to System32 directory to activate Server Cor/Acor editions | |
if defined a_cor ( | |
set "_clipup=%systemroot%\System32\clipup.exe" | |
pushd "!_work!\" | |
copy /y /b "ClipUp.exe" "!_clipup!" %nul% | |
popd | |
echo: | |
if exist "!_clipup!" ( | |
echo Copying clipup.exe File to [%systemroot%\System32\] [Successful] | |
) else ( | |
call :dk_color %Red% "Copying clipup.exe File to [%systemroot%\System32\] [Failed] Aborting..." | |
goto :k_final | |
) | |
) | |
::======================================================================================================================================== | |
:: Generate GenuineTicket.xml and apply | |
:: In some cases clipup -v -o method fails and in some cases service restart method fails as well | |
:: To maximize success rate and get better error details, script will install tickets two times (service restart + clipup -v -o) | |
set "tdir=%ProgramData%\Microsoft\Windows\ClipSVC\GenuineTicket" | |
if not exist "%tdir%\" md "%tdir%\" %nul% | |
if exist "%tdir%\Genuine*" del /f /q "%tdir%\Genuine*" %nul% | |
if exist "%tdir%\*.xml" del /f /q "%tdir%\*.xml" %nul% | |
if exist "%ProgramData%\Microsoft\Windows\ClipSVC\Install\Migration\*" del /f /q "%ProgramData%\Microsoft\Windows\ClipSVC\Install\Migration\*" %nul% | |
:: Signature value is as it is, it's not encoded | |
:: Session ID is in Base64 encoded format. It's decoded value is "OSMajorVersion=5;OSMinorVersion=1;OSPlatformId=2;PP=0;GVLKExp=2038-01-19T03:14:07Z;DownlevelGenuineState=1;" | |
:: Check mass grave [.] dev/kms38#manual-activation to see how it's generated | |
set "signature=C52iGEoH+1VqzI6kEAqOhUyrWuEObnivzaVjyef8WqItVYd/xGDTZZ3bkxAI9hTpobPFNJyJx6a3uriXq3HVd7mlXfSUK9ydeoUdG4eqMeLwkxeb6jQWJzLOz41rFVSMtBL0e+ycCATebTaXS4uvFYaDHDdPw2lKY8ADj3MLgsA=" | |
set "sessionId=TwBTAE0AYQBqAG8AcgBWAGUAcgBzAGkAbwBuAD0ANQA7AE8AUwBNAGkAbgBvAHIAVgBlAHIAcwBpAG8AbgA9ADEAOwBPAFMAUABsAGEAdABmAG8AcgBtAEkAZAA9ADIAOwBQAFAAPQAwADsARwBWAEwASwBFAHgAcAA9ADIAMAAzADgALQAwADEALQAxADkAVAAwADMAOgAxADQAOgAwADcAWgA7AEQAbwB3AG4AbABlAHYAZQBsAEcAZQBuAHUAaQBuAGUAUwB0AGEAdABlAD0AMQA7AAAA" | |
<nul set /p "=<?xml version="1.0" encoding="utf-8"?><genuineAuthorization xmlns="http://www.microsoft.com/DRM/SL/GenuineAuthorization/1.0"><version>1.0</version><genuineProperties origin="sppclient"><properties>OA3xOriginalProductId=;OA3xOriginalProductKey=;SessionId=%sessionId%;TimeStampClient=2022-10-11T12:00:00Z</properties><signatures><signature name="clientLockboxKey" method="rsa-sha256">%signature%</signature></signatures></genuineProperties></genuineAuthorization>" >"%tdir%\GenuineTicket" | |
copy /y /b "%tdir%\GenuineTicket" "%tdir%\GenuineTicket.xml" %nul% | |
if not exist "%tdir%\GenuineTicket.xml" ( | |
call :dk_color %Red% "Generating GenuineTicket.xml [Failed, aborting...]" | |
if exist "%tdir%\Genuine*" del /f /q "%tdir%\Genuine*" %nul% | |
goto :k_final | |
) else ( | |
echo Generating GenuineTicket.xml [Successful] | |
) | |
set "_xmlexist=if exist "%tdir%\GenuineTicket.xml"" | |
:: Stop sppsvc | |
%psc% "Start-Job { Stop-Service sppsvc -force } | Wait-Job -Timeout 20 | Out-Null" | |
sc query sppsvc | find /i "STOPPED" %nul% && ( | |
echo Stopping sppsvc Service [Successful] | |
) || ( | |
call :dk_color %Gray% "Stopping sppsvc Service [Failed]" | |
) | |
%_xmlexist% ( | |
%psc% "Start-Job { Restart-Service ClipSVC } | Wait-Job -Timeout 20 | Out-Null" | |
%_xmlexist% timeout /t 2 %nul% | |
%_xmlexist% timeout /t 2 %nul% | |
%_xmlexist% ( | |
set error=1 | |
if exist "%tdir%\*.xml" del /f /q "%tdir%\*.xml" %nul% | |
call :dk_color %Gray% "Installing GenuineTicket.xml [Failed with ClipSVC service restart, wait...]" | |
) | |
) | |
copy /y /b "%tdir%\GenuineTicket" "%tdir%\GenuineTicket.xml" %nul% | |
clipup -v -o | |
set rebuildinfo= | |
if not exist %ProgramData%\Microsoft\Windows\ClipSVC\tokens.dat ( | |
set error=1 | |
set rebuildinfo=1 | |
call :dk_color %Red% "Checking ClipSVC tokens.dat [Not Found]" | |
) | |
%_xmlexist% ( | |
set error=1 | |
set rebuildinfo=1 | |
call :dk_color %Red% "Installing GenuineTicket.xml [Failed With clipup -v -o]" | |
) | |
if exist "%ProgramData%\Microsoft\Windows\ClipSVC\Install\Migration\*.xml" ( | |
set error=1 | |
set rebuildinfo=1 | |
call :dk_color %Red% "Checking Ticket Migration [Failed]" | |
) | |
if not defined showfix if defined rebuildinfo ( | |
set showfix=1 | |
call :dk_color %Blue% "%_fixmsg%" | |
) | |
if exist "%tdir%\Genuine*" del /f /q "%tdir%\Genuine*" %nul% | |
::========================================================================================================================================== | |
call :dk_product | |
echo: | |
echo Activating... | |
echo: | |
call :k_checkexp | |
if defined _k38 ( | |
call :k_actinfo | |
goto :k_final | |
) | |
:: Clear 180 Days KMS Activation lock with Windows SKU specific rearm and without the need to restart the system | |
if %_wmic% EQU 1 wmic path %spp% where ID='%app%' call ReArmsku %nul% | |
if %_wmic% EQU 0 %psc% "$null=([WMI]'%spp%=''%app%''').ReArmsku()" %nul% | |
if %errorlevel%==0 ( | |
echo Applying SKU-ID Rearm [Successful] | |
) else ( | |
call :dk_color %Red% "Applying SKU-ID Rearm [Failed]" | |
) | |
call :dk_refresh | |
echo: | |
call :k_checkexp | |
if defined _k38 ( | |
call :k_actinfo | |
goto :k_final | |
) | |
call :dk_color %Red% "Activation Failed" | |
if not defined error call :dk_color %Blue% "%_fixmsg%" | |
set fixes=%fixes% %mas%troubleshoot | |
call :dk_color2 %Blue% "Help - " %_Yellow% " %mas%troubleshoot" | |
::======================================================================================================================================== | |
:k_final | |
:: Remove the specific KMS host (LocalHost) added by the script if activation is not completed | |
echo: | |
if not defined _k38 ( | |
%nul% reg delete "HKLM\%specific_kms%" /f | |
%nul% reg delete "HKU\S-1-5-20\%specific_kms%" /f | |
%nul% reg query "HKLM\%specific_kms%" && ( | |
call :dk_color %Red% "Removing the Added Specific KMS Host [Failed]" | |
) || ( | |
echo Removing the Added Specific KMS Host [Successful] | |
) | |
) | |
:: Protect KMS38 if opted by the user and conditions are correct | |
if defined _k38 ( | |
%psc% "$f=[io.file]::ReadAllText('!_batp!') -split ':regdel\:.*';& ([ScriptBlock]::Create($f[1])) -protect" | |
%nul% reg delete "HKLM\%specific_kms%" /f | |
%nul% reg query "HKLM\%specific_kms%" && ( | |
echo Protect KMS38 From KMS [Successful] [Locked a Registry Key] | |
) || ( | |
call :dk_color %Red% "Protect KMS38 From KMS [Failed to Lock a Registry Key]" | |
) | |
) | |
:: clipup.exe does not exist in server cor and acor editions by default, it was copied there with this script | |
if defined a_cor if exist "%_clipup%" del /f /q "%_clipup%" %nul% | |
if defined a_cor ( | |
if exist "%_clipup%" ( | |
call :dk_color %Red% "Deleting Copied clipup.exe File [Failed]" | |
) else ( | |
echo Deleting Copied clipup.exe File [Successful] | |
) | |
) | |
for %%# in (407) do if %osSKU%==%%# ( | |
call :dk_color %Red% "%winos% does not support activation on non-azure platforms." | |
) | |
:: Trigger reevaluation of SPP's Scheduled Tasks | |
if defined _k38 ( | |
call :dk_reeval %nul% | |
) | |
goto :dk_done | |
::======================================================================================================================================== | |
:k_uninstall | |
cls | |
if not defined terminal mode 99, 28 | |
title Remove KMS38 Protection %masver% | |
%nul% reg delete "HKLM\%specific_kms%" /f | |
%nul% reg delete "HKU\S-1-5-20\%specific_kms%" /f | |
%nul% reg query "HKLM\%specific_kms%" && ( | |
%psc% "$f=[io.file]::ReadAllText('!_batp!') -split ':regdel\:.*';iex ($f[1])" | |
%nul% reg delete "HKLM\%specific_kms%" /f | |
) | |
echo: | |
%nul% reg query "HKLM\%specific_kms%" && ( | |
call :dk_color %Red% "Removing Specific KMS Host [Failed]" | |
) || ( | |
echo Removing Specific KMS Host [Successful] | |
) | |
goto :dk_done | |
::======================================================================================================================================== | |
:: This code runs to protect/undo below registry key for KMS38 protection | |
:: HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform\55c92734-d682-4d71-983e-d6ec3f16059f | |
:: KMS38 protection stops 180 days KMS Activation from replacing KMS38 activation | |
:regdel: | |
param ( | |
[switch]$protect | |
) | |
$SID = New-Object System.Security.Principal.SecurityIdentifier('S-1-5-32-544') | |
$Admin = ($SID.Translate([System.Security.Principal.NTAccount])).Value | |
if($protect) { | |
$ruleArgs = @("$Admin", "Delete, SetValue", "ContainerInherit", "None", "Deny") | |
} else { | |
$ruleArgs = @("$Admin", "FullControl", "Allow") | |
} | |
$path = 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform\55c92734-d682-4d71-983e-d6ec3f16059f' | |
$key = [Microsoft.Win32.RegistryKey]::OpenBaseKey('LocalMachine', 'Registry64').OpenSubKey($path, 'ReadWriteSubTree', 'ChangePermissions') | |
$acl = $key.GetAccessControl() | |
$rule = [System.Security.AccessControl.RegistryAccessRule]::new.Invoke($ruleArgs) | |
$acl.ResetAccessRule($rule) | |
$key.SetAccessControl($acl) | |
:regdel: | |
::======================================================================================================================================== | |
:: Set variables | |
:dk_setvar | |
set psc=powershell.exe | |
set winbuild=1 | |
for /f "tokens=6 delims=[]. " %%G in ('ver') do set winbuild=%%G | |
set _NCS=1 | |
if %winbuild% LSS 10586 set _NCS=0 | |
if %winbuild% GEQ 10586 reg query "HKCU\Console" /v ForceV2 %nul2% | find /i "0x0" %nul1% && (set _NCS=0) | |
echo "%PROCESSOR_ARCHITECTURE% %PROCESSOR_ARCHITEW6432%" | find /i "ARM64" %nul1% && (if %winbuild% LSS 21277 set ps32onArm=1) | |
if %_NCS% EQU 1 ( | |
for /F %%a in ('echo prompt $E ^| cmd') do set "esc=%%a" | |
set "Red="41;97m"" | |
set "Gray="100;97m"" | |
set "Green="42;97m"" | |
set "Blue="44;97m"" | |
set "White="107;91m"" | |
set "_Red="40;91m"" | |
set "_White="40;37m"" | |
set "_Green="40;92m"" | |
set "_Yellow="40;93m"" | |
) else ( | |
set "Red="Red" "white"" | |
set "Gray="Darkgray" "white"" | |
set "Green="DarkGreen" "white"" | |
set "Blue="Blue" "white"" | |
set "White="White" "Red"" | |
set "_Red="Black" "Red"" | |
set "_White="Black" "Gray"" | |
set "_Green="Black" "Green"" | |
set "_Yellow="Black" "Yellow"" | |
) | |
set "nceline=echo: &echo ==== ERROR ==== &echo:" | |
set "eline=echo: &call :dk_color %Red% "==== ERROR ====" &echo:" | |
if %~z0 GEQ 200000 ( | |
set "_exitmsg=Go back" | |
set "_fixmsg=Go back to Main Menu, select Troubleshoot and run Fix Licensing option." | |
) else ( | |
set "_exitmsg=Exit" | |
set "_fixmsg=In MAS folder, run Troubleshoot script and select Fix Licensing option." | |
) | |
exit /b | |
:: Show OS info | |
:dk_showosinfo | |
for /f "skip=2 tokens=2*" %%a in ('reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v PROCESSOR_ARCHITECTURE') do set osarch=%%b | |
for /f "tokens=6-7 delims=[]. " %%i in ('ver') do if not "%%j"=="" ( | |
set fullbuild=%%i.%%j | |
) else ( | |
for /f "tokens=3" %%G in ('"reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v UBR" %nul6%') do if not errorlevel 1 set /a "UBR=%%G" | |
for /f "skip=2 tokens=3,4 delims=. " %%G in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v BuildLabEx') do ( | |
if defined UBR (set "fullbuild=%%G.!UBR!") else (set "fullbuild=%%G.%%H") | |
) | |
) | |
echo Checking OS Info [%winos% ^| %fullbuild% ^| %osarch%] | |
exit /b | |
:: Check SKU value | |
:dk_checksku | |
call :dk_reflection | |
set osSKU= | |
set slcSKU= | |
set wmiSKU= | |
set regSKU= | |
set winsub= | |
if %winbuild% GEQ 14393 (set info=Kernel-BrandingInfo) else (set info=Kernel-ProductInfo) | |
set d1=%ref% [void]$TypeBuilder.DefinePInvokeMethod('SLGetWindowsInformationDWORD', 'slc.dll', 'Public, Static', 1, [int], @([String], [int].MakeByRefType()), 1, 3); | |
set d1=%d1% $Sku = 0; [void]$TypeBuilder.CreateType()::SLGetWindowsInformationDWORD('%info%', [ref]$Sku); $Sku | |
for /f "delims=" %%s in ('"%psc% %d1%"') do if not errorlevel 1 (set slcSKU=%%s) | |
set slcSKU=%slcSKU: =% | |
if "%slcSKU%"=="0" set slcSKU= | |
for /f "tokens=* delims=0123456789" %%a in ("%slcSKU%") do (if not "[%%a]"=="[]" set slcSKU=) | |
for /f "tokens=3 delims=." %%a in ('reg query "HKLM\SYSTEM\CurrentControlSet\Control\ProductOptions" /v OSProductPfn %nul6%') do set "regSKU=%%a" | |
if %_wmic% EQU 1 for /f "tokens=2 delims==" %%a in ('"wmic Path Win32_OperatingSystem Get OperatingSystemSKU /format:LIST" %nul6%') do if not errorlevel 1 set "wmiSKU=%%a" | |
if %_wmic% EQU 0 for /f "tokens=1" %%a in ('%psc% "([WMI]'Win32_OperatingSystem=@').OperatingSystemSKU" %nul6%') do if not errorlevel 1 set "wmiSKU=%%a" | |
if %winbuild% GEQ 15063 %psc% "$f=[io.file]::ReadAllText('!_batp!') -split ':winsubstatus\:.*';iex ($f[1])" %nul2% | find /i "Subscription_is_activated" %nul% && ( | |
if defined regSKU if defined slcSKU if not "%regSKU%"=="%slcSKU%" ( | |
set winsub=1 | |
set osSKU=%regSKU% | |
) | |
) | |
if not defined osSKU set osSKU=%slcSKU% | |
if not defined osSKU set osSKU=%wmiSKU% | |
if not defined osSKU set osSKU=%regSKU% | |
exit /b | |
:: Get Windows Subscription status | |
:winsubstatus: | |
$DM = [AppDomain]::CurrentDomain.DefineDynamicAssembly(6, 1).DefineDynamicModule(4).DefineType(2) | |
[void]$DM.DefinePInvokeMethod('ClipGetSubscriptionStatus', 'Clipc.dll', 22, 1, [Int32], @([IntPtr].MakeByRefType()), 1, 3).SetImplementationFlags(128) | |
$m = [System.Runtime.InteropServices.Marshal] | |
$p = $m::AllocHGlobal(12) | |
$r = $DM.CreateType()::ClipGetSubscriptionStatus([ref]$p) | |
if ($r -eq 0) { | |
$enabled = $m::ReadInt32($p) | |
if ($enabled -ge 1) { | |
$state = $m::ReadInt32($p, 8) | |
if ($state -eq 1) { | |
"Subscription_is_activated." | |
} | |
} | |
} | |
:winsubstatus: | |
:: Check KMS activation status | |
:k_actinfo | |
set xpr= | |
for /f "tokens=* delims=" %%# in ('%psc% "$([DateTime]::Now.addMinutes(%gpr%)).ToString('yyyy-MM-dd HH:mm:ss')" %nul6%') do set "xpr=%%#" | |
call :dk_color %Green% "%winos% is activated till !xpr!" | |
exit /b | |
:: Check remaining KMS activation grace period | |
:k_checkexp | |
set gpr=0 | |
if %_wmic% EQU 1 for /f "tokens=2 delims==" %%# in ('"wmic path %spp% where (ApplicationID='55c92734-d682-4d71-983e-d6ec3f16059f' and Description like '%%KMSCLIENT%%' and PartialProductKey is not NULL AND LicenseDependsOn is NULL) get GracePeriodRemaining /VALUE" %nul6%') do set "gpr=%%#" | |
if %_wmic% EQU 0 for /f "tokens=2 delims==" %%# in ('%psc% "(([WMISEARCHER]'SELECT GracePeriodRemaining FROM %spp% WHERE ApplicationID=''55c92734-d682-4d71-983e-d6ec3f16059f'' AND Description like ''%%KMSCLIENT%%'' AND PartialProductKey IS NOT NULL AND LicenseDependsOn is NULL').Get()).GracePeriodRemaining | %% {echo ('GracePeriodRemaining='+$_)}" %nul6%') do set "gpr=%%#" | |
if %gpr% GTR 259200 (set _k38=1) else (set _k38=) | |
exit /b | |
:: Get Windows permanent activation status | |
:dk_checkperm | |
if %_wmic% EQU 1 wmic path %spp% where (LicenseStatus='1' and GracePeriodRemaining='0' and PartialProductKey is not NULL AND LicenseDependsOn is NULL) get Name /value %nul2% | findstr /i "Windows" %nul1% && set _perm=1||set _perm= | |
if %_wmic% EQU 0 %psc% "(([WMISEARCHER]'SELECT Name FROM %spp% WHERE LicenseStatus=1 AND GracePeriodRemaining=0 AND PartialProductKey IS NOT NULL AND LicenseDependsOn is NULL').Get()).Name | %% {echo ('Name='+$_)}" %nul2% | findstr /i "Windows" %nul1% && set _perm=1||set _perm= | |
exit /b | |
:: Refresh license status | |
:dk_refresh | |
if %_wmic% EQU 1 wmic path %sps% where __CLASS='%sps%' call RefreshLicenseStatus %nul% | |
if %_wmic% EQU 0 %psc% "$null=(([WMICLASS]'%sps%').GetInstances()).RefreshLicenseStatus()" %nul% | |
exit /b | |
:: Install Key | |
:dk_inskey | |
if %_wmic% EQU 1 wmic path %sps% where __CLASS='%sps%' call InstallProductKey ProductKey="%key%" %nul% | |
if %_wmic% EQU 0 %psc% "try { $null=(([WMISEARCHER]'SELECT Version FROM %sps%').Get()).InstallProductKey('%key%'); exit 0 } catch { exit $_.Exception.InnerException.HResult }" %nul% | |
set keyerror=%errorlevel% | |
cmd /c exit /b %keyerror% | |
if %keyerror% NEQ 0 set "keyerror=[0x%=ExitCode%]" | |
if %keyerror% EQU 0 ( | |
if %sps%==SoftwareLicensingService call :dk_refresh | |
echo Installing Generic Product Key %~1 [Successful] | |
) else ( | |
call :dk_color %Red% "Installing Generic Product Key %~1 [Failed] %keyerror%" | |
if not defined error ( | |
if defined altapplist call :dk_color %Red% "Activation ID not found for this key." | |
call :dk_color %Blue% "%_fixmsg%" | |
set showfix=1 | |
) | |
set error=1 | |
) | |
exit /b | |
:: Get Windows installed key channel | |
:k_channel | |
set _gvlk= | |
if %_wmic% EQU 1 for /f "tokens=2 delims==" %%# in ('wmic path %spp% where "ApplicationID='55c92734-d682-4d71-983e-d6ec3f16059f' and PartialProductKey IS NOT NULL AND LicenseDependsOn is NULL and Description like '%%KMSCLIENT%%'" Get Name /value %nul6%') do (echo %%# findstr /i "Windows" %nul1% && set _gvlk=1) | |
if %_wmic% EQU 0 for /f "tokens=2 delims==" %%# in ('%psc% "(([WMISEARCHER]'SELECT Name FROM %spp% WHERE ApplicationID=''55c92734-d682-4d71-983e-d6ec3f16059f'' AND PartialProductKey IS NOT NULL AND LicenseDependsOn is NULL and Description like ''%%KMSCLIENT%%''').Get()).Name | %% {echo ('Name='+$_)}" %nul6%') do (echo %%# findstr /i "Windows" %nul1% && set _gvlk=1) | |
exit /b | |
:: Get all products Activation IDs | |
:dk_actids | |
set allapps= | |
if %_wmic% EQU 1 set "chkapp=for /f "tokens=2 delims==" %%a in ('"wmic path %spp% where (ApplicationID='%1') get ID /VALUE" %nul6%')" | |
if %_wmic% EQU 0 set "chkapp=for /f "tokens=2 delims==" %%a in ('%psc% "(([WMISEARCHER]'SELECT ID FROM %spp% WHERE ApplicationID=''%1''').Get()).ID ^| %% {echo ('ID='+$_)}" %nul6%')" | |
%chkapp% do (if defined allapps (call set "allapps=!allapps! %%a") else (call set "allapps=%%a")) | |
exit /b | |
:: Get installed products Activation IDs | |
:dk_actid | |
set apps= | |
if %_wmic% EQU 1 set "chkapp=for /f "tokens=2 delims==" %%a in ('"wmic path %spp% where (ApplicationID='%1' and PartialProductKey is not null) get ID /VALUE" %nul6%')" | |
if %_wmic% EQU 0 set "chkapp=for /f "tokens=2 delims==" %%a in ('%psc% "(([WMISEARCHER]'SELECT ID FROM %spp% WHERE ApplicationID=''%1'' AND PartialProductKey IS NOT NULL').Get()).ID ^| %% {echo ('ID='+$_)}" %nul6%')" | |
%chkapp% do (if defined apps (call set "apps=!apps! %%a") else (call set "apps=%%a")) | |
exit /b | |
:: Trigger reevaluation, it helps in updating SPP tasks | |
:dk_reeval | |
:: This key is left by the system in rearm process and sppsvc sometimes fails to delete it, it causes issues in working of the Scheduled Tasks of SPP | |
set "ruleskey=HKU\S-1-5-20\Software\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform\PersistedSystemState" | |
reg delete "%ruleskey%" /v "State" /f %nul% | |
reg delete "%ruleskey%" /v "SuppressRulesEngine" /f %nul% | |
set r1=$TB = [AppDomain]::CurrentDomain.DefineDynamicAssembly(4, 1).DefineDynamicModule(2, $False).DefineType(0); | |
set r2=%r1% [void]$TB.DefinePInvokeMethod('SLpTriggerServiceWorker', 'sppc.dll', 22, 1, [Int32], @([UInt32], [IntPtr], [String], [UInt32]), 1, 3); | |
set d1=%r2% [void]$TB.CreateType()::SLpTriggerServiceWorker(0, 0, 'reeval', 0) | |
%psc% "Start-Job { Stop-Service sppsvc -force } | Wait-Job -Timeout 20 | Out-Null; %d1%" | |
exit /b | |
:: Install License files using Powershell/WMI instead of slmgr.vbs | |
:xrm: | |
function InstallLicenseFile($Lsc) { | |
try { | |
$null = $sls.InstallLicense([IO.File]::ReadAllText($Lsc)) | |
} catch { | |
$host.SetShouldExit($_.Exception.HResult) | |
} | |
} | |
function InstallLicenseArr($Str) { | |
$a = $Str -split ';' | |
ForEach ($x in $a) {InstallLicenseFile "$x"} | |
} | |
function InstallLicenseDir($Loc) { | |
dir $Loc *.xrm-ms -af -s | select -expand FullName | % {InstallLicenseFile "$_"} | |
} | |
function ReinstallLicenses() { | |
$Oem = "$env:SysPath\oem" | |
$Spp = "$env:SysPath\spp\tokens" | |
InstallLicenseDir "$Spp" | |
If (Test-Path $Oem) {InstallLicenseDir "$Oem"} | |
} | |
:xrm: | |
:: Check wmic.exe | |
:dk_ckeckwmic | |
set _wmic=0 | |
for %%# in (wmic.exe) do @if not "%%~$PATH:#"=="" ( | |
cmd /c "wmic path Win32_ComputerSystem get CreationClassName /value" %nul2% | find /i "computersystem" %nul1% && set _wmic=1 | |
) | |
exit /b | |
:: Show info for potential script stuck scenario | |
:dk_sppissue | |
sc start sppsvc %nul% | |
set spperror=%errorlevel% | |
if %spperror% NEQ 1056 if %spperror% NEQ 0 ( | |
%eline% | |
echo sc start sppsvc [Error Code: %spperror%] | |
) | |
echo: | |
%psc% "$job = Start-Job { (Get-WmiObject -Query 'SELECT * FROM %sps%').Version }; if (-not (Wait-Job $job -Timeout 30)) {write-host 'sppsvc is not working correctly. Help - %mas%troubleshoot'}" | |
exit /b | |
:: Get Product name (WMI/REG methods are not reliable in all conditions, hence winbrand.dll method is used) | |
:dk_product | |
set d1=%ref% $meth = $TypeBuilder.DefinePInvokeMethod('BrandingFormatString', 'winbrand.dll', 'Public, Static', 1, [String], @([String]), 1, 3); | |
set d1=%d1% $meth.SetImplementationFlags(128); $TypeBuilder.CreateType()::BrandingFormatString('%%WINDOWS_LONG%%') | |
set winos= | |
for /f "delims=" %%s in ('"%psc% %d1%"') do if not errorlevel 1 (set winos=%%s) | |
echo "%winos%" | find /i "Windows" %nul1% || ( | |
for /f "skip=2 tokens=2*" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName %nul6%') do set "winos=%%b" | |
if %winbuild% GEQ 22000 ( | |
set winos=!winos:Windows 10=Windows 11! | |
) | |
) | |
if not defined winsub exit /b | |
:: Check base edition product name if Windows subscription license is found | |
for %%# in (pkeyhelper.dll) do @if "%%~$PATH:#"=="" exit /b | |
set d1=%ref% [void]$TypeBuilder.DefinePInvokeMethod('GetEditionNameFromId', 'pkeyhelper.dll', 'Public, Static', 1, [int], @([int], [IntPtr].MakeByRefType()), 1, 3); | |
set d1=%d1% $out = 0; [void]$TypeBuilder.CreateType()::GetEditionNameFromId(%regSKU%, [ref]$out);$s=[Runtime.InteropServices.Marshal]::PtrToStringUni($out); $s | |
for /f %%a in ('%psc% "%d1%"') do if not errorlevel 1 ( | |
if %winbuild% GEQ 22000 ( | |
set winos=Windows 11 %%a | |
) else ( | |
set winos=Windows 10 %%a | |
) | |
) | |
exit /b | |
:: Common lines used in PowerShell reflection code | |
:dk_reflection | |
set ref=$AssemblyBuilder = [AppDomain]::CurrentDomain.DefineDynamicAssembly(4, 1); | |
set ref=%ref% $ModuleBuilder = $AssemblyBuilder.DefineDynamicModule(2, $False); | |
set ref=%ref% $TypeBuilder = $ModuleBuilder.DefineType(0); | |
exit /b | |
::======================================================================================================================================== | |
:: Get Product Key from pkeyhelper.dll for future new editions | |
:: It works on Windows 10 1803 (17134) and later builds. | |
:k_pkey | |
call :dk_reflection | |
set d1=%ref% [void]$TypeBuilder.DefinePInvokeMethod('SkuGetProductKeyForEdition', 'pkeyhelper.dll', 'Public, Static', 1, [int], @([int], [String], [String].MakeByRefType(), [String].MakeByRefType()), 1, 3); | |
set d1=%d1% $out = ''; [void]$TypeBuilder.CreateType()::SkuGetProductKeyForEdition(%1, %2, [ref]$out, [ref]$null); $out | |
set pkey= | |
for /f %%a in ('%psc% "%d1%"') do if not errorlevel 1 (set pkey=%%a) | |
exit /b | |
:: Get channel name for the key which was extracted from pkeyhelper.dll | |
:k_pkeychannel | |
set k=%1 | |
set m=[Runtime.InteropServices.Marshal] | |
set p=%SysPath%\spp\tokens\pkeyconfig\pkeyconfig.xrm-ms | |
set d1=%ref% [void]$TypeBuilder.DefinePInvokeMethod('PidGenX', 'pidgenx.dll', 'Public, Static', 1, [int], @([String], [String], [String], [int], [IntPtr], [IntPtr], [IntPtr]), 1, 3); | |
set d1=%d1% $r = [byte[]]::new(0x04F8); $r[0] = 0xF8; $r[1] = 0x04; $f = %m%::AllocHGlobal(0x04F8); %m%::Copy($r, 0, $f, 0x04F8); | |
set d1=%d1% [void]$TypeBuilder.CreateType()::PidGenX('%k%', '%p%', '00000', 0, 0, 0, $f); %m%::Copy($f, $r, 0, 0x04F8); %m%::FreeHGlobal($f); [Text.Encoding]::Unicode.GetString($r, 1016, 128) | |
set pkeychannel= | |
for /f %%a in ('%psc% "%d1%"') do if not errorlevel 1 (set pkeychannel=%%a) | |
exit /b | |
:k_gvlk | |
for %%# in (pkeyhelper.dll) do @if "%%~$PATH:#"=="" exit /b | |
for %%# in (Volume:GVLK) do ( | |
call :k_pkey %osSKU% '%%#' | |
if defined pkey call :k_pkeychannel !pkey! | |
if /i "!pkeychannel!"=="%%#" ( | |
set key=!pkey! | |
exit /b | |
) | |
) | |
exit /b | |
::======================================================================================================================================== | |
:dk_chkmal | |
:: Many users unknowingly download mal-ware by using activators found through Google search. | |
:: This code aims to notify users that their system has been affected by mal-ware. | |
set w= | |
set results= | |
if exist "%ProgramFiles%\KM%w%Spico" set pupfound= KM%w%Spico | |
if not defined pupfound ( | |
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\taskcache\tasks" /f Path /s | find /i "AutoPico" %nul% && set pupfound= KM%w%Spico | |
) | |
set hcount=0 | |
for %%# in (avira.com kaspersky.com virustotal.com mcafee.com) do ( | |
find /i "%%#" %SysPath%\drivers\etc\hosts %nul% && set /a hcount+=1) | |
if %hcount%==4 set "results=[Antivirus URLs are blocked in hosts]" | |
sc start sppsvc %nul% | |
echo "%errorlevel%" | findstr "577 225" %nul% && ( | |
set "results=%results%[Likely File Infector]" | |
) || ( | |
if not exist %SysPath%\sppsvc.exe if not exist %SysPath%\alg.exe (set "results=%results%[Likely File Infector]") | |
) | |
if not "%results%%pupfound%"=="" ( | |
if defined pupfound call :dk_color %Gray% "Checking PUP Activators [Found%pupfound%]" | |
if defined results call :dk_color %Red% "Checking Probable Mal%w%ware Infection..." | |
if defined results call :dk_color %Red% "%results%" | |
set fixes=%fixes% %mas%remove_mal%w%ware | |
call :dk_color2 %Blue% "Help - " %_Yellow% " %mas%remove_mal%w%ware" | |
echo: | |
) | |
:: Remove the scheduled task of R@1n-KMS (old version) that runs the activation command every minute, as it leads to high CPU usage. | |
if exist %SysPath%\Tasks\R@1n-KMS ( | |
for /f %%A in ('dir /b /a:-d %SysPath%\Tasks\R@1n-KMS %nul6%') do (schtasks /delete /tn \R@1n-KMS\%%A /f %nul%) | |
) | |
exit /b | |
::======================================================================================================================================== | |
:dk_errorcheck | |
set showfix= | |
call :dk_chkmal | |
:: Check Sandboxing | |
sc query Null %nul% || ( | |
set error=1 | |
set showfix=1 | |
call :dk_color %Red% "Checking Sandboxing [Found, script may not work properly.]" | |
call :dk_color %Blue% "If you are using any third-party antivirus, check if it is blocking the script." | |
echo: | |
) | |
::======================================================================================================================================== | |
:: Check corrupt services | |
set serv_cor= | |
for %%# in (%_serv%) do ( | |
set _corrupt= | |
sc start %%# %nul% | |
if !errorlevel! EQU 1060 set _corrupt=1 | |
sc query %%# %nul% || set _corrupt=1 | |
for %%G in (DependOnService Description DisplayName ErrorControl ImagePath ObjectName Start Type) do if not defined _corrupt ( | |
reg query HKLM\SYSTEM\CurrentControlSet\Services\%%# /v %%G %nul% || set _corrupt=1 | |
) | |
if defined _corrupt (if defined serv_cor (set "serv_cor=!serv_cor! %%#") else (set "serv_cor=%%#")) | |
) | |
if defined serv_cor ( | |
set error=1 | |
set showfix=1 | |
call :dk_color %Red% "Checking Corrupt Services [%serv_cor%]" | |
) | |
::======================================================================================================================================== | |
:: Check disabled services | |
set serv_ste= | |
for %%# in (%_serv%) do ( | |
sc start %%# %nul% | |
if !errorlevel! EQU 1058 (if defined serv_ste (set "serv_ste=!serv_ste! %%#") else (set "serv_ste=%%#")) | |
) | |
:: Change disabled services startup type to default | |
set serv_csts= | |
set serv_cste= | |
if defined serv_ste ( | |
for %%# in (%serv_ste%) do ( | |
if /i %%#==ClipSVC (reg add "HKLM\SYSTEM\CurrentControlSet\Services\%%#" /v "Start" /t REG_DWORD /d "3" /f %nul% & sc config %%# start= demand %nul%) | |
if /i %%#==wlidsvc sc config %%# start= demand %nul% | |
if /i %%#==sppsvc (reg add "HKLM\SYSTEM\CurrentControlSet\Services\%%#" /v "Start" /t REG_DWORD /d "2" /f %nul% & sc config %%# start= delayed-auto %nul%) | |
if /i %%#==KeyIso sc config %%# start= demand %nul% | |
if /i %%#==LicenseManager sc config %%# start= demand %nul% | |
if /i %%#==Winmgmt sc config %%# start= auto %nul% | |
if !errorlevel!==0 ( | |
if defined serv_csts (set "serv_csts=!serv_csts! %%#") else (set "serv_csts=%%#") | |
) else ( | |
if defined serv_cste (set "serv_cste=!serv_cste! %%#") else (set "serv_cste=%%#") | |
) | |
) | |
) | |
if defined serv_csts call :dk_color %Gray% "Enabling Disabled Services [Successful] [%serv_csts%]" | |
if defined serv_cste ( | |
set error=1 | |
call :dk_color %Red% "Enabling Disabled Services [Failed] [%serv_cste%]" | |
) | |
::======================================================================================================================================== | |
:: Check if the services are able to run or not | |
:: Workarounds are added to get correct status and error code because sc query doesn't output correct results in some conditions | |
set serv_e= | |
for %%# in (%_serv%) do ( | |
set errorcode= | |
set checkerror= | |
sc query %%# | find /i "RUNNING" %nul% || ( | |
%psc% "Start-Job { Start-Service %%# } | Wait-Job -Timeout 20 | Out-Null" | |
set errorcode=!errorlevel! | |
sc query %%# | find /i "RUNNING" %nul% || set checkerror=1 | |
) | |
sc start %%# %nul% | |
if !errorlevel! NEQ 1056 if !errorlevel! NEQ 0 (set errorcode=!errorlevel!&set checkerror=1) | |
if defined checkerror if defined serv_e (set "serv_e=!serv_e!, %%#-!errorcode!") else (set "serv_e=%%#-!errorcode!") | |
) | |
if defined serv_e ( | |
set error=1 | |
call :dk_color %Red% "Starting Services [Failed] [%serv_e%]" | |
echo %serv_e% | findstr /i "ClipSVC-1058 sppsvc-1058" %nul% && ( | |
call :dk_color %Blue% "Reboot your machine using the restart option to fix this error." | |
set showfix=1 | |
) | |
) | |
::======================================================================================================================================== | |
:: Various error checks | |
if defined safeboot_option ( | |
set error=1 | |
set showfix=1 | |
call :dk_color2 %Red% "Checking Boot Mode [%safeboot_option%] " %Blue% "[Safe mode found. Run in normal mode.]" | |
) | |
:: https://learn.microsoft.com/windows-hardware/manufacture/desktop/windows-setup-states | |
for /f "skip=2 tokens=2*" %%A in ('reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\State" /v ImageState') do (set imagestate=%%B) | |
if /i not "%imagestate%"=="IMAGE_STATE_COMPLETE" ( | |
set error=1 | |
set showfix=1 | |
call :dk_color %Gray% "Checking Windows Setup State [%imagestate%]" | |
echo "%imagestate%" | find /i "RESEAL" %nul% && ( | |
call :dk_color %Blue% "You need to run it in normal mode in case you are running it in Audit Mode." | |
) | |
echo "%imagestate%" | find /i "UNDEPLOYABLE" %nul% && ( | |
set fixes=%fixes% %mas%in-place_repair_upgrade | |
call :dk_color2 %Blue% "If the activation fails, do this - " %_Yellow% " %mas%in-place_repair_upgrade" | |
) | |
) | |
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinPE" /v InstRoot %nul% && ( | |
set error=1 | |
set showfix=1 | |
call :dk_color2 %Red% "Checking WinPE " %Blue% "[WinPE mode found. Run in normal mode.]" | |
) | |
set wpainfo= | |
set wpaerror= | |
for /f "delims=" %%a in ('%psc% "$f=[io.file]::ReadAllText('!_batp!') -split ':wpatest\:.*';iex ($f[1])" %nul6%') do (set wpainfo=%%a) | |
echo "%wpainfo%" | find /i "Error Found" %nul% && ( | |
set error=1 | |
set wpaerror=1 | |
call :dk_color %Red% "Checking WPA Registry Errors [%wpainfo%]" | |
) || ( | |
echo Checking WPA Registry Count [%wpainfo%] | |
) | |
if not defined officeact if exist "%SystemRoot%\Servicing\Packages\Microsoft-Windows-*EvalEdition~*.mum" ( | |
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v EditionID %nul2% | find /i "Eval" %nul1% || ( | |
set error=1 | |
call :dk_color %Red% "Checking Eval Packages [Non-Eval Licenses are installed in Eval Windows]" | |
set fixes=%fixes% %mas%evaluation_editions | |
call :dk_color2 %Blue% "Help - " %_Yellow% " %mas%evaluation_editions" | |
) | |
) | |
set osedition=0 | |
if %_wmic% EQU 1 set "chkedi=for /f "tokens=2 delims==" %%a in ('"wmic path %spp% where (ApplicationID='55c92734-d682-4d71-983e-d6ec3f16059f' AND LicenseDependsOn is NULL AND PartialProductKey IS NOT NULL) get LicenseFamily /VALUE" %nul6%')" | |
if %_wmic% EQU 0 set "chkedi=for /f "tokens=2 delims==" %%a in ('%psc% "(([WMISEARCHER]'SELECT LicenseFamily FROM %spp% WHERE ApplicationID=''55c92734-d682-4d71-983e-d6ec3f16059f'' AND LicenseDependsOn is NULL AND PartialProductKey IS NOT NULL').Get()).LicenseFamily ^| %% {echo ('LicenseFamily='+$_)}" %nul6%')" | |
%chkedi% do if not errorlevel 1 (call set "osedition=%%a") | |
if %osedition%==0 for /f "skip=2 tokens=3" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v EditionID %nul6%') do set "osedition=%%a" | |
:: Workaround for an issue in builds between 1607 and 1709 where ProfessionalEducation is shown as Professional | |
if not %osedition%==0 ( | |
if "%osSKU%"=="164" set osedition=ProfessionalEducation | |
if "%osSKU%"=="165" set osedition=ProfessionalEducationN | |
) | |
if not defined officeact ( | |
if %osedition%==0 ( | |
call :dk_color %Red% "Checking Edition Name [Not Found In Registry]" | |
) else ( | |
if not exist "%SysPath%\spp\tokens\skus\%osedition%\%osedition%*.xrm-ms" if not exist "%SysPath%\spp\tokens\skus\Security-SPP-Component-SKU-%osedition%\*-%osedition%-*.xrm-ms" ( | |
set error=1 | |
set skunotfound=1 | |
call :dk_color %Red% "Checking License Files [Not Found] [%osedition%]" | |
) | |
if not exist "%SystemRoot%\Servicing\Packages\Microsoft-Windows-*-%osedition%-*.mum" ( | |
set error=1 | |
call :dk_color %Red% "Checking Package Files [Not Found] [%osedition%]" | |
) | |
) | |
) | |
%psc% "try { $null=([WMISEARCHER]'SELECT * FROM %sps%').Get().Version; exit 0 } catch { exit $_.Exception.InnerException.HResult }" %nul% | |
set error_code=%errorlevel% | |
cmd /c exit /b %error_code% | |
if %error_code% NEQ 0 set "error_code=0x%=ExitCode%" | |
if %error_code% NEQ 0 ( | |
set error=1 | |
call :dk_color %Red% "Checking SoftwareLicensingService [Not Working] %error_code%" | |
) | |
set wmifailed= | |
if %_wmic% EQU 1 wmic path Win32_ComputerSystem get CreationClassName /value %nul2% | find /i "computersystem" %nul1% | |
if %_wmic% EQU 0 %psc% "Get-WmiObject -Class Win32_ComputerSystem | Select-Object -Property CreationClassName" %nul2% | find /i "computersystem" %nul1% | |
if %errorlevel% NEQ 0 set wmifailed=1 | |
echo "%error_code%" | findstr /i "0x800410 0x800440 0x80131501" %nul1% && set wmifailed=1& :: https://learn.microsoft.com/en-us/windows/win32/wmisdk/wmi-error-constants | |
if defined wmifailed ( | |
set error=1 | |
call :dk_color %Red% "Checking WMI [Not Working]" | |
if not defined showfix call :dk_color %Blue% "Go back to Main Menu, select Troubleshoot and run Fix WMI option." | |
set showfix=1 | |
) | |
if not defined officeact ( | |
if %winbuild% GEQ 10240 ( | |
%nul% set /a "sum=%slcSKU%+%regSKU%+%wmiSKU%" | |
set /a "sum/=3" | |
if not "!sum!"=="%slcSKU%" ( | |
call :dk_color %Gray% "Checking SLC/WMI/REG SKU [Difference Found - SLC:%slcSKU% WMI:%wmiSKU% Reg:%regSKU%]" | |
) | |
) else ( | |
%nul% set /a "sum=%slcSKU%+%wmiSKU%" | |
set /a "sum/=2" | |
if not "!sum!"=="%slcSKU%" ( | |
call :dk_color %Gray% "Checking SLC/WMI SKU [Difference Found - SLC:%slcSKU% WMI:%wmiSKU%]" | |
) | |
) | |
) | |
reg query "HKU\S-1-5-20\Software\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform\PersistedTSReArmed" %nul% && ( | |
set error=1 | |
set showfix=1 | |
call :dk_color2 %Red% "Checking Rearm " %Blue% "[System Restart Is Required]" | |
) | |
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ClipSVC\Volatile\PersistedSystemState" %nul% && ( | |
set error=1 | |
set showfix=1 | |
call :dk_color2 %Red% "Checking ClipSVC " %Blue% "[System Restart Is Required]" | |
) | |
:: This "WLMS" service was included in previous Eval editions (which were activable) to automatically shut down the system every hour after the evaluation period expired and prevent SPPSVC from stopping. | |
if exist "%SysPath%\wlms\wlms.exe" ( | |
if %winbuild% LSS 9200 ( | |
echo Checking Eval WLMS Service [Found] | |
) else ( | |
call :dk_color %Red% "Checking Eval WLMS Service [Found]" | |
) | |
) | |
reg query "HKU\S-1-5-20\Software\Microsoft\Windows NT\CurrentVersion" %nul% || ( | |
set error=1 | |
set showfix=1 | |
call :dk_color %Red% "Checking HKU\S-1-5-20 Registry [Not Found]" | |
set fixes=%fixes% %mas%in-place_repair_upgrade | |
call :dk_color2 %Blue% "In case of activation issues, do this - " %_Yellow% " %mas%in-place_repair_upgrade" | |
) | |
for %%# in (SppEx%w%tComObj.exe sppsvc.exe sppsvc.exe\PerfOptions) do ( | |
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Ima%w%ge File Execu%w%tion Options\%%#" %nul% && (if defined _sppint (set "_sppint=!_sppint!, %%#") else (set "_sppint=%%#")) | |
) | |
if defined _sppint ( | |
echo %_sppint% | find /i "PerfOptions" %nul% && ( | |
call :dk_color %Red% "Checking SPP Interference In IFEO [%_sppint% - System might deactivate later]" | |
if not defined showfix call :dk_color %Blue% "%_fixmsg%" | |
set showfix=1 | |
) || ( | |
echo Checking SPP In IFEO [%_sppint%] | |
) | |
) | |
for /f "skip=2 tokens=2*" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform" /v "SkipRearm" %nul6%') do if /i %%b NEQ 0x0 ( | |
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform" /v "SkipRearm" /t REG_DWORD /d "0" /f %nul% | |
call :dk_color %Red% "Checking SkipRearm [Default 0 Value Not Found. Changing To 0]" | |
%psc% "Start-Job { Stop-Service sppsvc -force } | Wait-Job -Timeout 20 | Out-Null" | |
set error=1 | |
) | |
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform\Plugins\Objects\msft:rm/algorithm/hwid/4.0" /f ba02fed39662 /d %nul% || ( | |
call :dk_color %Red% "Checking SPP Registry Key [Incorrect ModuleId Found]" | |
set fixes=%fixes% %mas%issues_due_to_gaming_spoofers | |
call :dk_color2 %Blue% "Most likely caused by HWID spoofers. Help - " %_Yellow% " %mas%issues_due_to_gaming_spoofers" | |
set error=1 | |
set showfix=1 | |
) | |
set tokenstore= | |
for /f "skip=2 tokens=2*" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform" /v TokenStore %nul6%') do call set "tokenstore=%%b" | |
if %winbuild% LSS 9200 set "tokenstore=%Systemdrive%\Windows\ServiceProfiles\NetworkService\AppData\Roaming\Microsoft\SoftwareProtectionPlatform" | |
if %winbuild% GEQ 9200 if /i not "%tokenstore%"=="%SysPath%\spp\store" if /i not "%tokenstore%"=="%SysPath%\spp\store\2.0" if /i not "%tokenstore%"=="%SysPath%\spp\store_test\2.0" ( | |
set toerr=1 | |
set error=1 | |
set showfix=1 | |
call :dk_color %Red% "Checking TokenStore Registry Key [Correct Path Not Found] [%tokenstore%]" | |
set fixes=%fixes% %mas%troubleshoot | |
call :dk_color2 %Blue% "Help - " %_Yellow% " %mas%troubleshoot" | |
) | |
:: This code creates token folder only if it's missing and sets default permission for it | |
if not defined toerr if not exist "%tokenstore%\" ( | |
mkdir "%tokenstore%" %nul% | |
if %winbuild% LSS 9200 set "d=$sddl = 'O:NSG:NSD:AI(A;OICIID;FA;;;SY)(A;OICIID;FA;;;BA)(A;OICIID;FA;;;NS)';" | |
if %winbuild% GEQ 9200 set "d=$sddl = 'O:BAG:BAD:PAI(A;OICI;FA;;;SY)(A;OICI;FA;;;BA)(A;OICIIO;GR;;;BU)(A;;FR;;;BU)(A;OICI;FA;;;S-1-5-80-123231216-2592883651-3715271367-3753151631-4175906628)';" | |
set "d=!d! $AclObject = New-Object System.Security.AccessControl.DirectorySecurity;" | |
set "d=!d! $AclObject.SetSecurityDescriptorSddlForm($sddl);" | |
set "d=!d! Set-Acl -Path %tokenstore% -AclObject $AclObject;" | |
%psc% "!d!" %nul% | |
if exist "%tokenstore%\" ( | |
call :dk_color %Gray% "Checking SPP Token Folder [Not Found, Created Now] [%tokenstore%\]" | |
) else ( | |
call :dk_color %Red% "Checking SPP Token Folder [Not Found, Failed to Create] [%tokenstore%\]" | |
set error=1 | |
set showfix=1 | |
) | |
) | |
call :dk_actid 55c92734-d682-4d71-983e-d6ec3f16059f | |
if not defined apps ( | |
%psc% "Start-Job { Stop-Service sppsvc -force } | Wait-Job -Timeout 20 | Out-Null; $sls = Get-WmiObject SoftwareLicensingService; $f=[io.file]::ReadAllText('!_batp!') -split ':xrm\:.*';iex ($f[1]); ReinstallLicenses" %nul% | |
call :dk_actid 55c92734-d682-4d71-983e-d6ec3f16059f | |
if not defined apps ( | |
set "_notfoundids=Key Not Installed / Act ID Not Found" | |
call :dk_actids 55c92734-d682-4d71-983e-d6ec3f16059f | |
if not defined allapps ( | |
set "_notfoundids=Not found" | |
) | |
set error=1 | |
call :dk_color %Red% "Checking Activation IDs [!_notfoundids!]" | |
) | |
) | |
if exist "%tokenstore%\" if not exist "%tokenstore%\tokens.dat" ( | |
set error=1 | |
call :dk_color %Red% "Checking SPP tokens.dat [Not Found] [%tokenstore%\]" | |
) | |
if %winbuild% GEQ 9200 if not exist "%SystemRoot%\Servicing\Packages\Microsoft-Windows-*EvalEdition~*.mum" ( | |
for /f "delims=" %%a in ('%psc% "(Get-ScheduledTask -TaskName 'SvcRestartTask' -TaskPath '\Microsoft\Windows\SoftwareProtectionPlatform\').State" %nul6%') do (set taskinfo=%%a) | |
echo !taskinfo! | find /i "Ready" %nul% || ( | |
reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform" /v "actionlist" /f %nul% | |
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\Microsoft\Windows\SoftwareProtectionPlatform\SvcRestartTask" %nul% || set taskinfo=Removed | |
if "!taskinfo!"=="" set "taskinfo=Not Found" | |
call :dk_color %Red% "Checking SvcRestartTask Status [!taskinfo!, System might deactivate later]" | |
) | |
) | |
:: This code checks if SPP has permission access to tokens folder and required registry keys. It's often caused by gaming spoofers. | |
set permerror= | |
if %winbuild% GEQ 9200 if not defined ps32onArm ( | |
for %%# in ( | |
"%tokenstore%+FullControl" | |
"HKLM:\SYSTEM\WPA+QueryValues, EnumerateSubKeys, WriteKey" | |
"HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform+SetValue" | |
) do for /f "tokens=1,2 delims=+" %%A in (%%#) do if not defined permerror ( | |
%psc% "$acl = (Get-Acl '%%A' | fl | Out-String); if (-not ($acl -match 'NT SERVICE\\sppsvc Allow %%B') -or ($acl -match 'NT SERVICE\\sppsvc Deny')) {Exit 2}" %nul% | |
if !errorlevel!==2 ( | |
if "%%A"=="%tokenstore%" ( | |
set "permerror=Error Found In Token Folder" | |
) else ( | |
set "permerror=Error Found In SPP Registries" | |
) | |
) | |
) | |
REM https://learn.microsoft.com/office/troubleshoot/activation/license-issue-when-start-office-application | |
if not defined permerror ( | |
reg query "HKU\S-1-5-20\Software\Microsoft\Windows NT\CurrentVersion" %nul% && ( | |
set "pol=HKU\S-1-5-20\Software\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform\Policies" | |
reg query "!pol!" %nul% || reg add "!pol!" %nul% | |
%psc% "$netServ = (New-Object Security.Principal.SecurityIdentifier('S-1-5-20')).Translate([Security.Principal.NTAccount]).Value; $aclString = Get-Acl 'Registry::!pol!' | Format-List | Out-String; if (-not ($aclString.Contains($netServ + ' Allow FullControl') -or $aclString.Contains('NT SERVICE\sppsvc Allow FullControl')) -or ($aclString.Contains('Deny'))) {Exit 3}" %nul% | |
if !errorlevel!==3 set "permerror=Error Found In S-1-5-20 SPP" | |
) | |
) | |
if defined permerror ( | |
set error=1 | |
call :dk_color %Red% "Checking SPP Permissions [!permerror!]" | |
if not defined showfix call :dk_color %Blue% "%_fixmsg%" | |
set showfix=1 | |
) | |
) | |
:: If required services are not disabled or corrupted + if there is any error + SoftwareLicensingService errorlevel is not Zero + no fix was shown before | |
if not defined serv_cor if not defined serv_cste if defined error if /i not %error_code%==0 if not defined showfix ( | |
if not defined permerror if defined wpaerror (call :dk_color %Blue% "Go back to Main Menu, select Troubleshoot and run Fix WPA Registry option." & set showfix=1) | |
if not defined showfix ( | |
set showfix=1 | |
call :dk_color %Blue% "%_fixmsg%" | |
if not defined permerror call :dk_color %Blue% "If activation still fails then run Fix WPA Registry option." | |
) | |
) | |
if not defined showfix if defined wpaerror ( | |
set showfix=1 | |
call :dk_color %Blue% "If activation fails then go back to Main Menu, select Troubleshoot and run Fix WPA Registry option." | |
) | |
exit /b | |
:: This code checks for invalid registry keys in HKLM\SYSTEM\WPA. This issue may appear even on healthy systems | |
:wpatest: | |
$wpaKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $env:COMPUTERNAME).OpenSubKey("SYSTEM\\WPA") | |
$count = 0 | |
foreach ($subkeyName in $wpaKey.GetSubKeyNames()) { | |
if ($subkeyName -match '.*-.*-.*-.*-.*-') { | |
$count++ | |
} | |
} | |
$osVersion = [System.Environment]::OSVersion.Version | |
$minBuildNumber = 14393 | |
if ($osVersion.Build -ge $minBuildNumber) { | |
$subkeyHashTable = @{} | |
foreach ($subkeyName in $wpaKey.GetSubKeyNames()) { | |
if ($subkeyName -match '.*-.*-.*-.*-.*-') { | |
$keyNumber = $subkeyName -replace '.*-', '' | |
$subkeyHashTable[$keyNumber] = $true | |
} | |
} | |
for ($i=1; $i -le $count; $i++) { | |
if (-not $subkeyHashTable.ContainsKey("$i")) { | |
Write-Output "Total Keys $count. Error Found - $i key does not exist." | |
$wpaKey.Close() | |
exit | |
} | |
} | |
} | |
$wpaKey.GetSubKeyNames() | ForEach-Object { | |
if ($_ -match '.*-.*-.*-.*-.*-') { | |
if ($PSVersionTable.PSVersion.Major -lt 3) { | |
cmd /c "reg query "HKLM\SYSTEM\WPA\$_" /ve /t REG_BINARY >nul 2>&1" | |
if ($LASTEXITCODE -ne 0) { | |
Write-Host "Total Keys $count. Error Found - Binary Data is corrupt." | |
$wpaKey.Close() | |
exit | |
} | |
} else { | |
$subkey = $wpaKey.OpenSubKey($_) | |
$p = $subkey.GetValueNames() | |
if (($p | Where-Object { $subkey.GetValueKind($_) -eq [Microsoft.Win32.RegistryValueKind]::Binary }).Count -eq 0) { | |
Write-Host "Total Keys $count. Error Found - Binary Data is corrupt." | |
$wpaKey.Close() | |
exit | |
} | |
} | |
} | |
} | |
$count | |
$wpaKey.Close() | |
:wpatest: | |
::======================================================================================================================================== | |
:dk_color | |
if %_NCS% EQU 1 ( | |
echo %esc%[%~1%~2%esc%[0m | |
) else ( | |
%psc% write-host -back '%1' -fore '%2' '%3' | |
) | |
exit /b | |
:dk_color2 | |
if %_NCS% EQU 1 ( | |
echo %esc%[%~1%~2%esc%[%~3%~4%esc%[0m | |
) else ( | |
%psc% write-host -back '%1' -fore '%2' '%3' -NoNewline; write-host -back '%4' -fore '%5' '%6' | |
) | |
exit /b | |
::======================================================================================================================================== | |
:dk_done | |
echo: | |
if %_unattended%==1 timeout /t 2 & exit /b | |
if defined fixes ( | |
call :dk_color %White% "Follow ALL the ABOVE blue lines. " | |
call :dk_color2 %Blue% "Press [1] to Open Support Webpage " %Gray% " Press [0] to Ignore" | |
choice /C:10 /N | |
if !errorlevel!==1 (for %%# in (%fixes%) do (start %%#)) | |
) | |
if defined terminal ( | |
call :dk_color %_Yellow% "Press [0] key to %_exitmsg%..." | |
choice /c 0 /n | |
) else ( | |
call :dk_color %_Yellow% "Press any key to %_exitmsg%..." | |
pause %nul1% | |
) | |
exit /b | |
::======================================================================================================================================== | |
:: 1st column = Activation ID | |
:: 2nd column = GVLK (Generic volume licensing key) | |
:: 3rd column = SKU ID | |
:: 4th column = WMI Edition ID (For reference only) | |
:: 5th column = Build Branch name incase same Edition ID is used in different OS versions with different key (For reference only) | |
:: Separator = "_" | |
:kms38data | |
set f= | |
for %%# in ( | |
:: Windows 10/11 | |
73111121-5638-40f6-bc11-f1d7b0d64300_NPPR9-FWDCX-D2C8J-H872K-2Y%f%T43___4_Enterprise | |
e272e3e2-732f-4c65-a8f0-484747d0d947_DPH2V-TTNVB-4X9Q3-TJR4H-KH%f%JW4__27_EnterpriseN | |
2de67392-b7a7-462a-b1ca-108dd189f588_W269N-WFGWX-YVC9B-4J6C9-T8%f%3GX__48_Professional | |
a80b5abf-76ad-428b-b05d-a47d2dffeebf_MH37W-N47XK-V7XM9-C7227-GC%f%QG9__49_ProfessionalN | |
7b9e1751-a8da-4f75-9560-5fadfe3d8e38_3KHY7-WNT83-DGQKR-F7HPR-84%f%4BM__98_CoreN | |
a9107544-f4a0-4053-a96a-1479abdef912_PVMJN-6DFY6-9CCP6-7BKTT-D3%f%WVR__99_CoreCountrySpecific | |
cd918a57-a41b-4c82-8dce-1a538e221a83_7HNRX-D7KGG-3K4RQ-4WPJ4-YT%f%DFH_100_CoreSingleLanguage | |
58e97c99-f377-4ef1-81d5-4ad5522b5fd8_TX9XD-98N7V-6WMQ6-BX7FG-H8%f%Q99_101_Core | |
e0c42288-980c-4788-a014-c080d2e1926e_NW6C2-QMPVW-D7KKK-3GKT6-VC%f%FB2_121_Education | |
3c102355-d027-42c6-ad23-2e7ef8a02585_2WH4N-8QGBV-H22JP-CT43Q-MD%f%WWJ_122_EducationN | |
32d2fab3-e4a8-42c2-923b-4bf4fd13e6ee_M7XTQ-FN8P6-TTKYV-9D4CC-J4%f%62D_125_EnterpriseS_RS5,VB,Ge | |
2d5a5a60-3040-48bf-beb0-fcd770c20ce0_DCPHK-NFMTC-H88MJ-PFHPY-QJ%f%4BJ_125_EnterpriseS_RS1 | |
7b51a46c-0c04-4e8f-9af4-8496cca90d5e_WNMTR-4C88C-JK8YV-HQ7T2-76%f%DF9_125_EnterpriseS_TH1 | |
7103a333-b8c8-49cc-93ce-d37c09687f92_92NFX-8DJQP-P6BBQ-THF9C-7C%f%G2H_126_EnterpriseSN_RS5,VB,Ge | |
9f776d83-7156-45b2-8a5c-359b9c9f22a3_QFFDN-GRT3P-VKWWX-X7T3R-8B%f%639_126_EnterpriseSN_RS1 | |
87b838b7-41b6-4590-8318-5797951d8529_2F77B-TNFGY-69QQF-B8YKP-D6%f%9TJ_126_EnterpriseSN_TH1 | |
82bbc092-bc50-4e16-8e18-b74fc486aec3_NRG8B-VKK3Q-CXVCJ-9G2XF-6Q%f%84J_161_ProfessionalWorkstation | |
4b1571d3-bafb-4b40-8087-a961be2caf65_9FNHH-K3HBT-3W4TD-6383H-6X%f%YWF_162_ProfessionalWorkstationN | |
3f1afc82-f8ac-4f6c-8005-1d233e606eee_6TP4R-GNPTD-KYYHQ-7B7DP-J4%f%47Y_164_ProfessionalEducation | |
5300b18c-2e33-4dc2-8291-47ffcec746dd_YVWGF-BXNMC-HTQYQ-CPQ99-66%f%QFC_165_ProfessionalEducationN | |
e0b2d383-d112-413f-8a80-97f373a5820c_YYVX9-NTFWV-6MDM3-9PT4T-4M%f%68B_171_EnterpriseG | |
e38454fb-41a4-4f59-a5dc-25080e354730_44RPN-FTY23-9VTTB-MP9BX-T8%f%4FV_172_EnterpriseGN | |
ec868e65-fadf-4759-b23e-93fe37f2cc29_CPWHC-NT2C7-VYW78-DHDB2-PG%f%3GK_175_ServerRdsh_RS5 | |
e4db50ea-bda1-4566-b047-0ca50abc6f07_7NBT4-WGBQX-MP4H7-QXFF8-YP%f%3KX_175_ServerRdsh_RS3 | |
0df4f814-3f57-4b8b-9a9d-fddadcd69fac_NBTWJ-3DR69-3C4V8-C26MC-GQ%f%9M6_183_CloudE | |
59eb965c-9150-42b7-a0ec-22151b9897c5_KBN8V-HFGQ4-MGXVD-347P6-PD%f%QGT_191_IoTEnterpriseS_VB,NI | |
d30136fc-cb4b-416e-a23d-87207abc44a9_6XN7V-PCBDC-BDBRH-8DQY7-G6%f%R44_202_CloudEditionN | |
ca7df2e3-5ea0-47b8-9ac1-b1be4d8edd69_37D7F-N49CB-WQR8W-TBJ73-FM%f%8RX_203_CloudEdition | |
:: Windows 2016/19/22/25 LTSC/SAC | |
7dc26449-db21-4e09-ba37-28f2958506a6_TVRH6-WHNXV-R9WG3-9XRFY-MY%f%832___7_ServerStandard_Ge | |
9bd77860-9b31-4b7b-96ad-2564017315bf_VDYBN-27WPP-V4HQT-9VMD4-VM%f%K7H___7_ServerStandard_FE | |
de32eafd-aaee-4662-9444-c1befb41bde2_N69G4-B89J2-4G8F4-WWYCC-J4%f%64C___7_ServerStandard_RS5 | |
8c1c5410-9f39-4805-8c9d-63a07706358f_WC2BQ-8NRM3-FDDYY-2BFGV-KH%f%KQY___7_ServerStandard_RS1 | |
c052f164-cdf6-409a-a0cb-853ba0f0f55a_D764K-2NDRG-47T6Q-P8T8W-YP%f%6DF___8_ServerDatacenter_Ge | |
ef6cfc9f-8c5d-44ac-9aad-de6a2ea0ae03_WX4NM-KYWYW-QJJR4-XV3QB-6V%f%M33___8_ServerDatacenter_FE | |
34e1ae55-27f8-4950-8877-7a03be5fb181_WMDGN-G9PQG-XVVXX-R3X43-63%f%DFG___8_ServerDatacenter_RS5 | |
21c56779-b449-4d20-adfc-eece0e1ad74b_CB7KF-BWN84-R7R2Y-793K2-8X%f%DDG___8_ServerDatacenter_RS1 | |
034d3cbb-5d4b-4245-b3f8-f84571314078_WVDHN-86M7X-466P6-VHXV7-YY%f%726__50_ServerSolution_RS5 | |
2b5a1b0f-a5ab-4c54-ac2f-a6d94824a283_JCKRF-N37P4-C2D82-9YXRT-4M%f%63B__50_ServerSolution_RS1 | |
7b4433f4-b1e7-4788-895a-c45378d38253_QN4C6-GBJD2-FB422-GHWJK-GJ%f%G2R_110_ServerCloudStorage | |
8de8eb62-bbe0-40ac-ac17-f75595071ea3_GRFBW-QNDC4-6QBHG-CCK3B-2P%f%R88_120_ServerARM64_RS5 | |
43d9af6e-5e86-4be8-a797-d072a046896c_K9FYF-G6NCK-73M32-XMVPY-F9%f%DRR_120_ServerARM64_RS4 | |
39e69c41-42b4-4a0a-abad-8e3c10a797cc_QFND9-D3Y9C-J3KKY-6RPVP-2D%f%PYV_145_ServerDatacenterACor_FE | |
90c362e5-0da1-4bfd-b53b-b87d309ade43_6NMRW-2C8FM-D24W7-TQWMY-CW%f%H2D_145_ServerDatacenterACor_RS5 | |
e49c08e7-da82-42f8-bde2-b570fbcae76c_2HXDN-KRXHB-GPYC7-YCKFJ-7F%f%VDG_145_ServerDatacenterACor_RS3 | |
f5e9429c-f50b-4b98-b15c-ef92eb5cff39_67KN8-4FYJW-2487Q-MQ2J7-4C%f%4RG_146_ServerStandardACor_FE | |
73e3957c-fc0c-400d-9184-5f7b6f2eb409_N2KJX-J94YW-TQVFB-DG9YT-72%f%4CC_146_ServerStandardACor_RS5 | |
61c5ef22-f14f-4553-a824-c4b31e84b100_PTXN8-JFHJM-4WC78-MPCBR-9W%f%4KR_146_ServerStandardACor_RS3 | |
45b5aff2-60a0-42f2-bc4b-ec6e5f7b527e_FCNV3-279Q9-BQB46-FTKXX-9H%f%PRH_168_ServerAzureCor_Ge | |
8c8f0ad3-9a43-4e05-b840-93b8d1475cbc_6N379-GGTMK-23C6M-XVVTC-CK%f%FRQ_168_ServerAzureCor_FE | |
a99cc1f0-7719-4306-9645-294102fbff95_FDNH6-VW9RW-BXPJ7-4XTYG-23%f%9TB_168_ServerAzureCor_RS5 | |
3dbf341b-5f6c-4fa7-b936-699dce9e263f_VP34G-4NPPG-79JTQ-864T4-R3%f%MQX_168_ServerAzureCor_RS1 | |
c2e946d1-cfa2-4523-8c87-30bc696ee584_XGN3F-F394H-FD2MY-PP6FD-8M%f%CRC_407_ServerTurbine_Ge | |
19b5e0fb-4431-46bc-bac1-2f1873e4ae73_NTBV8-9K7Q8-V27C6-M2BTV-KH%f%MXV_407_ServerTurbine_RS5 | |
) do ( | |
for /f "tokens=1-5 delims=_" %%A in ("%%#") do if %osSKU%==%%C ( | |
if %1==key if not defined key echo "!allapps!" | find /i "%%A" %nul1% && set key=%%B | |
) | |
) | |
exit /b | |
::======================================================================================================================================== | |
:: Below code is used to get alternate edition name and key if current edition doesn't support KMS38 activation | |
:: 1st column = Current SKU ID | |
:: 2nd column = Current Edition Name | |
:: 3rd column = Current Edition Activation ID | |
:: 4th column = Alternate Edition Activation ID | |
:: 5th column = Alternate Edition GVLK | |
:: 6th column = Alternate Edition Name | |
:: Separator = _ | |
:kms38fallback | |
set notfoundaltactID= | |
if %_NoEditionChange%==1 exit /b | |
for %%# in ( | |
188_IoTEnterprise__________________8ab9bdd1-1f67-4997-82d9-8878520837d9_73111121-5638-40f6-bc11-f1d7b0d64300_NPPR9-FWDCX-D2C8J-H872K-2Y%f%T43_Enterprise | |
206_IoTEnterpriseK_________________80083eae-7031-4394-9e88-4901973d56fe_73111121-5638-40f6-bc11-f1d7b0d64300_NPPR9-FWDCX-D2C8J-H872K-2Y%f%T43_Enterprise | |
191_IoTEnterpriseS-2021____________ed655016-a9e8-4434-95d9-4345352c2552_32d2fab3-e4a8-42c2-923b-4bf4fd13e6ee_M7XTQ-FN8P6-TTKYV-9D4CC-J4%f%62D_EnterpriseS-2021 | |
205_IoTEnterpriseSK________________d4f9b41f-205c-405e-8e08-3d16e88e02be_59eb965c-9150-42b7-a0ec-22151b9897c5_KBN8V-HFGQ4-MGXVD-347P6-PD%f%QGT_IoTEnterpriseS | |
138_ProfessionalSingleLanguage_____a48938aa-62fa-4966-9d44-9f04da3f72f2_2de67392-b7a7-462a-b1ca-108dd189f588_W269N-WFGWX-YVC9B-4J6C9-T8%f%3GX_Professional | |
139_ProfessionalCountrySpecific____f7af7d09-40e4-419c-a49b-eae366689ebd_2de67392-b7a7-462a-b1ca-108dd189f588_W269N-WFGWX-YVC9B-4J6C9-T8%f%3GX_Professional | |
139_ProfessionalCountrySpecific-Zn_01eb852c-424d-4060-94b8-c10d799d7364_2de67392-b7a7-462a-b1ca-108dd189f588_W269N-WFGWX-YVC9B-4J6C9-T8%f%3GX_Professional | |
) do ( | |
for /f "tokens=1-6 delims=_" %%A in ("%%#") do if %osSKU%==%%A ( | |
echo "!allapps!" | find /i "%%C" %nul1% && ( | |
echo "!allapps!" | find /i "%%D" %nul1% && ( | |
set altkey=%%E | |
set altedition=%%F | |
) || ( | |
set altedition=%%F | |
set notfoundaltactID=1 | |
) | |
) | |
) | |
) | |
exit /b | |
::======================================================================================================================================== | |
:: Leave empty line below |