Private/Invoke-OfflineActivation.ps1
|
function Invoke-OfflineActivation { [CmdletBinding()] param ( [Microsoft.Management.Infrastructure.CimSession]$CimSession, [string]$ConfirmationId, [CimInstance]$Service, [Guid]$ActivationId ) $targetParams = @{ CimSession = $CimSession } if ($PSBoundParameters.ContainsKey('ActivationId')) { $targetParams['ActivationId'] = $ActivationId } $licenseInfo = Get-LicenseStatus @targetParams Write-Verbose "License Status: $($licenseInfo.LicenseStatus)" if ($licenseInfo.Activated) { Write-Warning 'The product is already activated.' return [PSCustomObject]@{ ActivationId = $licenseInfo.ActivationId ProductName = $licenseInfo.ProductName VerificationState = 'Verified' RestartRequired = $false } } $product = Get-WindowsLicensingProduct @targetParams $normalizedCid = $ConfirmationId -replace '[\s\-]', '' $installationId = (Get-OfflineInstallationId -CimSession $CimSession -Product $product).OfflineInstallationId Write-Verbose 'Submitting activation and confirmation IDs...' Write-Debug "Offline Installation ID: $installationId" $product | Invoke-SppCimMethod -MethodName DepositOfflineConfirmationId -Arguments @{ InstallationId = $installationId ConfirmationId = $normalizedCid } Write-Verbose 'Updating the license status...' $Service | Invoke-SppCimMethod -MethodName RefreshLicenseStatus $finalLicenseInfo = Get-LicenseStatus @targetParams if ($finalLicenseInfo.LicenseStatus -eq [LicenseStatusCode]::Licensed) { Write-Verbose 'Offline activation completed successfully.' } elseif ($finalLicenseInfo.LicenseStatus -eq [LicenseStatusCode]::ExtendedGrace) { Write-Warning 'Offline activation completed, but Windows remains in extended grace.' } else { throw "Offline activation failed. Current status: $($finalLicenseInfo.LicenseStatus)" } $outcomeActivationId = if ($null -ne $finalLicenseInfo.ActivationId) { $finalLicenseInfo.ActivationId } else { $product.ID } $outcomeProductName = if (-not [string]::IsNullOrEmpty($finalLicenseInfo.ProductName)) { $finalLicenseInfo.ProductName } else { $product.Name } return [PSCustomObject]@{ ActivationId = $outcomeActivationId ProductName = $outcomeProductName VerificationState = 'Verified' RestartRequired = $false } } |