怎么用脚本获取系统激活类型

wen 实用脚本 2

5种高效方法详解与实用脚本代码

目录导读

  1. 为什么需要获取系统激活类型? – 了解激活状态对系统管理的重要性
  2. 使用系统内置命令slmgr.vbs – 最基础且无需外部工具
  3. 通过注册表查询激活状态 – 快速读取关键注册表键值
  4. PowerShell脚本批量检测 – 适用于多台设备的企业场景
  5. VBScript脚本实现 – 兼容老旧系统的方案
  6. 结合WMI对象获取 – 更底层更准确的信息提取
  7. 常见问题问答(Q&A) – 解决实际执行中的疑惑
  8. 总结与建议 – 选择最适合你的脚本方案

为什么需要获取系统激活类型?

在日常系统管理、软件合规审计或企业内部IT资产盘点时,了解Windows系统的激活状态至关重要,激活类型不仅决定了系统是否为正版授权,还影响着可用的功能模块(例如Windows 10家庭版与专业版的差异),通过脚本获取激活状态,可以:

怎么用脚本获取系统激活类型

  • 快速批量检查多台电脑的授权情况
  • 自动化生成合规报告
  • 在无人值守或远程环境中执行检查

需要注意的是,本文讨论的激活类型包括:零售版(Retail)、批量授权版(Volume)、数字许可证(Digital License)以及企业长期服务版(LTSC/LTSB) 等。


方法一:使用系统内置命令slmgr.vbs

这是最简单直接的方法,无需安装任何第三方工具,slmgr.vbs是Windows系统自带的脚本工具,用于管理软件授权。

脚本代码(批处理形式)
@echo off
cscript //nologo %windir%\system32\slmgr.vbs /dli

执行步骤:

  1. 打开记事本,将上述代码粘贴进去
  2. 保存为 get_activation_type.bat(注意扩展名)
  3. 右键点击该文件,选择“以管理员身份运行”

输出示例:

名称:Windows(R), Professional edition
描述:Windows(R) Operating System, RETAIL channel
部分产品密钥:XXXXX
许可证状态:已授权
剩余Windows重置计数:1001
剩余SKU计数:1

RETAIL channel 表示零售版,如果是 VOLUME_MAKVOLUME_KMS 则对应批量授权。/dli参数显示详细信息,而/dlv则提供更详尽的激活历史。

优点:无需额外依赖,所有Windows系统都支持。
缺点:输出格式为文本,不利于程序化解析。

优化建议:如果希望只提取激活类型,可以配合findstr命令过滤:

cscript //nologo %windir%\system32\slmgr.vbs /dli | findstr /i "channel"

方法二:通过注册表查询激活状态

Windows的激活信息存储在注册表中,读取特定键值即可获得激活类型,这种方法速度极快,且适合集成到其他脚本中。

关键注册表路径
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
  • 主要键值:ProductNameEditionIDInstallationType

PowerShell脚本示例

$path = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
$productName = (Get-ItemProperty -Path $path).ProductName
$edition = (Get-ItemProperty -Path $path).EditionID
$installType = (Get-ItemProperty -Path $path).InstallationType
Write-Host "产品名称: $productName"
Write-Host "版本ID: $edition"
Write-Host "安装类型: $installType"
# 激活类型判断
if ($installType -eq "Client") {
    Write-Host "激活类型: 零售/零售数字许可证 (需进一步判断)"
} elseif ($installType -eq "Server") {
    Write-Host "激活类型: 服务器版"
} elseif ($installType -eq "MULTI") {
    Write-Host "激活类型: 多用户/批量授权"
}

注意InstallationType的值通常为Client(客户端系统)或Server,要准确判断是零售还是批量,还需要结合slmgr或查看LicenseStatus键值。

优化点:可以检查 HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform 下的 TokenStore 文件夹是否存在数字许可证文件。

适用场景:远程执行、批量环境、无需弹出UAC窗口(不过读取注册表通常需要管理员权限)。


方法三:PowerShell脚本批量检测

对于企业环境,批量检查多台机器的激活状态是常见需求,PowerShell支持通过Invoke-CommandGet-WmiObjectGet-CimInstance远程获取信息。

批量检测脚本
$computers = @("PC01", "PC02", "PC03")  # 替换为实际计算机名或IP列表
foreach ($computer in $computers) {
    try {
        $status = Invoke-Command -ComputerName $computer -ScriptBlock {
            $license = Get-WmiObject -Query "SELECT * FROM SoftwareLicensingProduct WHERE PartialProductKey IS NOT NULL"
            if ($license) {
                $activationStatus = $license.LicenseStatus
                $productKeyChannel = $license.ProductKeyChannel
                Write-Output "$env:COMPUTERNAME | 状态: $activationStatus | 渠道: $productKeyChannel"
            } else {
                Write-Output "$env:COMPUTERNAME | 未找到产品密钥"
            }
        } -ErrorAction SilentlyContinue
        Write-Output $status
    } catch {
        Write-Warning "$computer 连接失败: $_"
    }
}

LicenseStatus值含义

  • 0:未授权
  • 1:已授权
  • 2:超出Grace期
  • 3:通知期

ProductKeyChannel常见值

  • Retail:零售版
  • Volume:MAK:多次激活密钥
  • Volume:KMS:KMS激活密钥
  • DigitalLicense:数字许可证

