如何通过WMI判断Windows机器是否通过Active Directory激活以跳过CAC离线激活工具?
如何通过WMI判断Windows机器是否通过Active Directory激活以跳过CAC离线激活工具?
嘿,我懂你遇到的坑了——之前查到的ActivationMethod属性确实不存在于SoftwareLicensingService类里,白忙活一场对吧?别担心,咱们换个靠谱的路子,用SoftwareLicensingProduct这个WMI类就能准确判断。
这个类里记录了系统的激活状态和激活方式相关的关键信息,咱们可以通过它来筛选出已激活且是AD域激活的机器:
首先,先运行这条命令查看激活详情:
Get-WmiObject -Class SoftwareLicensingProduct | Where-Object { $_.PartialProductKey -ne $null -and $_.LicenseStatus -eq 1 } | Select-Object -Property Name, Description, LicenseStatus, ProductKeyChannel
这里解释下几个关键条件:
PartialProductKey -ne $null:过滤掉那些没有安装密钥的无效条目LicenseStatus -eq 1:表示系统已经激活(状态1就是激活成功)
接下来看结果里的字段:
- 如果是AD域激活的机器,
Description字段里会明确包含Active Directory-Based Activation的字样,这个判断最直接精准 - 另外,
ProductKeyChannel通常会显示为Volume:GVLK(因为AD激活属于批量激活的域集成KMS模式,GVLK是KMS客户端密钥)
把这个逻辑写到你的脚本里就很简单了,比如:
# 检查是否为AD激活的已激活机器 $isADActivated = Get-WmiObject -Class SoftwareLicensingProduct | Where-Object { $_.PartialProductKey -ne $null -and $_.LicenseStatus -eq 1 -and $_.Description -match 'Active Directory-Based Activation' } if ($isADActivated) { Write-Host "目标机器已通过AD激活,跳过CAC离线激活工具" # 这里添加跳过工具的逻辑 } else { Write-Host "目标机器未通过AD激活,执行CAC离线激活工具" # 这里添加运行工具的逻辑 }
要是你觉得匹配描述有点麻烦,用ProductKeyChannel匹配Volume:GVLK也能达到目的,不过用描述判断更精准——毕竟有些独立KMS服务器激活的机器也会用GVLK,但AD激活的描述是独有的。
备注:内容来源于stack exchange,提问作者Sigshane




