2015-03-09 6 views
0

J'ai trouvé une solution possible à la question ici: http://youtu.be/71Vc9QiraQEComment trouver clé de produit Windows si votre autocollant est endommagé

Je ne suis pas un shell de pouvoir moi-même et ne peut pas tout à fait suivre le code dans le script.

Ce serait un script utile pour aider à réinstaller lorsque les systèmes d'exploitation ont été mis à niveau. Mon problème est que je voudrais le comprendre plus avant de l'utiliser ou au moins être dit qu'il semble inoffensif.

Voici le script:

function Get-WindowsKey { 
    ## function to retrieve the Windows Product Key from any PC 
    param ($targets = ".") 
    $hklm = 2147483650 
    $regPath = "Software\Microsoft\Windows NT\CurrentVersion" 
    $regValue = "DigitalProductId" 
    Foreach ($target in $targets) { 
     $productKey = $null 
     $win32os = $null 
     $wmi = [WMIClass]"\\$target\root\default:stdRegProv" 
     $data = $wmi.GetBinaryValue($hklm,$regPath,$regValue) 
     $binArray = ($data.uValue)[52..66] 
     $charsArray = "B","C","D","E","F","G","H","J","K","M","P","Q","­R","T","V","W","X","Y","2","3","4","5","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 Caption -value $win32os.Caption 
     $obj | Add-Member Noteproperty CSDVersion -value $win32os.CSDVersion 
     $obj | Add-Member Noteproperty OSArch -value $win32os.OSArchitecture 
     $obj | Add-Member Noteproperty BuildNumber -value $win32os.BuildNumber 
     $obj | Add-Member Noteproperty RegisteredTo -value $win32os.RegisteredUser 
     $obj | Add-Member Noteproperty ProductID -value $win32os.SerialNumber 
     $obj | Add-Member Noteproperty ProductKey -value $productkey 
     $obj 
    } 
} 
Get-WindowsKey 

La première commande utilisée dans Windows PowerShell:

Set-ExecutionPolicy RemoteSigned 

Si le premier script ne fonctionne pas, essayez ceci: j'ai pu obtenir ma clé en utilisant cela, mais j'ai dû corriger le script, en changeant la dernière ligne à:

function Get-WindowsKey { 
# ... 
} 
Get-WindowsKey localhost 
+0

Le lien Youtube ne fonctionne pas ici. Mais il y a un autre billet de blog contenant le code sur http://www.randomtechtips.com/get-windows-product-key-using-powershell/ –

Répondre

2

Je pense que la vidéo YouTube surdimensionne un peu, vous pouvez simplement couper et coller le contenu de celui-ci dans une fenêtre PowerShell sans avoir à foutre avec executionpolicy et l'importation du fichier.

Il suffit d'ouvrir PowerShell, collez le code ci-dessous et appuyez sur Entrée plusieurs fois jusqu'à ce qu'il revienne.

param ($targets = ".") 
$hklm = 2147483650 
$regPath = "Software\Microsoft\Windows NT\CurrentVersion" 
$regValue = "DigitalProductId4" 
Foreach ($target in $targets) { 
    $productKey = $null 
    $win32os = $null 
    $wmi = [WMIClass]"\\$target\root\default:stdRegProv" 
    $data = $wmi.GetBinaryValue($hklm,$regPath,$regValue) 
    $binArray = ($data.uValue)[52..66] 
    $charsArray = "B","C","D","E","F","G","H","J","K","M","P","Q","R","T","V","W","X","Y","2","3","4","5","6","7","8","9" 
    ## decrypt base24 encoded binary data to characters. 
    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 Caption -value $win32os.Caption 
    $obj | Add-Member Noteproperty CSDVersion -value $win32os.CSDVersion 
    $obj | Add-Member Noteproperty OSArch -value $win32os.OSArchitecture 
    $obj | Add-Member Noteproperty BuildNumber -value $win32os.BuildNumber 
    $obj | Add-Member Noteproperty RegisteredTo -value $win32os.RegisteredUser 
    $obj | Add-Member Noteproperty ProductID -value $win32os.SerialNumber 
    $obj | Add-Member Noteproperty ProductKey -value $productkey 
    $obj 
} 

Je recommande vivement de sauvegarder le disque dur (ou de le remplacer entièrement) au cas où le script ne l'aurait pas décrypté correctement. Il serait un peu difficile de passer par tout cela pour trouver ce qui ne va pas et vous avez simplement effacé votre système d'exploitation précédent.

+0

C'est la seule chose en ligne qui m'a donné une clé réelle sur Windows 10 Volume licence (au lieu de 'BBBB-BBBB ...' Mais je me demande si c'est une bonne clé ou pas, je suppose que je le saurai bientôt. – prettyvoid

+0

Un autre outil (https://gallery.technet.microsoft.com/scriptcenter/Get-Windows-Product-6b5e6f6e#content) m'a donné 'ProductKey: Se termine par: TJF9M' qui est totalement différent du dernier bit de la clé Je viens du script ci-dessus. – prettyvoid

0

Essayez d'expliquer ce que fait le code.

Le script est en train de lire la valeur de Registre Software\Microsoft\Windows NT\CurrentVersion\DigitalProductId et extrait la partie pertinente

$wmi = [WMIClass]"\\$target\root\default:stdRegProv" 
$data = $wmi.GetBinaryValue($hklm,$regPath,$regValue) 
$binArray = ($data.uValue)[52..66] 

Comme le commentaire dans le code dit, il décode (« déchiffre ») la valeur dans la boucle. La valeur de Registre est codée base24.

$charsArray = "B","C","D","E","F","G","H","J","K","M","P","Q","R","T","V","W","X","Y","2","3","4","5","6","7","8","9" 
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 
    } 
} 

Et enfin le code montre la clé de produit ainsi que plusieurs valeurs système

$win32os = Get-WmiObject Win32_OperatingSystem -computer $target 
$obj = New-Object Object 
$obj | Add-Member Noteproperty Computer -value $target 
$obj | Add-Member Noteproperty Caption -value $win32os.Caption 
$obj | Add-Member Noteproperty CSDVersion -value $win32os.CSDVersion 
$obj | Add-Member Noteproperty OSArch -value $win32os.OSArchitecture 
$obj | Add-Member Noteproperty BuildNumber -value $win32os.BuildNumber 
$obj | Add-Member Noteproperty RegisteredTo -value $win32os.RegisteredUser 
$obj | Add-Member Noteproperty ProductID -value $win32os.SerialNumber 
$obj | Add-Member Noteproperty ProductKey -value $productkey 
$obj 

Selon que ce soit une version commerciale ou une entreprise, la valeur de Registre peut être trouvée dans les deux DigitalProductId ou DigitalProductId4, p.ex.

$regValue = "DigitalProductId" 

vs

$regValue = "DigitalProductId4"