依赖条件:需开启远程管理(WinRM),且目标计算机防火墙允许远程WMI调用。


方法四:VBScript脚本实现

对于仍在使用Windows 7或Server 2008等旧系统的环境,VBScript比PowerShell更可靠。

VBScript示例
Set objShell = CreateObject("WScript.Shell")
Set objExec = objShell.Exec("cscript //nologo %windir%\system32\slmgr.vbs /dli")
strOutput = objExec.StdOut.ReadAll
' 解析输出中的频道信息
If InStr(strOutput, "RETAIL channel") > 0 Then
    WScript.Echo "激活类型: 零售版 (Retail)"
ElseIf InStr(strOutput, "VOLUME_KMS channel") > 0 Then
    WScript.Echo "激活类型: 批量授权 KMS"
ElseIf InStr(strOutput, "VOLUME_MAK channel") > 0 Then
    WScript.Echo "激活类型: 批量授权 MAK"
Else
    WScript.Echo "激活类型: 未知或数字许可证 (需要进一步检查)"
End If

将此代码保存为.vbs文件,双击或通过cscript get_type.vbs执行,VBScript的优势在于它对旧版Windows的兼容性强,且代码结构清晰。

局限:缺乏原生错误处理,若slmgr.vbs执行失败,需添加On Error Resume Next


方法五:结合WMI对象获取

WMI(Windows Management Instrumentation)提供了底层硬件与软件信息接口,通过查询SoftwareLicensingProduct类,可以获取最精确的激活类型数据。

使用wmic命令行
wmic path SoftwareLicensingProduct where "PartialProductKey is not null" get ProductKeyChannel, LicenseStatus, Name /format:list

输出示例

LicenseStatus=1
Name=Windows(R), Professional edition
ProductKeyChannel=Retail

优势:输出结构化,易于脚本解析,支持多数Windows版本。
不足:需要管理员权限;在某些精简版系统(如LTSC)中可能缺失WMI类。

PowerShell等效命令

Get-WmiObject -Query "SELECT ProductKeyChannel, LicenseStatus, Name FROM SoftwareLicensingProduct WHERE PartialProductKey IS NOT NULL" | Format-Table -AutoSize

注意事项:若系统从未激活或未输入过密钥,PartialProductKey可能为NULL,需额外处理。


常见问题问答(Q&A)

Q1:脚本执行后显示“空值”或“未找到产品密钥”,是什么原因?

A:这通常意味着系统从未进行过激活,或使用的预激活镜像(例如企业版批量授权映像)尚未输入密钥,建议先检查系统是否有Grace期(宽限期),方法:slmgr /xpr

Q2:批量检测时某些计算机返回“访问拒绝”,如何解决?

A:请确保:

  • 当前账户拥有目标计算机的管理员权限
  • 防火墙已允许WMI(端口135和动态RPC端口)
  • 在目标计算机上执行winrm quickconfig开启WinRM

Q3:数字许可证(Digital License)如何通过脚本识别?

A:数字许可证的特点是ProductKeyChannel字段为DigitalLicense,检查注册表HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform下的TokenStore文件夹,若存在*.tokens.dat文件,通常表示数字许可证激活。

Q4:不同Windows版本(如10/11/Server)的脚本是否通用?

A:基本通用,但某些旧版Windows(如Windows 7)可能缺少SoftwareLicensingProduct WMI类,建议使用slmgr.vbs作为兼容性后备方案。

Q5:脚本执行后无法解析中文输出,如何处理?

A:slmgr.vbs的输出语言取决于系统区域,在英文系统下为英文,中文系统下为中文,若想统一处理,可以强制指定区域:

cscript //nologo //E:vbscript %windir%\system32\slmgr.vbs /dli

或在脚本中添加@chcp 437 >nul临时切换到英文代码页。

Q6:有没有方法在非管理员账户下获取激活类型?

A:普通用户可以通过slmgr /dli查看部分信息,但无法获取产品密钥,注册表读取也需要管理员权限,若需非管理员方案,可借助系统内置的msinfo32systeminfo命令,但获取的信息有限。


总结与建议

根据场景选择合适的脚本方法:

场景 推荐方案 理由
单机临时检查 slmgr.vbs或wmic 最快,无依赖
企业批量检测 PowerShell + WMI 支持远程,结构清晰
旧系统兼容 VBScript 兼容性最强
集成到自动化工具 注册表读取 速度最快,易于解析
需要详细激活历史 slmgr /dlv 信息最全

最佳实践:实际排查时,建议先使用slmgr /dli获取基础信息,再结合Get-WmiObject提取ProductKeyChannel字段确认具体类型,若需要远程执行,务必提前配置好WinRM(对于工作组环境,可能需要启用HTTPS或设置信任选项)。

请适度使用脚本获取敏感信息,避免在公共网络中传输未经加密的激活状态数据,对于内部IT审计,建议设置日志记录和权限控制。


附录:快速参考命令

  • 查看激活状态:slmgr /xpr
  • 查看详细激活信息:slmgr /dlv
  • 显示许可证状态数字:wmic path SoftwareLicensingProduct where 'LicenseStatus is not null' get LicenseStatus
  • 查看系统版本与版本ID:wmic os get Caption, Version, BuildNumber

希望本文能帮助你高效、准确地获取系统激活类型,如有疑问,欢迎根据上述代码进行测试和验证。

抱歉,评论功能暂时关闭!