diff options
| author | WindowsAddict | 2024-08-19 13:50:52 +0000 |
|---|---|---|
| committer | WindowsAddict | 2024-08-19 13:50:52 +0000 |
| commit | af7d204c9627c44e10fed6d85c363e59ccdd8630 (patch) | |
| tree | 12183c0a11a24b5b3bd9cf80a91346288d0929a9 /MAS/Separate-Files-Version/Check_Activation_Status.cmd | |
| parent | 0d26ba046efae62c0002303313cc899ccdfa8f15 (diff) | |
| download | Microsoft-Activation-Scripts-af7d204c9627c44e10fed6d85c363e59ccdd8630.zip | |
Rename file (- to _)
Diffstat (limited to 'MAS/Separate-Files-Version/Check_Activation_Status.cmd')
| -rw-r--r-- | MAS/Separate-Files-Version/Check_Activation_Status.cmd | 1038 |
1 files changed, 1038 insertions, 0 deletions
diff --git a/MAS/Separate-Files-Version/Check_Activation_Status.cmd b/MAS/Separate-Files-Version/Check_Activation_Status.cmd new file mode 100644 index 0000000..a9ba6a4 --- /dev/null +++ b/MAS/Separate-Files-Version/Check_Activation_Status.cmd @@ -0,0 +1,1038 @@ +@echo off
+
+
+:: Check-Activation-Status
+:: Written by @abbodi1406
+:: https://gravesoft.dev/cas
+
+
+:: 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 "_psc=powershell -nop -c"
+set "_err===== ERROR ===="
+set _pwsh=1
+for %%# in (powershell.exe) do @if "%%~$PATH:#"=="" set _pwsh=0
+cmd /c "%_psc% "$ExecutionContext.SessionState.LanguageMode"" | find /i "FullLanguage" 1>nul || (set _pwsh=0)
+if %_pwsh% equ 0 (
+echo %_err%
+cmd /c "%_psc% "$ExecutionContext.SessionState.LanguageMode""
+echo Windows PowerShell is not working correctly.
+echo It is required for this script to work.
+goto :E_Exit
+)
+set "_batf=%~f0"
+set "_batp=%_batf:'=''%"
+setlocal EnableDelayedExpansion
+%_psc% "$f=[IO.File]::ReadAllText('!_batp!') -split ':sppmgr\:.*';iex ($f[1])"
+
+:E_Exit
+echo.
+echo Press 0 key to exit.
+choice /c 0 /n
+exit /b
+
+:sppmgr:
+function ExitScript($ExitCode = 0)
+{
+ Exit $ExitCode
+}
+
+if (-Not $PSVersionTable) {
+ Write-Host "==== ERROR ====`r`n"
+ Write-Host 'Windows PowerShell 1.0 is not supported by this script.'
+ ExitScript 1
+}
+
+if ($ExecutionContext.SessionState.LanguageMode.value__ -NE 0) {
+ Write-Host "==== ERROR ====`r`n"
+ Write-Host 'Windows PowerShell is not running in Full Language Mode.'
+ ExitScript 1
+}
+
+$winbuild = 1
+try {
+ $winbuild = [System.Diagnostics.FileVersionInfo]::GetVersionInfo("$env:SystemRoot\System32\kernel32.dll").FileBuildPart
+} catch {
+ $winbuild = [int](Get-WmiObject Win32_OperatingSystem).BuildNumber
+}
+
+if ($winbuild -EQ 1) {
+ Write-Host "==== ERROR ====`r`n"
+ Write-Host 'Could not detect Windows build.'
+ ExitScript 1
+}
+
+if ($winbuild -LT 2600) {
+ Write-Host "==== ERROR ====`r`n"
+ Write-Host 'This build of Windows is not supported by this script.'
+ ExitScript 1
+}
+
+$NT6 = $winbuild -GE 6000
+$NT7 = $winbuild -GE 7600
+$NT9 = $winbuild -GE 9600
+
+$Admin = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
+
+$line2 = "============================================================"
+$line3 = "____________________________________________________________"
+
+function echoWindows
+{
+ Write-Host "$line2"
+ Write-Host "=== Windows Status ==="
+ Write-Host "$line2"
+ if (!$All.IsPresent) {Write-Host}
+}
+
+function echoOffice
+{
+ if ($doMSG -EQ 0) {
+ return
+ }
+
+ if ($All.IsPresent) {Write-Host}
+ Write-Host "$line2"
+ Write-Host "=== Office Status ==="
+ Write-Host "$line2"
+ if (!$All.IsPresent) {Write-Host}
+
+ $script:doMSG = 0
+}
+
+function strGetRegistry($strKey, $strName)
+{
+Get-ItemProperty -EA 0 $strKey | select -EA 0 -Expand $strName
+}
+
+function CheckOhook
+{
+ $ohook = 0
+ $paths = "${env:ProgramFiles}", "${env:ProgramW6432}", "${env:ProgramFiles(x86)}"
+
+ 15, 16 | foreach `
+ {
+ $A = $_; $paths | foreach `
+ {
+ if (Test-Path "$($_)$('\Microsoft Office\Office')$($A)$('\sppc*dll')") {$ohook = 1}
+ }
+ }
+
+ "System", "SystemX86" | foreach `
+ {
+ $A = $_; "Office 15", "Office" | foreach `
+ {
+ $B = $_; $paths | foreach `
+ {
+ if (Test-Path "$($_)$('\Microsoft ')$($B)$('\root\vfs\')$($A)$('\sppc*dll')") {$ohook = 1}
+ }
+ }
+ }
+
+ if ($ohook -EQ 0) {
+ return
+ }
+
+ if ($All.IsPresent) {Write-Host}
+ Write-Host "$line2"
+ Write-Host "=== Office Ohook Status ==="
+ Write-Host "$line2"
+ Write-Host
+ Write-Host -back 'Black' -fore 'Yellow' 'Ohook for permanent Office activation is installed.'
+ Write-Host -back 'Black' -fore 'Yellow' 'You can ignore the below mentioned Office activation status.'
+ if (!$All.IsPresent) {Write-Host}
+}
+
+#region WMI
+function DetectID($strSLP, $strAppId, [ref]$strAppVar)
+{
+ $fltr = "ApplicationID='$strAppId'"
+ if (!$All.IsPresent) {
+ $fltr = $fltr + " AND PartialProductKey <> NULL"
+ }
+ Get-WmiObject $strSLP ID -Filter $fltr -EA 0 | select ID -EA 0 | foreach {
+ $strAppVar.Value = 1
+ }
+}
+
+function GetID($strSLP, $strAppId, $strProperty = "ID")
+{
+ $NT5 = ($strSLP -EQ $wslp -And $winbuild -LT 6001)
+ $IDs = [Collections.ArrayList]@()
+
+ if ($All.IsPresent) {
+ $fltr = "ApplicationID='$strAppId' AND PartialProductKey IS NULL"
+ $clause = $fltr
+ if (-Not $NT5) {
+ $clause = $fltr + " AND LicenseDependsOn <> NULL"
+ }
+ Get-WmiObject $strSLP $strProperty -Filter $clause -EA 0 | select -Expand $strProperty -EA 0 | foreach {$IDs += $_}
+ if (-Not $NT5) {
+ $clause = $fltr + " AND LicenseDependsOn IS NULL"
+ Get-WmiObject $strSLP $strProperty -Filter $clause -EA 0 | select -Expand $strProperty -EA 0 | foreach {$IDs += $_}
+ }
+ }
+
+ $fltr = "ApplicationID='$strAppId' AND PartialProductKey <> NULL"
+ $clause = $fltr
+ if (-Not $NT5) {
+ $clause = $fltr + " AND LicenseDependsOn <> NULL"
+ }
+ Get-WmiObject $strSLP $strProperty -Filter $clause -EA 0 | select -Expand $strProperty -EA 0 | foreach {$IDs += $_}
+ if (-Not $NT5) {
+ $clause = $fltr + " AND LicenseDependsOn IS NULL"
+ Get-WmiObject $strSLP $strProperty -Filter $clause -EA 0 | select -Expand $strProperty -EA 0 | foreach {$IDs += $_}
+ }
+
+ return $IDs
+}
+
+function DetectSubscription {
+ if ($null -EQ $objSvc.SubscriptionType -Or $objSvc.SubscriptionType -EQ 120) {
+ return
+ }
+
+ if ($objSvc.SubscriptionType -EQ 1) {
+ $SubMsgType = "Device based"
+ } else {
+ $SubMsgType = "User based"
+ }
+
+ if ($objSvc.SubscriptionStatus -EQ 120) {
+ $SubMsgStatus = "Expired"
+ } elseif ($objSvc.SubscriptionStatus -EQ 100) {
+ $SubMsgStatus = "Disabled"
+ } elseif ($objSvc.SubscriptionStatus -EQ 1) {
+ $SubMsgStatus = "Active"
+ } else {
+ $SubMsgStatus = "Not active"
+ }
+
+ $SubMsgExpiry = "Unknown"
+ if ($objSvc.SubscriptionExpiry) {
+ if ($objSvc.SubscriptionExpiry.Contains("unspecified") -EQ $false) {$SubMsgExpiry = $objSvc.SubscriptionExpiry}
+ }
+
+ $SubMsgEdition = "Unknown"
+ if ($objSvc.SubscriptionEdition) {
+ if ($objSvc.SubscriptionEdition.Contains("UNKNOWN") -EQ $false) {$SubMsgEdition = $objSvc.SubscriptionEdition}
+ }
+
+ Write-Host
+ Write-Host "Subscription information:"
+ Write-Host " Edition: $SubMsgEdition"
+ Write-Host " Type : $SubMsgType"
+ Write-Host " Status : $SubMsgStatus"
+ Write-Host " Expiry : $SubMsgExpiry"
+}
+
+function DetectAvmClient
+{
+ Write-Host
+ Write-Host "Automatic VM Activation client information:"
+ if (-Not [String]::IsNullOrEmpty($IAID)) {
+ Write-Host " Guest IAID: $IAID"
+ } else {
+ Write-Host " Guest IAID: Not Available"
+ }
+ if (-Not [String]::IsNullOrEmpty($AutomaticVMActivationHostMachineName)) {
+ Write-Host " Host machine name: $AutomaticVMActivationHostMachineName"
+ } else {
+ Write-Host " Host machine name: Not Available"
+ }
+ if ($AutomaticVMActivationLastActivationTime.Substring(0,4) -NE "1601") {
+ $EED = [DateTime]::Parse([Management.ManagementDateTimeConverter]::ToDateTime($AutomaticVMActivationLastActivationTime),$null,48).ToString('yyyy-MM-dd hh:mm:ss tt')
+ Write-Host " Activation time: $EED UTC"
+ } else {
+ Write-Host " Activation time: Not Available"
+ }
+ if (-Not [String]::IsNullOrEmpty($AutomaticVMActivationHostDigitalPid2)) {
+ Write-Host " Host Digital PID2: $AutomaticVMActivationHostDigitalPid2"
+ } else {
+ Write-Host " Host Digital PID2: Not Available"
+ }
+}
+
+function DetectKmsHost
+{
+ if ($Vista -Or $NT5) {
+ $KeyManagementServiceListeningPort = strGetRegistry $SLKeyPath "KeyManagementServiceListeningPort"
+ $KeyManagementServiceDnsPublishing = strGetRegistry $SLKeyPath "DisableDnsPublishing"
+ $KeyManagementServiceLowPriority = strGetRegistry $SLKeyPath "EnableKmsLowPriority"
+ if (-Not $KeyManagementServiceDnsPublishing) {$KeyManagementServiceDnsPublishing = "TRUE"}
+ if (-Not $KeyManagementServiceLowPriority) {$KeyManagementServiceLowPriority = "FALSE"}
+ } else {
+ $KeyManagementServiceListeningPort = $objSvc.KeyManagementServiceListeningPort
+ $KeyManagementServiceDnsPublishing = $objSvc.KeyManagementServiceDnsPublishing
+ $KeyManagementServiceLowPriority = $objSvc.KeyManagementServiceLowPriority
+ }
+
+ if (-Not $KeyManagementServiceListeningPort) {$KeyManagementServiceListeningPort = 1688}
+ if ($KeyManagementServiceDnsPublishing -EQ "TRUE") {
+ $KeyManagementServiceDnsPublishing = "Enabled"
+ } else {
+ $KeyManagementServiceDnsPublishing = "Disabled"
+ }
+ if ($KeyManagementServiceLowPriority -EQ "TRUE") {
+ $KeyManagementServiceLowPriority = "Low"
+ } else {
+ $KeyManagementServiceLowPriority = "Normal"
+ }
+
+ Write-Host
+ Write-Host "Key Management Service host information:"
+ Write-Host " Current count: $KeyManagementServiceCurrentCount"
+ Write-Host " Listening on Port: $KeyManagementServiceListeningPort"
+ Write-Host " DNS publishing: $KeyManagementServiceDnsPublishing"
+ Write-Host " KMS priority: $KeyManagementServiceLowPriority"
+ if (-Not [String]::IsNullOrEmpty($KeyManagementServiceTotalRequests)) {
+ Write-Host
+ Write-Host "Key Management Service cumulative requests received from clients:"
+ Write-Host " Total: $KeyManagementServiceTotalRequests"
+ Write-Host " Failed: $KeyManagementServiceFailedRequests"
+ Write-Host " Unlicensed: $KeyManagementServiceUnlicensedRequests"
+ Write-Host " Licensed: $KeyManagementServiceLicensedRequests"
+ Write-Host " Initial grace period: $KeyManagementServiceOOBGraceRequests"
+ Write-Host " Expired or Hardware out of tolerance: $KeyManagementServiceOOTGraceRequests"
+ Write-Host " Non-genuine grace period: $KeyManagementServiceNonGenuineGraceRequests"
+ Write-Host " Notification: $KeyManagementServiceNotificationRequests"
+ }
+}
+
+function DetectKmsClient
+{
+ if ($null -NE $VLActivationTypeEnabled) {Write-Host "Configured Activation Type: $($VLActTypes[$VLActivationTypeEnabled])"}
+ Write-Host
+ if ($LicenseStatus -NE 1) {
+ Write-Host "Please activate the product in order to update KMS client information values."
+ return
+ }
+
+ if ($Vista) {
+ $KeyManagementServicePort = strGetRegistry $SLKeyPath "KeyManagementServicePort"
+ $DiscoveredKeyManagementServiceMachineName = strGetRegistry $NSKeyPath "DiscoveredKeyManagementServiceName"
+ $DiscoveredKeyManagementServiceMachinePort = strGetRegistry $NSKeyPath "DiscoveredKeyManagementServicePort"
+ }
+
+ if ([String]::IsNullOrEmpty($KeyManagementServiceMachine)) {
+ $KmsReg = $null
+ } else {
+ if (-Not $KeyManagementServicePort) {$KeyManagementServicePort = 1688}
+ $KmsReg = "Registered KMS machine name: ${KeyManagementServiceMachine}:${KeyManagementServicePort}"
+ }
+
+ if ([String]::IsNullOrEmpty($DiscoveredKeyManagementServiceMachineName)) {
+ $KmsDns = "DNS auto-discovery: KMS name not available"
+ if ($Vista -And -Not $Admin) {$KmsDns = "DNS auto-discovery: Run the script as administrator to retrieve info"}
+ } else {
+ if (-Not $DiscoveredKeyManagementServiceMachinePort) {$DiscoveredKeyManagementServiceMachinePort = 1688}
+ $KmsDns = "KMS machine name from DNS: ${DiscoveredKeyManagementServiceMachineName}:${DiscoveredKeyManagementServiceMachinePort}"
+ }
+
+ if ($null -NE $objSvc.KeyManagementServiceHostCaching) {
+ if ($objSvc.KeyManagementServiceHostCaching -EQ "TRUE") {
+ $KeyManagementServiceHostCaching = "Enabled"
+ } else {
+ $KeyManagementServiceHostCaching = "Disabled"
+ }
+ }
+
+ Write-Host "Key Management Service client information:"
+ Write-Host " Client Machine ID (CMID): $($objSvc.ClientMachineID)"
+ if ($null -EQ $KmsReg) {
+ Write-Host " $KmsDns"
+ Write-Host " Registered KMS machine name: KMS name not available"
+ } else {
+ Write-Host " $KmsReg"
+ }
+ if ($null -NE $DiscoveredKeyManagementServiceMachineIpAddress) {Write-Host " KMS machine IP address: $DiscoveredKeyManagementServiceMachineIpAddress"}
+ Write-Host " KMS machine extended PID: $KeyManagementServiceProductKeyID"
+ Write-Host " Activation interval: $VLActivationInterval minutes"
+ Write-Host " Renewal interval: $VLRenewalInterval minutes"
+ if ($null -NE $KeyManagementServiceHostCaching) {Write-Host " KMS host caching: $KeyManagementServiceHostCaching"}
+ if (-Not [String]::IsNullOrEmpty($KeyManagementServiceLookupDomain)) {Write-Host " KMS SRV record lookup domain: $KeyManagementServiceLookupDomain"}
+}
+
+function GetResult($strSLP, $strSLS, $strID)
+{
+ try {$objPrd = Get-WmiObject $strSLP -Filter "ID='$strID'" -EA 1} catch {return}
+ $objPrd | select -Expand Properties -EA 0 | foreach {
+ if (-Not [String]::IsNullOrEmpty($_.Value)) {set $_.Name $_.Value}
+ }
+
+ $winID = ($ApplicationID -EQ $winApp)
+ $winPR = ($winID -And -Not $LicenseIsAddon)
+ $Vista = ($winID -And $NT6 -And -Not $NT7)
+ $NT5 = ($strSLP -EQ $wslp -And $winbuild -LT 6001)
+
+ if ($Description | Select-String "VOLUME_KMSCLIENT") {$cKmsClient = 1; $_mTag = "Volume"}
+ if ($Description | Select-String "TIMEBASED_") {$cTblClient = 1; $_mTag = "Timebased"}
+ if ($Description | Select-String "VIRTUAL_MACHINE_ACTIVATION") {$cAvmClient = 1; $_mTag = "Automatic VM"}
+ if ($null -EQ $cKmsClient) {
+ if ($Description | Select-String "VOLUME_KMS") {$cKmsHost = 1}
+ }
+
+ $_gpr = [Math]::Round($GracePeriodRemaining/1440)
+ if ($_gpr -GT 0) {
+ $_xpr = [DateTime]::Now.addMinutes($GracePeriodRemaining).ToString('yyyy-MM-dd hh:mm:ss tt')
+ }
+
+ if ($null -EQ $LicenseStatusReason) {$LicenseStatusReason = -1}
+ $LicenseReason = '0x{0:X}' -f $LicenseStatusReason
+ $LicenseMsg = "Time remaining: $GracePeriodRemaining minute(s) ($_gpr day(s))"
+ if ($LicenseStatus -EQ 0) {
+ $LicenseInf = "Unlicensed"
+ $LicenseMsg = $null
+ }
+ if ($LicenseStatus -EQ 1) {
+ $LicenseInf = "Licensed"
+ $LicenseMsg = $null
+ if ($GracePeriodRemaining -EQ 0) {
+ if ($winPR) {$ExpireMsg = "The machine is permanently activated."} else {$ExpireMsg = "The product is permanently activated."}
+ } else {
+ $LicenseMsg = "$_mTag activation expiration: $GracePeriodRemaining minute(s) ($_gpr day(s))"
+ if ($null -NE $_xpr) {$ExpireMsg = "$_mTag activation will expire $_xpr"}
+ }
+ }
+ if ($LicenseStatus -EQ 2) {
+ $LicenseInf = "Initial grace period"
+ if ($null -NE $_xpr) {$ExpireMsg = "Initial grace period ends $_xpr"}
+ }
+ if ($LicenseStatus -EQ 3) {
+ $LicenseInf = "Additional grace period (KMS license expired or hardware out of tolerance)"
+ if ($null -NE $_xpr) {$ExpireMsg = "Additional grace period ends $_xpr"}
+ }
+ if ($LicenseStatus -EQ 4) {
+ $LicenseInf = "Non-genuine grace period"
+ if ($null -NE $_xpr) {$ExpireMsg = "Non-genuine grace period ends $_xpr"}
+ }
+ if ($LicenseStatus -EQ 5 -And -Not $NT5) {
+ $LicenseInf = "Notification"
+ $LicenseMsg = "Notification Reason: $LicenseReason"
+ if ($LicenseReason -EQ "0xC004F200") {$LicenseMsg = $LicenseMsg + " (non-genuine)."}
+ if ($LicenseReason -EQ "0xC004F009") {$LicenseMsg = $LicenseMsg + " (grace time expired)."}
+ }
+ if ($LicenseStatus -GT 5 -Or ($LicenseStatus -GT 4 -And $NT5)) {
+ $LicenseInf = "Unknown"
+ $LicenseMsg = $null
+ }
+ if ($LicenseStatus -EQ 6 -And -Not $Vista -And -Not $NT5) {
+ $LicenseInf = "Extended grace period"
+ if ($null -NE $_xpr) {$ExpireMsg = "Extended grace period ends $_xpr"}
+ }
+
+ if ($winPR -And $PartialProductKey -And -Not $NT9) {
+ $dp4 = Get-ItemProperty -EA 0 "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" | select -EA 0 -Expand DigitalProductId4
+ if ($null -NE $dp4) {
+ $ProductKeyChannel = ([System.Text.Encoding]::Unicode.GetString($dp4, 1016, 128)).Trim([char]$null)
+ }
+ }
+
+ if ($All.IsPresent) {Write-Host}
+ Write-Host "Name: $Name"
+ Write-Host "Description: $Description"
+ Write-Host "Activation ID: $ID"
+ if ($null -NE $ProductKeyID) {Write-Host "Extended PID: $ProductKeyID"}
+ if ($null -NE $OfflineInstallationId -And $IID.IsPresent) {Write-Host "Installation ID: $OfflineInstallationId"}
+ if ($null -NE $ProductKeyChannel) {Write-Host "Product Key Channel: $ProductKeyChannel"}
+ if ($null -NE $PartialProductKey) {Write-Host "Partial Product Key: $PartialProductKey"} else {Write-Host "Product Key: Not installed"}
+ Write-Host "License Status: $LicenseInf"
+ if ($null -NE $LicenseMsg) {Write-Host "$LicenseMsg"}
+ if ($LicenseStatus -NE 0 -And $EvaluationEndDate.Substring(0,4) -NE "1601") {
+ $EED = [DateTime]::Parse([Management.ManagementDateTimeConverter]::ToDateTime($EvaluationEndDate),$null,48).ToString('yyyy-MM-dd hh:mm:ss tt')
+ Write-Host "Evaluation End Date: $EED UTC"
+ }
+
+ if ($winID -And $null -NE $cAvmClient -And $null -NE $PartialProductKey) {
+ DetectAvmClient
+ }
+
+ $chkSub = ($winPR -And $cSub)
+
+ $chkSLS = ($null -NE $PartialProductKey) -And ($null -NE $cKmsClient -Or $null -NE $cKmsHost -Or $chkSub)
+
+ if (!$chkSLS) {
+ if ($null -NE $ExpireMsg) {Write-Host; Write-Host " $ExpireMsg"}
+ return
+ }
+
+ $objSvc = Get-WmiObject $strSLS -EA 0
+
+ if ($Vista) {
+ $objSvc | select -Expand Properties -EA 0 | foreach {
+ if (-Not [String]::IsNullOrEmpty($_.Value)) {set $_.Name $_.Value}
+ }
+ }
+
+ if ($strSLS -EQ $wsls -And $NT9) {
+ if ([String]::IsNullOrEmpty($DiscoveredKeyManagementServiceMachineIpAddress)) {
+ $DiscoveredKeyManagementServiceMachineIpAddress = "not available"
+ }
+ }
+
+ if ($null -NE $cKmsHost -And $IsKeyManagementServiceMachine -GT 0) {
+ DetectKmsHost
+ }
+
+ if ($null -NE $cKmsClient) {
+ DetectKmsClient
+ }
+
+ if ($null -NE $ExpireMsg) {Write-Host; Write-Host " $ExpireMsg"}
+
+ if ($chkSub) {
+ DetectSubscription
+ }
+
+}
+#endregion
+
+#region vNextDiag
+if ($PSVersionTable.PSVersion.Major -Lt 3)
+{
+ function ConvertFrom-Json
+ {
+ [CmdletBinding()]
+ Param(
+ [Parameter(ValueFromPipeline=$true)][Object]$item
+ )
+ [void][System.Reflection.Assembly]::LoadWithPartialName("System.Web.Extensions")
+ $psjs = New-Object System.Web.Script.Serialization.JavaScriptSerializer
+ Return ,$psjs.DeserializeObject($item)
+ }
+ function ConvertTo-Json
+ {
+ [CmdletBinding()]
+ Param(
+ [Parameter(ValueFromPipeline=$true)][Object]$item
+ )
+ [void][System.Reflection.Assembly]::LoadWithPartialName("System.Web.Extensions")
+ $psjs = New-Object System.Web.Script.Serialization.JavaScriptSerializer
+ Return $psjs.Serialize($item)
+ }
+}
+
+function PrintModePerPridFromRegistry
+{
+ $vNextRegkey = "HKCU:\SOFTWARE\Microsoft\Office\16.0\Common\Licensing\LicensingNext"
+ $vNextPrids = Get-Item -Path $vNextRegkey -ErrorAction SilentlyContinue | Select-Object -ExpandProperty 'property' -ErrorAction SilentlyContinue | Where-Object -FilterScript {$_.ToLower() -like "*retail" -or $_.ToLower() -like "*volume"}
+ If ($null -Eq $vNextPrids)
+ {
+ Write-Host
+ Write-Host "No registry keys found."
+ Return
+ }
+ Write-Host
+ $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 SilentlyContinue | Select-Object -ExpandProperty "SharedComputerLicensing" -ErrorAction SilentlyContinue
+ $scaRegKey2 = "HKLM:\SOFTWARE\Microsoft\Office\16.0\Common\Licensing"
+ $scaValue2 = Get-ItemProperty -Path $scaRegKey2 -ErrorAction SilentlyContinue | Select-Object -ExpandProperty "SharedComputerLicensing" -ErrorAction SilentlyContinue
+ $scaPolicyKey = "HKLM:\SOFTWARE\Policies\Microsoft\Office\16.0\Common\Licensing"
+ $scaPolicyValue = Get-ItemProperty -Path $scaPolicyKey -ErrorAction SilentlyContinue | Select-Object -ExpandProperty "SharedComputerLicensing" -ErrorAction SilentlyContinue
+ If ($null -Eq $scaValue -And $null -Eq $scaValue2 -And $null -Eq $scaPolicyValue)
+ {
+ Write-Host
+ Write-Host "No registry keys found."
+ Return
+ }
+ $scaModeValue = $scaValue -Or $scaValue2 -Or $scaPolicyValue
+ If ($scaModeValue -Eq 0)
+ {
+ $scaMode = "Disabled"
+ }
+ If ($scaModeValue -Eq 1)
+ {
+ $scaMode = "Enabled"
+ }
+ Write-Host
+ Write-Host "Status:" $scaMode
+ Write-Host
+ $tokenFiles = $null
+ $tokenPath = "${env:LOCALAPPDATA}\Microsoft\Office\16.0\Licensing"
+ If (Test-Path $tokenPath)
+ {
+ $tokenFiles = Get-ChildItem -Path $tokenPath -Filter "*authString*" -Recurse | Where-Object { !$_.PSIsContainer }
+ }
+ If ($null -Eq $tokenFiles)
+ {
+ Write-Host "No tokens found."
+ Return
+ }
+ If ($tokenFiles.Length -Eq 0)
+ {
+ Write-Host "No tokens found."
+ Return
+ }
+ $tokenFiles | ForEach `
+ {
+ $tokenParts = (Get-Content -Encoding Unicode -Path $_.FullName).Split('_')
+ $output = New-Object PSObject
+ $output | Add-Member 8 'ACID' $tokenParts[0];
+ $output | Add-Member 8 'User' $tokenParts[3];
+ $output | Add-Member 8 'NotBefore' $tokenParts[4];
+ $output | Add-Member 8 'NotAfter' $tokenParts[5];
+ Write-Output $output
+ }
+}
+
+function PrintLicensesInformation
+{
+ Param(
+ [ValidateSet("NUL", "Device")]
+ [String]$mode
+ )
+ If ($mode -Eq "NUL")
+ {
+ $licensePath = "${env:LOCALAPPDATA}\Microsoft\Office\Licenses"
+ }
+ ElseIf ($mode -Eq "Device")
+ {
+ $licensePath = "${env:PROGRAMDATA}\Microsoft\Office\Licenses"
+ }
+ $licenseFiles = $null
+ If (Test-Path $licensePath)
+ {
+ $licenseFiles = Get-ChildItem -Path $licensePath -Recurse | Where-Object { !$_.PSIsContainer }
+ }
+ If ($null -Eq $licenseFiles)
+ {
+ Write-Host
+ Write-Host "No licenses found."
+ Return
+ }
+ If ($licenseFiles.Length -Eq 0)
+ {
+ Write-Host
+ 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 -Ne $decodedLicense.ExpiresOn)
+ {
+ $expiry = [System.DateTime]::Parse($decodedLicense.ExpiresOn, $null, 'AdjustToUniversal')
+ }
+ Else
+ {
+ $expiry = New-Object System.DateTime
+ }
+ $licenseState = "Grace"
+ If ((Get-Date) -Gt (Get-Date $decodedLicense.Metadata.NotAfter))
+ {
+ $licenseState = "RFM"
+ }
+ ElseIf ((Get-Date) -Lt (Get-Date $expiry))
+ {
+ $licenseState = "Licensed"
+ }
+ $output = New-Object PSObject
+ $output | Add-Member 8 'File' $_.PSChildName;
+ $output | Add-Member 8 'Version' $_.Directory.Name;
+ $output | Add-Member 8 'Type' "User|${licenseType}";
+ $output | Add-Member 8 'Product' $decodedLicense.ProductReleaseId;
+ $output | Add-Member 8 'Acid' $decodedLicense.Acid;
+ If ($mode -Eq "Device") { $output | Add-Member 8 'DeviceId' $decodedLicense.Metadata.DeviceId; }
+ $output | Add-Member 8 'LicenseState' $licenseState;
+ $output | Add-Member 8 'EntitlementStatus' $decodedLicense.Status;
+ $output | Add-Member 8 'EntitlementExpiration' ("N/A", $decodedLicense.ExpiresOn)[!($null -eq $decodedLicense.ExpiresOn)];
+ $output | Add-Member 8 'ReasonCode' ("N/A", $decodedLicense.ReasonCode)[!($null -eq $decodedLicense.ReasonCode)];
+ $output | Add-Member 8 'NotBefore' $decodedLicense.Metadata.NotBefore;
+ $output | Add-Member 8 'NotAfter' $decodedLicense.Metadata.NotAfter;
+ $output | Add-Member 8 'NextRenewal' $decodedLicense.Metadata.RenewAfter;
+ $output | Add-Member 8 'TenantId' ("N/A", $decodedLicense.Metadata.TenantId)[!($null -eq $decodedLicense.Metadata.TenantId)];
+ #$output.PSObject.Properties | foreach { $ht = @{} } { $ht[$_.Name] = $_.Value } { $output = $ht | ConvertTo-Json }
+ Write-Output $output
+ }
+}
+
+function vNextDiagRun
+{
+ $fNUL = ([IO.Directory]::Exists("${env:LOCALAPPDATA}\Microsoft\Office\Licenses")) -and ([IO.Directory]::GetFiles("${env:LOCALAPPDATA}\Microsoft\Office\Licenses", "*", 1).Length -GE 0)
+ $fDev = ([IO.Directory]::Exists("${env:PROGRAMDATA}\Microsoft\Office\Licenses")) -and ([IO.Directory]::GetFiles("${env:PROGRAMDATA}\Microsoft\Office\Licenses", "*", 1).Length -GE 0)
+ $rPID = $null -NE (GP "HKCU:\SOFTWARE\Microsoft\Office\16.0\Common\Licensing\LicensingNext" -EA 0 | select -Expand 'property' -EA 0 | where -Filter {$_.ToLower() -like "*retail" -or $_.ToLower() -like "*volume"})
+ $rSCA = $null -NE (GP "HKLM:\SOFTWARE\Microsoft\Office\ClickToRun\Configuration" -EA 0 | select -Expand "SharedComputerLicensing" -EA 0)
+ $rSCL = $null -NE (GP "HKLM:\SOFTWARE\Microsoft\Office\16.0\Common\Licensing" -EA 0 | select -Expand "SharedComputerLicensing" -EA 0)
+
+ if (($fNUL -Or $fDev -Or $rPID -Or $rSCA -Or $rSCL) -EQ $false) {
+ Return
+ }
+
+ if ($All.IsPresent) {Write-Host}
+ Write-Host "$line2"
+ Write-Host "=== Office vNext Status ==="
+ Write-Host "$line2"
+ Write-Host
+ Write-Host "========== Mode per ProductReleaseId =========="
+ PrintModePerPridFromRegistry
+ Write-Host
+ Write-Host "========== Shared Computer Licensing =========="
+ PrintSharedComputerLicensing
+ Write-Host
+ Write-Host "========== vNext licenses ==========="
+ PrintLicensesInformation -Mode "NUL"
+ Write-Host
+ Write-Host "========== Device licenses =========="
+ PrintLicensesInformation -Mode "Device"
+ Write-Host "$line3"
+ Write-Host
+}
+#endregion
+
+#region clic
+
+<#
+;;; Source: https://github.com/asdcorp/clic
+;;; Powershell port: abbodi1406
+
+Copyright 2023 asdcorp
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#>
+
+function BoolToWStr($bVal) {
+ ("TRUE", "FALSE")[!$bVal]
+}
+
+function InitializePInvoke {
+ $Marshal = [System.Runtime.InteropServices.Marshal]
+ $Module = [AppDomain]::CurrentDomain.DefineDynamicAssembly((Get-Random), 'Run').DefineDynamicModule((Get-Random))
+
+ $Class = $Module.DefineType('NativeMethods', 'Public, Abstract, Sealed, BeforeFieldInit', [Object], 0)
+ $Class.DefinePInvokeMethod('SLIsWindowsGenuineLocal', 'slc.dll', 'Public, Static', 'Standard', [Int32], @([UInt32].MakeByRefType()), 'Winapi', 'Unicode').SetImplementationFlags('PreserveSig')
+ $Class.DefinePInvokeMethod('SLGetWindowsInformationDWORD', 'slc.dll', 22, 1, [Int32], @([String], [UInt32].MakeByRefType()), 1, 3).SetImplementationFlags(128)
+ $Class.DefinePInvokeMethod('SLGetWindowsInformation', 'slc.dll', 22, 1, [Int32], @([String], [UInt32].MakeByRefType(), [UInt32].MakeByRefType(), [IntPtr].MakeByRefType()), 1, 3).SetImplementationFlags(128)
+
+ if ($DllSubscription) {
+ $Class.DefinePInvokeMethod('ClipGetSubscriptionStatus', 'Clipc.dll', 22, 1, [Int32], @([IntPtr].MakeByRefType()), 1, 3).SetImplementationFlags(128)
+ $Struct = $Class.DefineNestedType('SubStatus', 'NestedPublic, SequentialLayout, Sealed, BeforeFieldInit', [ValueType], 0)
+ [void]$Struct.DefineField('dwEnabled', [UInt32], 'Public')
+ [void]$Struct.DefineField('dwSku', [UInt32], 6)
+ [void]$Struct.DefineField('dwState', [UInt32], 6)
+ $SubStatus = $Struct.CreateType()
+ }
+
+ $Win32 = $Class.CreateType()
+}
+
+function InitializeDigitalLicenseCheck {
+ $CAB = [System.Reflection.Emit.CustomAttributeBuilder]
+
+ $ICom = $Module.DefineType('EUM.IEUM', 'Public, Interface, Abstract, Import')
+ $ICom.SetCustomAttribute($CAB::new([System.Runtime.InteropServices.ComImportAttribute].GetConstructor(@()), @()))
+ $ICom.SetCustomAttribute($CAB::new([System.Runtime.InteropServices.GuidAttribute].GetConstructor(@([String])), @('F2DCB80D-0670-44BC-9002-CD18688730AF')))
+ $ICom.SetCustomAttribute($CAB::new([System.Runtime.InteropServices.InterfaceTypeAttribute].GetConstructor(@([Int16])), @([Int16]1)))
+
+ 1..4 | % { [void]$ICom.DefineMethod('VF'+$_, 'Public, Virtual, HideBySig, NewSlot, Abstract', 'Standard, HasThis', [Void], @()) }
+ [void]$ICom.DefineMethod('AcquireModernLicenseForWindows', 1478, 33, [Int32], @([Int32], [Int32].MakeByRefType()))
+
+ $IEUM = $ICom.CreateType()
+}
+
+function PrintStateData {
+ $pwszStateData = 0
+ $cbSize = 0
+
+ if ($Win32::SLGetWindowsInformation(
+ "Security-SPP-Action-StateData",
+ [ref]$null,
+ [ref]$cbSize,
+ [ref]$pwszStateData
+ )) {
+ return $FALSE
+ }
+
+ [string[]]$pwszStateString = $Marshal::PtrToStringUni($pwszStateData) -replace ";", "`n "
+ Write-Host " $pwszStateString"
+
+ $Marshal::FreeHGlobal($pwszStateData)
+ return $TRUE
+}
+
+function PrintLastActivationHRresult {
+ $pdwLastHResult = 0
+ $cbSize = 0
+
+ if ($Win32::SLGetWindowsInformation(
+ "Security-SPP-LastWindowsActivationHResult",
+ [ref]$null,
+ [ref]$cbSize,
+ [ref]$pdwLastHResult
+ )) {
+ return $FALSE
+ }
+
+ Write-Host (" LastActivationHResult=0x{0:x8}" -f $Marshal::ReadInt32($pdwLastHResult))
+
+ $Marshal::FreeHGlobal($pdwLastHResult)
+ return $TRUE
+}
+
+function PrintIsWindowsGenuine {
+ $dwGenuine = 0
+ $ppwszGenuineStates = @(
+ "SL_GEN_STATE_IS_GENUINE",
+ "SL_GEN_STATE_INVALID_LICENSE",
+ "SL_GEN_STATE_TAMPERED",
+ "SL_GEN_STATE_OFFLINE",
+ "SL_GEN_STATE_LAST"
+ )
+
+ if ($Win32::SLIsWindowsGenuineLocal([ref]$dwGenuine)) {
+ return $FALSE
+ }
+
+ if ($dwGenuine -lt 5) {
+ Write-Host (" IsWindowsGenuine={0}" -f $ppwszGenuineStates[$dwGenuine])
+ } else {
+ Write-Host (" IsWindowsGenuine={0}" -f $dwGenuine)
+ }
+
+ return $TRUE
+}
+
+function PrintDigitalLicenseStatus {
+ try {
+ . InitializeDigitalLicenseCheck
+ $ComObj = New-Object -Com EditionUpgradeManagerObj.EditionUpgradeManager
+ } catch {
+ return $FALSE
+ }
+
+ $parameters = 1, $null
+
+ if ([EUM.IEUM].GetMethod("AcquireModernLicenseForWindows").Invoke($ComObj, $parameters)) {
+ return $FALSE
+ }
+
+ $dwReturnCode = $parameters[1]
+ [bool]$bDigitalLicense = $FALSE
+
+ $bDigitalLicense = (($dwReturnCode -ge 0) -and ($dwReturnCode -ne 1))
+ Write-Host (" IsDigitalLicense={0}" -f (BoolToWStr $bDigitalLicense))
+
+ return $TRUE
+}
+
+function PrintSubscriptionStatus {
+ $dwSupported = 0
+
+ if ($winbuild -ge 15063) {
+ $pwszPolicy = "ConsumeAddonPolicySet"
+ } else {
+ $pwszPolicy = "Allow-WindowsSubscription"
+ }
+
+ if ($Win32::SLGetWindowsInformationDWORD($pwszPolicy, [ref]$dwSupported)) {
+ return $FALSE
+ }
+
+ Write-Host (" SubscriptionSupportedEdition={0}" -f (BoolToWStr $dwSupported))
+
+ $pStatus = $Marshal::AllocHGlobal($Marshal::SizeOf([Type]$SubStatus))
+ if ($Win32::ClipGetSubscriptionStatus([ref]$pStatus)) {
+ return $FALSE
+ }
+
+ $sStatus = [Activator]::CreateInstance($SubStatus)
+ $sStatus = $Marshal::PtrToStructure($pStatus, [Type]$SubStatus)
+ $Marshal::FreeHGlobal($pStatus)
+
+ Write-Host (" SubscriptionEnabled={0}" -f (BoolToWStr $sStatus.dwEnabled))
+
+ if ($sStatus.dwEnabled -eq 0) {
+ return $TRUE
+ }
+
+ Write-Host (" SubscriptionSku={0}" -f $sStatus.dwSku)
+ Write-Host (" SubscriptionState={0}" -f $sStatus.dwState)
+
+ return $TRUE
+}
+
+function ClicRun
+{
+ if ($All.IsPresent) {Write-Host}
+ Write-Host "Client Licensing Check information:"
+
+ $null = PrintStateData
+ $null = PrintLastActivationHRresult
+ $null = PrintIsWindowsGenuine
+
+ if ($DllDigital) {
+ $null = PrintDigitalLicenseStatus
+ }
+
+ if ($DllSubscription) {
+ $null = PrintSubscriptionStatus
+ }
+
+ Write-Host "$line3"
+ if (!$All.IsPresent) {Write-Host}
+}
+#endregion
+
+$Host.UI.RawUI.WindowTitle = "Check Activation Status"
+
+if ($All.IsPresent) {
+ $B=$Host.UI.RawUI.BufferSize;$B.Height=3000;$Host.UI.RawUI.BufferSize=$B;clear;
+}
+
+$SysPath = "$env:SystemRoot\System32"
+if (Test-Path "$env:SystemRoot\Sysnative\reg.exe") {
+ $SysPath = "$env:SystemRoot\Sysnative"
+}
+
+$wslp = "SoftwareLicensingProduct"
+$wsls = "SoftwareLicensingService"
+$oslp = "OfficeSoftwareProtectionProduct"
+$osls = "OfficeSoftwareProtectionService"
+$winApp = "55c92734-d682-4d71-983e-d6ec3f16059f"
+$o14App = "59a52881-a989-479d-af46-f275c6370663"
+$o15App = "0ff1ce15-a989-479d-af46-f275c6370663"
+$cSub = ($winbuild -GE 19041) -And (Select-String -Path "$SysPath\wbem\sppwmi.mof" -Encoding unicode -Pattern "SubscriptionType")
+$DllDigital = ($winbuild -GE 14393) -And (Test-Path "$SysPath\EditionUpgradeManagerObj.dll")
+$DllSubscription = ($winbuild -GE 14393) -And (Test-Path "$SysPath\Clipc.dll")
+$VLActTypes = @("All", "AD", "KMS", "Token")
+$SLKeyPath = "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SL"
+$NSKeyPath = "Registry::HKEY_USERS\S-1-5-20\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SL"
+
+'cW1nd0ws', 'c0ff1ce15', 'c0ff1ce14', 'ospp14', 'ospp15' | foreach {set $_ $null}
+
+$OsppHook = 1
+try {gsv osppsvc -EA 1 | Out-Null} catch {$OsppHook = 0}
+
+if ($NT7 -Or -Not $NT6) {
+ try {sasv sppsvc -EA 1} catch {}
+}
+else
+{
+ try {sasv slsvc -EA 1} catch {}
+}
+
+DetectID $wslp $winApp ([ref]$cW1nd0ws)
+DetectID $wslp $o15App ([ref]$c0ff1ce15)
+DetectID $wslp $o14App ([ref]$c0ff1ce14)
+
+if ($OsppHook -NE 0) {
+ try {sasv osppsvc -EA 1} catch {}
+ DetectID $oslp $o15App ([ref]$ospp15)
+ DetectID $oslp $o14App ([ref]$ospp14)
+}
+
+if ($null -NE $cW1nd0ws)
+{
+ echoWindows
+ GetID $wslp $winApp | foreach -EA 1 {
+ GetResult $wslp $wsls $_
+ Write-Host "$line3"
+ if (!$All.IsPresent) {Write-Host}
+ }
+}
+elseif ($NT6)
+{
+ echoWindows
+ Write-Host
+ Write-Host "Error: product key not found."
+}
+
+if ($winbuild -GE 9200) {
+ . InitializePInvoke
+ ClicRun
+}
+
+if ($c0ff1ce15 -Or $ospp15) {
+ CheckOhook
+}
+
+$doMSG = 1
+
+if ($null -NE $c0ff1ce15) {
+ echoOffice
+ GetID $wslp $o15App | foreach -EA 1 {
+ GetResult $wslp $wsls $_
+ Write-Host "$line3"
+ if (!$All.IsPresent) {Write-Host}
+ }
+}
+
+if ($null -NE $c0ff1ce14) {
+ echoOffice
+ GetID $wslp $o14App | foreach -EA 1 {
+ GetResult $wslp $wsls $_
+ Write-Host "$line3"
+ if (!$All.IsPresent) {Write-Host}
+ }
+}
+
+if ($null -NE $ospp15) {
+ echoOffice
+ GetID $oslp $o15App | foreach -EA 1 {
+ GetResult $oslp $osls $_
+ Write-Host "$line3"
+ if (!$All.IsPresent) {Write-Host}
+ }
+}
+
+if ($null -NE $ospp14) {
+ echoOffice
+ GetID $oslp $o14App | foreach -EA 1 {
+ GetResult $oslp $osls $_
+ Write-Host "$line3"
+ if (!$All.IsPresent) {Write-Host}
+ }
+}
+
+if ($NT7) {
+ vNextDiagRun
+}
+
+ExitScript 0
+:sppmgr:
|
