From af7d204c9627c44e10fed6d85c363e59ccdd8630 Mon Sep 17 00:00:00 2001 From: WindowsAddict Date: Mon, 19 Aug 2024 19:20:52 +0530 Subject: Rename file (- to _) --- .../Check-Activation-Status.cmd | 1038 -------------------- .../Check_Activation_Status.cmd | 1038 ++++++++++++++++++++ 2 files changed, 1038 insertions(+), 1038 deletions(-) delete mode 100644 MAS/Separate-Files-Version/Check-Activation-Status.cmd create mode 100644 MAS/Separate-Files-Version/Check_Activation_Status.cmd (limited to 'MAS/Separate-Files-Version') diff --git a/MAS/Separate-Files-Version/Check-Activation-Status.cmd b/MAS/Separate-Files-Version/Check-Activation-Status.cmd deleted file mode 100644 index a9ba6a4..0000000 --- a/MAS/Separate-Files-Version/Check-Activation-Status.cmd +++ /dev/null @@ -1,1038 +0,0 @@ -@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: 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: -- cgit v1.2.3