# PCS Toolkit - Office License Checker # Detects Microsoft Office installation and license status $timestamp = Get-Date -Format "yyyy-MM-dd_HH-mm-ss" $outputFile = "$env:USERPROFILE\Desktop\OfficeLicense_$timestamp.txt" function Log($msg) { Write-Host $msg Add-Content $outputFile $msg } Log "========================================" Log " PCS Toolkit - Office License Check" Log "========================================" Log "Generated: $(Get-Date)" Log "Computer: $env:COMPUTERNAME" Log "" # Check for Office installations Log "=== OFFICE INSTALLATION ===" $officeFound = $false # Check registry for Office version $officeVersions = @( @{Key="HKLM:\SOFTWARE\Microsoft\Office\16.0\Common\InstallRoot"; Name="Office 2016/2019/365"}, @{Key="HKLM:\SOFTWARE\Microsoft\Office\15.0\Common\InstallRoot"; Name="Office 2013"}, @{Key="HKLM:\SOFTWARE\Microsoft\Office\14.0\Common\InstallRoot"; Name="Office 2010"}, @{Key="HKLM:\SOFTWARE\WOW6432Node\Microsoft\Office\16.0\Common\InstallRoot"; Name="Office 2016/2019/365 (32-bit)"}, @{Key="HKLM:\SOFTWARE\WOW6432Node\Microsoft\Office\15.0\Common\InstallRoot"; Name="Office 2013 (32-bit)"} ) foreach ($ver in $officeVersions) { if (Test-Path $ver.Key) { $path = (Get-ItemProperty $ver.Key -EA SilentlyContinue).Path if ($path) { Log "Found: $($ver.Name)" Log " Path: $path" $officeFound = $true } } } # Check for Microsoft 365 Apps $m365 = Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Office\ClickToRun\Configuration" -EA SilentlyContinue if ($m365) { Log "" Log "Microsoft 365 / Click-to-Run detected:" Log " Version: $($m365.VersionToReport)" Log " Channel: $($m365.CDNBaseUrl -replace '.*/', '')" Log " Platform: $($m365.Platform)" Log " Product IDs: $($m365.ProductReleaseIds)" $officeFound = $true } if (-not $officeFound) { Log "No Microsoft Office installation detected" Log "" Log "========================================" Log "CHECK COMPLETE - No Office Found" Log "========================================" explorer.exe "/select,$outputFile" Read-Host "Press Enter to exit" exit } Log "" Log "=== LICENSE STATUS ===" # Try ospp.vbs for traditional licensing $osppPaths = @( "C:\Program Files\Microsoft Office\Office16\ospp.vbs", "C:\Program Files\Microsoft Office\Office15\ospp.vbs", "C:\Program Files (x86)\Microsoft Office\Office16\ospp.vbs", "C:\Program Files (x86)\Microsoft Office\Office15\ospp.vbs" ) $osppFound = $false foreach ($ospp in $osppPaths) { if (Test-Path $ospp) { Log "Using: $ospp" Log "" $result = cscript //nologo $ospp /dstatus 2>&1 $result | ForEach-Object { Log $_ } $osppFound = $true break } } if (-not $osppFound) { # Check for Microsoft 365 subscription - with timeout Log "Checking WMI for license info (this may take a moment)..." $job = Start-Job -ScriptBlock { Get-CimInstance -ClassName SoftwareLicensingProduct -Filter "Name like 'Office%'" -EA SilentlyContinue | Where-Object { $_.PartialProductKey } | Select-Object Name, LicenseStatus, PartialProductKey } $completed = Wait-Job $job -Timeout 15 if ($completed) { $licenses = Receive-Job $job Remove-Job $job -Force if ($licenses) { foreach ($lic in $licenses) { Log "Product: $($lic.Name)" Log " License Status: $(switch($lic.LicenseStatus) { 0 {'Unlicensed'} 1 {'Licensed'} 2 {'OOBGrace'} 3 {'OOTGrace'} 4 {'NonGenuineGrace'} 5 {'Notification'} 6 {'ExtendedGrace'} default {'Unknown'} })" Log " Partial Key: XXXXX-$($lic.PartialProductKey)" Log "" } } else { Log "No traditional license found" Log "Office is likely using Microsoft 365 subscription licensing" Log "(Sign in status managed by Microsoft account)" } } else { Stop-Job $job Remove-Job $job -Force Log "WMI license query timed out" Log "Office is likely using Microsoft 365 subscription licensing" Log "(Sign in status managed by Microsoft account)" } } Log "" Log "========================================" Log "CHECK COMPLETE" Log "========================================" explorer.exe "/select,$outputFile" Read-Host "Press Enter to exit"