最近几天写了一个数字权利激活使用的批处理脚本,虽然网上有大神用C#写的软件,但是自己动手还是更有意义。
取得管理员权限
默认的批处理文件是没有管理员权限的,如果要进行注册表操作,需要右键单机批处理文件,选择以管理员身份运行
,经过搜索,在知乎上找到了这段代码:
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
if '%errorlevel%' NEQ '0' (
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
exit /B
:gotAdmin
if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
pushd "%CD%"
CD /D "%~dp0"
将这段代码放在批处理最前面,就可以实现自动取得管理员权限,当然开启UAC之后还是要点一下是才能运行的。
获取操作系统版本
数字权利激活的方式,首先要确定操作系统版本,即SKU
,这个值可以用powershell
的命令来获取:
Get-WmiObject -Class Win32_OperatingSystem | Select-Object -ExpandProperty OperatingSystemSKU
如果要在批处理中执行powershell
的命令就需要用:
powershell -command "& {&Get-WmiObject -Class Win32_OperatingSystem | Select-Object -ExpandProperty OperatingSystemSKU}"
这时就可以输出正常的数值,利用这个数值,来确定SKU
并决定你在激活时要用到的key
。
判断操作系统位数
对于如何判断操作系统是32位或者64位,我在网上找到了一段代码,原理是利用if
命令判断系统文件夹是否有64位专有的文件夹,如果有,则是64位系统。
代码如下:
if exist %windir%\SysWOW64 (
start %~dp0\x64\gatherosstate.exe
)else (
start %~dp0\x86\gatherosstate.exe
)
剩下的就是按照原来的说明中继续操作,需要注意的是,原来的说明中提到企业版N及LTSB 2016 N需要再运行gatherosstate.exe
之前执行一个powershell
命令,我安装虚拟机测试之后发现并不需要,不知道是为什么。
判断是否为LTSC版本
接下来的问题就是目前微软最新的长期支持版本,即LTSC 2019,不能使用数字权利激活,只能用MAK KEY或者KMS激活,如何判断系统是LTSC 2019或者LTSC 2019 N呢?
下载了对应的镜像,虚拟机安装好之后用下面这一条powershell
命令:
Get-WmiObject SoftwareLicensingProduct -Filter 'Name like "Windows%" and LicenseStatus=1' | Select-Object -ExpandProperty Name
返回的结果是Windows(R), EnterpriseS(N) edition
,对应的SKU
是125
与126
。
如何判断是LTSC还是LTSB就靠下面的代码了:
for /f "delims=" %%b in ('powershell -command "& {&Get-WmiObject -Class Win32_OperatingSystem | Select-Object -ExpandProperty Version}"') do set ver=%%b
if "%Ver%" GEQ "10.0.17700" (
if "%sku%"=="125" (
goto :C
) else (
goto :A
)
) else if "%sku%"=="126" (
goto :C
) else (
goto :A
)
首先获取操作系统版本号,如果版本号大于10.0.17700
,且SKU
为125
或126
,即为LTSC版。
最终测试
最后整理一下代码逻辑,最终版本的批处理文件只有85行,又用虚拟机装了不同版本的win10测试,没有发现其它问题。