< !-- : Begin batch script
@ setlocal DisableDelayedExpansion
@ echo off
: : Check-Activation-Status
: : Written by @abbodi1406
: : forums.mydigitallife.net/posts/838808
set WMI_VBS = 0
@ cls
set _args =
set _args = %*
for %% A in ( %_args% ) do (
if /i " %% A " == " -wow " set _rel1 = 1
if /i " %% A " == " -arm " set _rel2 = 1
)
set " _cmdf= %~f0 "
if exist " %SystemRoot% \Sysnative\cmd.exe " if not defined _rel1 (
setlocal EnableDelayedExpansion
start %SystemRoot% \Sysnative\cmd.exe /c " " !_cmdf! " -wow "
exit /b
)
if exist " %SystemRoot% \SysArm32\cmd.exe " if /i %PROCESSOR_ARCHITECTURE% == AMD64 if not defined _rel2 (
setlocal EnableDelayedExpansion
start %SystemRoot% \SysArm32\cmd.exe /c " " !_cmdf! " -arm "
exit /b
)
color 07
title Check Activation Status [wmi]
set wspp = SoftwareLicensingProduct
set wsps = SoftwareLicensingService
set ospp = OfficeSoftwareProtectionProduct
set osps = OfficeSoftwareProtectionService
set winApp = 55c92734-d682-4d71-983e-d6ec3f16059f
set o14App = 59a52881-a989-479d-af46-f275c6370663
set o15App = 0ff1ce15-a989-479d-af46-f275c6370663
for %% # in ( spp_get,ospp_get,cW1nd0ws,sppw,c0ff1ce15,sppo,osppsvc,ospp14,ospp15) do set " %% #= "
for /f " tokens=6 delims=[]. " %% # in ( 'ver' ) do set winbuild = %% #
set " spp_get=Description, DiscoveredKeyManagementServiceMachineName, DiscoveredKeyManagementServiceMachinePort, EvaluationEndDate, GracePeriodRemaining, ID, KeyManagementServiceMachine, KeyManagementServicePort, KeyManagementServiceProductKeyID, LicenseStatus, LicenseStatusReason, Name, PartialProductKey, ProductKeyID, VLActivationInterval, VLRenewalInterval "
set " ospp_get= %spp_get% "
if %winbuild% GEQ 9200 set " spp_get= %spp_get% , KeyManagementServiceLookupDomain, VLActivationTypeEnabled "
if %winbuild% GEQ 9600 set " spp_get= %spp_get% , DiscoveredKeyManagementServiceMachineIpAddress, ProductKeyChannel "
set " _work= %~dp0 "
set " _batf= %~f0 "
set " _batp= %_batf:'=''% "
set " _Local= %LocalAppData% "
set _Identity = 0
setlocal EnableDelayedExpansion
dir /b /s /a:-d " !_Local! \Microsoft\Office\Licenses\*1* " 1 > nul 2 > nul && set _Identity = 1
dir /b /s /a:-d " !ProgramData! \Microsoft\Office\Licenses\*1* " 1 > nul 2 > nul && set _Identity = 1
pushd " !_work! "
setlocal DisableDelayedExpansion
if %winbuild% LSS 9200 if not exist " %SystemRoot% \servicing\Packages\Microsoft-Windows-PowerShell-WTR-Package~*.mum " set _Identity = 0
set " SysPath= %SystemRoot% \System32 "
set " Path= %SystemRoot% \System32; %SystemRoot% \System32\Wbem; %SystemRoot% \System32\WindowsPowerShell\v1.0\ "
if exist " %SystemRoot% \Sysnative\reg.exe " (
set " SysPath= %SystemRoot% \Sysnative "
set " Path= %SystemRoot% \Sysnative; %SystemRoot% \Sysnative\Wbem; %SystemRoot% \Sysnative\WindowsPowerShell\v1.0\; %Path% "
)
: : 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 :
ping 127.0.0.1 -n 6 > nul
popd
exit /b
)
popd
set ohook =
for %% # in ( 15 16) do (
for %% A in ( " %ProgramFiles% " " %ProgramW6432% " " %ProgramFiles(x86)% " ) do (
if exist " %% ~A\Microsoft Office\Office %% #\sppc*dll " set ohook = 1
)
)
for %% # in ( System SystemX86) do (
for %% G in ( " Office 15 " " Office " ) do (
for %% A in ( " %ProgramFiles% " " %ProgramW6432% " " %ProgramFiles(x86)% " ) do (
if exist " %% ~A\Microsoft %% ~G\root\vfs\ %% #\sppc*dll " set ohook = 1
)
)
)
set _cwmi = 0
for %% # in ( wmic.exe) do @ if not " %% ~$PATH:# " == " " (
wmic path Win32_ComputerSystem get CreationClassName /value 2 > nul | find /i " ComputerSystem " 1 > nul && set _cwmi = 1
)
if %_cwmi% EQU 0 (
echo :
echo Error: WMI is not responding in the system.
echo :
echo In MAS, Goto Troubleshoot and run Fix WMI option.
echo :
echo Press any key to exit...
pause > nul
exit /b
)
set " line2=************************************************************ "
set " line3=____________________________________________________________ "
set " _psc=powershell "
set _prsh = 1
for %% # in ( powershell.exe) do @ if " %% ~$PATH:# " == " " set _prsh = 0
set " _csg=cscript.exe //NoLogo //Job:WmiMulti " %~nx0 ?.wsf" "
set " _csq=cscript.exe //NoLogo //Job:WmiQuery " %~nx0 ?.wsf" "
set " _csx=cscript.exe //NoLogo //Job:XPDT " %~nx0 ?.wsf" "
if %_cwmi% EQU 0 set WMI_VBS = 1
if %WMI_VBS% EQU 0 (
set " _zz1=wmic path "
set " _zz2=where "
set " _zz3=get "
set " _zz4=/value "
set " _zz5=( "
set " _zz6=) "
set " _zz7= " wmic path"
set " _zz8=/value " "
) else (
set " _zz1= %_csq% "
set " _zz2= "
set " _zz3= "
set " _zz4= "
set " _zz5= " "
set " _zz6= " "
set " _zz7= %_csq% "
set " _zz8= "
)
set _WSH = 0
set OsppHook = 1
sc query osppsvc > nul 2 >& 1
if %errorlevel% EQU 1060 set OsppHook = 0
net start sppsvc /y > nul 2 >& 1
call : casWpkey %wspp% %winApp% cW1nd0ws sppw
if %winbuild% GEQ 9200 call : casWpkey %wspp% %o15App% c0ff1ce15 sppo
if %OsppHook% NEQ 0 (
net start osppsvc /y > nul 2 >& 1
call : casWpkey %ospp% %o14App% osppsvc ospp14
if %winbuild% LSS 9200 call : casWpkey %ospp% %o15App% osppsvc ospp15
)
echo %line2%
echo *** Windows Status ***
echo %line2%
if not defined cW1nd0ws (
echo .
echo Error: product key not found.
goto : casWcon
)
set winID = 1
set " _qr= %_zz7% %wspp% %_zz2% %_zz5% ApplicationID=' %winApp% ' and PartialProductKey is not null %_zz6% %_zz3% ID %_zz8% "
for /f " tokens=2 delims== " %% # in ( ' %_qr% ' ) do (
set " chkID= %% # "
call : casWdet " %wspp% " " %wsps% " " %spp_get% "
call : casWout
echo %line3%
echo .
)
if defined ohook (
echo .
echo .
echo %line2%
echo *** Office Ohook Activation Status ***
echo %line2%
echo .
powershell " write-host -back 'Black' -fore 'Yellow' 'Ohook for permanent Office activation is installed.'; write-host -back 'Black' -fore 'Yellow' 'You can ignore below Office activation status.' "
echo .
)
: casWcon
set winID = 0
set verbose = 1
if not defined c0ff1ce15 (
if defined osppsvc goto : casWospp
goto : casWend
)
echo %line2%
echo *** Office Status ***
echo %line2%
set " _qr= %_zz7% %wspp% %_zz2% %_zz5% ApplicationID=' %o15App% ' and PartialProductKey is not null %_zz6% %_zz3% ID %_zz8% "
for /f " tokens=2 delims== " %% # in ( ' %_qr% ' ) do (
set " chkID= %% # "
call : casWdet " %wspp% " " %wsps% " " %spp_get% "
call : casWout
echo %line3%
echo .
)
set verbose = 0
if defined osppsvc goto : casWospp
goto : casWend
: casWospp
if %verbose% EQU 1 (
echo %line2%
echo *** Office Status ***
echo %line2%
)
set " _qr= %_zz7% %ospp% %_zz2% %_zz5% ApplicationID=' %o15App% ' and PartialProductKey is not null %_zz6% %_zz3% ID %_zz8% "
if defined ospp15 for /f " tokens=2 delims== " %% # in ( ' %_qr% ' ) do (
set " chkID= %% # "
call : casWdet " %ospp% " " %osps% " " %ospp_get% "
call : casWout
echo %line3%
echo .
)
set " _qr= %_zz7% %ospp% %_zz2% %_zz5% ApplicationID=' %o14App% ' and PartialProductKey is not null %_zz6% %_zz3% ID %_zz8% "
if defined ospp14 for /f " tokens=2 delims== " %% # in ( ' %_qr% ' ) do (
set " chkID= %% # "
call : casWdet " %ospp% " " %osps% " " %ospp_get% "
call : casWout
echo %line3%
echo .
)
goto : casWend
: casWpkey
set " _qr= %_zz1% %1 %_zz2% %_zz5% ApplicationID=' %2 ' and PartialProductKey is not null %_zz6% %_zz3% ID %_zz4% "
%_qr% 2 > nul | findstr /i ID 1 > nul && ( set %3 = 1& set %4 = 1)
exit /b
: casWdet
for %% # in ( %~3 ) do set " %% #= "
if /i %~1 == %ospp% for %% # in ( DiscoveredKeyManagementServiceMachineIpAddress, KeyManagementServiceLookupDomain, ProductKeyChannel, VLActivationTypeEnabled) do set " %% #= "
set " cKmsClient= "
set " cTblClient= "
set " cAvmClient= "
set " ExpireMsg= "
set " _xpr= "
set " _qr= " wmic path %~1 where ID='%chkID% ' get %~3 /value" ^ | findstr ^ = "
if %WMI_VBS% NEQ 0 set " _qr= %_csg% %~1 " ID='%chkID% '" " %~3 " "
for /f " tokens=* delims= " %% # in ( ' %_qr% ' ) do set " %% # "
set /a _gpr = ( GracePeriodRemaining + 1440 - 1 ) / 1440
echo %Description% | findstr /i VOLUME_KMSCLIENT 1 > nul && ( set cKmsClient = 1& set _mTag = Volume)
echo %Description% | findstr /i TIMEBASED_ 1 > nul && ( set cTblClient = 1& set _mTag = Timebased)
echo %Description% | findstr /i VIRTUAL_MACHINE_ACTIVATION 1 > nul && ( set cAvmClient = 1& set _mTag = Automatic VM)
cmd /c exit /b %LicenseStatusReason%
set " LicenseReason= %=ExitCode% "
set " LicenseMsg=Time remaining: %GracePeriodRemaining% minute(s) ( %_gpr% day(s)) "
if %_gpr% GEQ 1 if %_WSH% EQU 1 (
for /f " tokens=* delims= " %% # in ( ' %_csx% %GracePeriodRemaining% ' ) do set " _xpr= %% # "
)
if %_gpr% GEQ 1 if %_prsh% EQU 1 if not defined _xpr (
for /f " tokens=* delims= " %% # in ( ' %_psc% "$([DateTime]::Now.addMinutes( %GracePeriodRemaining% )).ToString('yyyy-MM-dd HH:mm:ss' ) " 2 ^ >nul') do set " _xpr=%% #"
title Check Activation Status [wmi]
)
if %LicenseStatus% EQU 0 (
set " License=Unlicensed "
set " LicenseMsg= "
)
if %LicenseStatus% EQU 1 (
set " License=Licensed "
set " LicenseMsg= "
if %GracePeriodRemaining% EQU 0 (
if %winID% EQU 1 ( set " ExpireMsg=The machine is permanently activated. " ) else ( set " ExpireMsg=The product is permanently activated. " )
) else (
set " LicenseMsg= %_mTag% activation expiration: %GracePeriodRemaining% minute(s) ( %_gpr% day(s)) "
if defined _xpr set " ExpireMsg= %_mTag% activation will expire %_xpr% "
)
)
if %LicenseStatus% EQU 2 (
set " License=Initial grace period "
if defined _xpr set " ExpireMsg=Initial grace period ends %_xpr% "
)
if %LicenseStatus% EQU 3 (
set " License=Additional grace period (KMS license expired or hardware out of tolerance) "
if defined _xpr set " ExpireMsg=Additional grace period ends %_xpr% "
)
if %LicenseStatus% EQU 4 (
set " License=Non-genuine grace period. "
if defined _xpr set " ExpireMsg=Non-genuine grace period ends %_xpr% "
)
if %LicenseStatus% EQU 6 (
set " License=Extended grace period "
if defined _xpr set " ExpireMsg=Extended grace period ends %_xpr% "
)
if %LicenseStatus% EQU 5 (
set " License=Notification "
if " %LicenseReason% " == " C004F200 " ( set " LicenseMsg=Notification Reason: 0xC004F200 (non-genuine). "
) else if "%LicenseReason%"=="C004F009" (set "LicenseMsg=Notification Reason: 0xC004F009 (grace time expired)."
) else (set "LicenseMsg=Notification Reason: 0x%LicenseReason%"
)
)
if %LicenseStatus% GTR 6 (
set " License=Unknown "
set " LicenseMsg= "
)
if not defined cKmsClient exit /b
if %KeyManagementServicePort% == 0 set KeyManagementServicePort = 1688
set " KmsReg=Registered KMS machine name: %KeyManagementServiceMachine% : %KeyManagementServicePort% "
if " %KeyManagementServiceMachine% " == " " set " KmsReg=Registered KMS machine name: KMS name not available "
if %DiscoveredKeyManagementServiceMachinePort% == 0 set DiscoveredKeyManagementServiceMachinePort = 1688
set " KmsDns=KMS machine name from DNS: %DiscoveredKeyManagementServiceMachineName% : %DiscoveredKeyManagementServiceMachinePort% "
if " %DiscoveredKeyManagementServiceMachineName% " == " " set " KmsDns=DNS auto-discovery: KMS name not available "
set " _qr= " wmic path %~2 get ClientMachineID, KeyManagementServiceHostCaching /value" ^ | findstr ^ = "
if %WMI_VBS% NEQ 0 set " _qr= %_csg% %~2 " ClientMachineID, KeyManagementServiceHostCaching" "
for /f " tokens=* delims= " %% # in ( ' %_qr% ' ) do set " %% # "
if /i %KeyManagementServiceHostCaching% == True ( set KeyManagementServiceHostCaching = Enabled) else ( set KeyManagementServiceHostCaching = Disabled)
if %winbuild% LSS 9200 exit /b
if /i %~1 == %ospp% exit /b
if " %KeyManagementServiceLookupDomain% " == " " set " KeyManagementServiceLookupDomain= "
if %VLActivationTypeEnabled% EQU 3 (
set VLActivationType = Token
) else if %VLActivationTypeEnabled% EQU 2 (
set VLActivationType = KMS
) else if %VLActivationTypeEnabled% EQU 1 (
set VLActivationType = AD
) else (
set VLActivationType = All
)
if %winbuild% LSS 9600 exit /b
if " %DiscoveredKeyManagementServiceMachineIpAddress% " == " " set " DiscoveredKeyManagementServiceMachineIpAddress=not available "
exit /b
: casWout
echo .
echo Name: %Name%
echo Description: %Description%
echo Activation ID: %ID%
echo Extended PID: %ProductKeyID%
if defined ProductKeyChannel echo Product Key Channel: %ProductKeyChannel%
echo Partial Product Key: %PartialProductKey%
echo License Status: %License%
if defined LicenseMsg echo %LicenseMsg%
if not %LicenseStatus% == 0 if not %EvaluationEndDate:~0,8% == 16010101 echo Evaluation End Date: %EvaluationEndDate:~0,4% -%EvaluationEndDate:~4,2% -%EvaluationEndDate:~6,2% %EvaluationEndDate:~8,2% :%EvaluationEndDate:~10,2% UTC
if not defined cKmsClient (
if defined ExpireMsg echo .& echo . %ExpireMsg%
exit /b
)
if defined VLActivationTypeEnabled echo Configured Activation Type: %VLActivationType%
echo .
if not %LicenseStatus% == 1 (
echo Please activate the product in order to update KMS client information values.
exit /b
)
echo Most recent activation information:
echo Key Management Service client information
echo . Client Machine ID (CMID): %ClientMachineID%
echo . %KmsDns%
echo . %KmsReg%
if defined DiscoveredKeyManagementServiceMachineIpAddress echo . KMS machine IP address: %DiscoveredKeyManagementServiceMachineIpAddress%
echo . KMS machine extended PID: %KeyManagementServiceProductKeyID%
echo . Activation interval: %VLActivationInterval% minutes
echo . Renewal interval: %VLRenewalInterval% minutes
echo . K.M.S host caching: %KeyManagementServiceHostCaching%
if defined KeyManagementServiceLookupDomain echo . KMS SRV record lookup domain: %KeyManagementServiceLookupDomain%
if defined ExpireMsg echo .& echo . %ExpireMsg%
exit /b
: casWend
if %_Identity% EQU 1 if %_prsh% EQU 1 (
echo %line2%
echo *** Office vNext Status ***
echo %line2%
setlocal EnableDelayedExpansion
%_psc% " $f=[IO.File]::ReadAllText('!_batp!') -split ':vNextDiag\:.*';iex ($f[1]) "
title Check Activation Status [wmi]
echo %line3%
echo .
)
echo .
echo Press any key to exit.
pause > nul
exit /b
: vNextDiag :
function PrintModePerPridFromRegistry
{
$vNextRegkey = " HKCU:\SOFTWARE\Microsoft\Office\16.0\Common\Licensing\LicensingNext "
$vNextPrids = Get-Item -Path $vNextRegkey -ErrorAction Ignore | Select-Object -ExpandProperty 'property' | Where-Object -FilterScript {$_.ToLower() -like " *retail " -or $_.ToLower() -like " *volume " }
If ($vNextPrids - E q $ n u l l )
{
Write-Host " No registry keys found. "
Return
}
$vNextPrids | ForEach `
{
$mode = (Get-ItemProperty -Path $vNextRegkey -Name $_).$_
Switch ($mode)
{
2 { $mode = " vNext " ; Break }
3 { $mode = " Device " ; Break }
Default { $mode = " Legacy " ; Break }
}
Write-Host $_ = $mode
}
}
function PrintSharedComputerLicensing
{
$scaRegKey = " HKLM:\SOFTWARE\Microsoft\Office\ClickToRun\Configuration "
$scaValue = Get-ItemProperty -Path $scaRegKey -ErrorAction Ignore | Select-Object -ExpandProperty " SharedComputerLicensing " -ErrorAction Ignore
$scaRegKey2 = " HKLM:\SOFTWARE\Microsoft\Office\16.0\Common\Licensing "
$scaValue2 = Get-ItemProperty -Path $scaRegKey2 -ErrorAction Ignore | Select-Object -ExpandProperty " SharedComputerLicensing " -ErrorAction Ignore
$scaPolicyKey = " HKLM:\SOFTWARE\Policies\Microsoft\Office\16.0\Common\Licensing "
$scaPolicyValue = Get-ItemProperty -Path $scaPolicyKey -ErrorAction Ignore | Select-Object -ExpandProperty " SharedComputerLicensing " -ErrorAction Ignore
If ($scaValue - E q $ n u l l - A n d $ s c a V a l u e 2 - E q $ n u l l - A n d $ s c a P o l i c y V a l u e - E q $ n u l l )
{
Write-Host " No registry keys found. "
Return
}
$scaModeValue = $scaValue -Or $scaValue2 -Or $scaPolicyValue
If ($scaModeValue - E q 0 )
{
$scaMode = " Disabled "
}
If ($scaModeValue - E q 1 )
{
$scaMode = " Enabled "
}
Write-Host " SharedComputerLicensing " = $scaMode
Write-Host
$tokenFiles = $null
$tokenPath = " ${env:LOCALAPPDATA}\Microsoft\Office\16.0\Licensing "
If (Test-Path $ t o k e n P a t h )
{
$tokenFiles = Get-ChildItem -Path $tokenPath -Recurse -File -Filter " *authString* "
}
If ($tokenFiles.length - E q 0 )
{
Write-Host " No tokens found. "
Return
}
$tokenFiles | ForEach `
{
$tokenParts = (Get-Content -Encoding Unicode -Path $_.FullName).Split('_')
$output = [PSCustomObject] `
@ {
ACID = $tokenParts[0];
User = $tokenParts[3]
NotBefore = $tokenParts[4];
NotAfter = $tokenParts[5];
} | ConvertTo-Json
Write-Host $output
}
}
function PrintLicensesInformation
{
Param(
[ValidateSet(" NUL " , " Device " )]
[String]$mode
)
If ($mode - E q " N U L " )
{
$licensePath = " ${env:LOCALAPPDATA}\Microsoft\Office\Licenses "
}
ElseIf ($mode -Eq " Device " )
{
$licensePath = " ${env:PROGRAMDATA}\Microsoft\Office\Licenses "
}
$licenseFiles = $null
If (Test-Path $ l i c e n s e P a t h )
{
$licenseFiles = Get-ChildItem -Path $licensePath -Recurse -File
}
If ($licenseFiles.length - E q 0 )
{
Write-Host " No licenses found. "
Return
}
$licenseFiles | ForEach `
{
$license = (Get-Content -Encoding Unicode $_.FullName | ConvertFrom-Json).License
$decodedLicense = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($license)) | ConvertFrom-Json
$licenseType = $decodedLicense.LicenseType
If ($null - N e $ d e c o d e d L i c e n s e . E x p i r e s O n )
{
$expiry = [DateTime]::Parse($decodedLicense.ExpiresOn, $null, 48)
}
Else
{
$expiry = New-Object DateTime
}
$licenseState = $null
If ((Get-Date) - G t ( G e t - D a t e $ d e c o d e d L i c e n s e . M e t a D a t a . N o t A f t e r ) )
{
$licenseState = " RFM "
}
ElseIf ((Get-Date) -Lt (Get-Date $expiry))
{
$licenseState = " Licensed "
}
Else
{
$licenseState = " Grace "
}
if ($mode - E q " N U L " )
{
$output = [PSCustomObject] `
@ {
Version = $_.Directory.Name
Type = " User|${licenseType} " ;
Product = $decodedLicense.ProductReleaseId;
Acid = $decodedLicense.Acid;
LicenseState = $licenseState;
EntitlementStatus = $decodedLicense.Status;
EntitlementExpiration = $decodedLicense.ExpiresOn;
ReasonCode = $decodedLicense.ReasonCode;
NotBefore = $decodedLicense.Metadata.NotBefore;
NotAfter = $decodedLicense.Metadata.NotAfter;
NextRenewal = $decodedLicense.Metadata.RenewAfter;
TenantId = $decodedLicense.Metadata.TenantId;
} | ConvertTo-Json
}
ElseIf ($mode -Eq " Device " )
{
$output = [PSCustomObject] `
@ {
Version = $_.Directory.Name
Type = " Device|${licenseType} " ;
Product = $decodedLicense.ProductReleaseId;
Acid = $decodedLicense.Acid;
DeviceId = $decodedLicense.Metadata.DeviceId;
LicenseState = $licenseState;
EntitlementStatus = $decodedLicense.Status;
EntitlementExpiration = $decodedLicense.ExpiresOn;
ReasonCode = $decodedLicense.ReasonCode;
NotBefore = $decodedLicense.Metadata.NotBefore;
NotAfter = $decodedLicense.Metadata.NotAfter;
NextRenewal = $decodedLicense.Metadata.RenewAfter;
TenantId = $decodedLicense.Metadata.TenantId;
} | ConvertTo-Json
}
Write-Output $output
}
}
Write-Host
Write-Host " ========== Mode per ProductReleaseId ========== "
Write-Host
PrintModePerPridFromRegistry
Write-Host
Write-Host " ========== Shared Computer Licensing ========== "
Write-Host
PrintSharedComputerLicensing
Write-Host
Write-Host " ========== vNext licenses ========== "
Write-Host
PrintLicensesInformation -Mode " NUL "
Write-Host
Write-Host " ========== Device licenses ========== "
Write-Host
PrintLicensesInformation -Mode " Device "
: vNextDiag :
: :===================================================
: : Leave empty line below