Private/Get-WindowsLicensingProduct.ps1
|
function Get-WindowsLicensingProduct { [OutputType([CimInstance])] [CmdletBinding(DefaultParameterSetName = 'DefaultMutation')] param( [Microsoft.Management.Infrastructure.CimSession]$CimSession, [Parameter(Mandatory, ParameterSetName = 'DefaultRead')] [switch]$ForRead, [Parameter(Mandatory, ParameterSetName = 'ByActivationId')] [Guid]$ActivationId, [Parameter(Mandatory, ParameterSetName = 'All')] [switch]$All, [Parameter(Mandatory, ParameterSetName = 'ByPartialProductKey')] [ValidatePattern('^[A-Za-z0-9]{5}$')] [string]$PartialProductKey, [Parameter(ParameterSetName = 'ByActivationId')] [switch]$RequireProductKey ) $properties = @( 'Name', 'Description', 'ID', 'ApplicationID', 'LicenseIsAddon', 'ProductKeyID', 'ProductKeyChannel', 'OfflineInstallationId', 'UseLicenseURL', 'ValidationURL', 'PartialProductKey', 'LicenseStatus', 'LicenseStatusReason', 'GracePeriodRemaining', 'EvaluationEndDate', 'RemainingAppReArmCount', 'RemainingSkuReArmCount', 'TrustedTime', 'VLActivationInterval', 'VLRenewalInterval', 'VLActivationType', 'VLActivationTypeEnabled', 'TokenActivationILID', 'TokenActivationILVID', 'TokenActivationGrantNumber', 'TokenActivationCertificateThumbprint', 'TokenActivationAdditionalInfo', 'KeyManagementServiceMachine', 'KeyManagementServicePort', 'DiscoveredKeyManagementServiceMachineName', 'DiscoveredKeyManagementServiceMachinePort', 'KeyManagementServiceLookupDomain' ) $query = "SELECT $($properties -join ', ') FROM SoftwareLicensingProduct" $windowsApplicationId = '55c92734-d682-4d71-983e-d6ec3f16059f' $whereClauses = switch ($PSCmdlet.ParameterSetName) { 'ByActivationId' { $clauses = @("ID = '$($ActivationId.ToString())'") if ($RequireProductKey.IsPresent) { $clauses += 'PartialProductKey IS NOT NULL' } $clauses } 'All' { @() } 'ByPartialProductKey' { @( "ApplicationID = '$windowsApplicationId'" "PartialProductKey = '$($PartialProductKey.ToUpperInvariant())'" 'LicenseIsAddon = FALSE' ) } 'DefaultRead' { @( "ApplicationID = '$windowsApplicationId'" 'PartialProductKey IS NOT NULL' ) } default { @( "ApplicationID = '$windowsApplicationId'" 'PartialProductKey IS NOT NULL' 'LicenseIsAddon = FALSE' ) } } if ($whereClauses.Count -gt 0) { $query += " WHERE $($whereClauses -join ' AND ')" } $candidates = @(Get-CimInstance -CimSession $CimSession -Query $query -ErrorAction Stop) if ($PSCmdlet.ParameterSetName -eq 'All') { return $candidates | Sort-Object ApplicationID, Name, ID } if ($PSCmdlet.ParameterSetName -eq 'ByActivationId') { if ($candidates.Count -eq 0) { throw "Licensing product with activation ID $ActivationId was not found." } if ($candidates.Count -ne 1) { throw "Multiple licensing products returned for activation ID $ActivationId." } return $candidates[0] } if ($PSCmdlet.ParameterSetName -eq 'ByPartialProductKey') { if ($candidates.Count -eq 0) { throw "Windows licensing product with partial product key $PartialProductKey was not found after installation." } if ($candidates.Count -ne 1) { throw "Multiple Windows licensing products have partial product key $PartialProductKey; activation cannot continue safely." } return $candidates[0] } $baseCandidates = @($candidates | Where-Object { $_.LicenseIsAddon -ne $true }) if ($baseCandidates.Count -eq 0) { throw 'No Windows licensing product with an installed product key was found. The system may be running an evaluation edition or have no key installed.' } if ($baseCandidates.Count -eq 1) { $selectedProduct = $baseCandidates[0] } else { # Multiple products can appear after in-place upgrades. Prefer Licensed, then any active state. $licensed = @($baseCandidates | Where-Object { $_.LicenseStatus -eq 1 }) if ($licensed.Count -eq 1) { $selectedProduct = $licensed[0] } else { $active = @($baseCandidates | Where-Object { $_.LicenseStatus -ne 0 }) if ($active.Count -eq 1) { $selectedProduct = $active[0] } } } if ($null -eq $selectedProduct) { $summary = ($baseCandidates | ForEach-Object { $id = if ($null -eq $_.ID) { '<unknown>' } else { $_.ID } "'$($_.Name)' ($id, status $($_.LicenseStatus))" }) -join ', ' throw "Multiple Windows licensing products found and none can be selected unambiguously: $summary. Remove duplicate product registrations or specify an activation ID." } if ($PSCmdlet.ParameterSetName -eq 'DefaultRead') { $addOns = @($candidates | Where-Object { $_.LicenseIsAddon -eq $true }) return (@($selectedProduct) + $addOns) | Sort-Object ApplicationID, Name, ID } return $selectedProduct } |