Tempo fa avevo installato un server TFS 2010 di prova prendendo la versione di valutazione basata su un'immagine per Hyper-V già preinstallata. Adesso il periodo di valutazione è scaduto ma vorrei inserire delle chiavi regolari per renderlo operativo senza scadenze. Tutto fattibile tranne che per SQL Server. Infatti sia su MSDN che su volume license non viene fornita la product key ma solo installazione con chiave precablata.

Ma per riattivare un'installazione di SQL Server 2008 scaduta c'è bisogno della chiave. Altrimenti bisogna reinstallare tutto.

Bisogna lanciare "SQL Server Installation Center", fare click su Maintenance a sinistra e poi click su Edition Upgrade.
Cliccando un po' di volte su Next si arriva alla pagina Product Key in cui bisogna inserire la chiave. Ma dove prenderla ?

Esistono dei programmi che dicono di essere capaci di estrarre la chiave usata nell'installazione ma mi sono salvato trovando un pezzettino di codice powershell che estrare la chiave e funziona perfettamente. L'ho verificato su Sql Server 2008 e 2008 R2.

function Get-SQLserverKey {
    ## function to retrieve the license key of a SQL 2008 Server.
    ## by Jakob Bindslet (jakob@bindslet.dk)
    param ($targets = ".")
    $hklm = 2147483650
    $regPath = "SOFTWARE\Microsoft\Microsoft SQL Server\100\Tools\Setup"
    $regValue1 = "DigitalProductId"
    $regValue2 = "PatchLevel"
    $regValue3 = "Edition"
    Foreach ($target in $targets) {
        $productKey = $null
        $win32os = $null
        $wmi = [WMIClass]"\\$target\root\default:stdRegProv"
        $data = $wmi.GetBinaryValue($hklm,$regPath,$regValue1)
        [string]$SQLver = $wmi.GetstringValue($hklm,$regPath,$regValue2).svalue
        [string]$SQLedition = $wmi.GetstringValue($hklm,$regPath,$regValue3).svalue
        $binArray = ($data.uValue)[52..66]
        $charsArray = "B","C","D","F","G","H","J","K","M","P","Q","R","T","V","W","X","Y","2","3","4","6","7","8","9"
        ## decrypt base24 encoded binary data
        For ($i = 24; $i -ge 0; $i--) {
            $k = 0
            For ($j = 14; $j -ge 0; $j--) {
                $k = $k * 256 -bxor $binArray[$j]
                $binArray[$j] = [math]::truncate($k / 24)
                $k = $k % 24
         }
            $productKey = $charsArray[$k] + $productKey
            If (($i % 5 -eq 0) -and ($i -ne 0)) {
                $productKey = "-" + $productKey
            }
        }
        $win32os = Get-WmiObject Win32_OperatingSystem -computer $target
        $obj = New-Object Object
        $obj | Add-Member Noteproperty Computer -value $target
        $obj | Add-Member Noteproperty OSCaption -value $win32os.Caption
        $obj | Add-Member Noteproperty OSArch -value $win32os.OSArchitecture
        $obj | Add-Member Noteproperty SQLver -value $SQLver
        $obj | Add-Member Noteproperty SQLedition -value $SQLedition
        $obj | Add-Member Noteproperty ProductKey -value $productkey
        $obj
    }
}


Per ottenere la chiave sul PC locale:

Get-SQLserverKey

Per ottenere la chiave da uno o piu' server remoti:

Get-SQLserverKey "pc1", "pc2", "server999", "server777"

Il codice proviene da questo post SQL Server Product Key di Jakob Bindslet.

Grazie Jakob !