Les clefs de produits Microsoft

Un petit script permet de récupérer les informations concernant votre licence.

Copier ce code dans un fichier viewpk.wsf. L'extension du fichier est importante.

viewpk.wsf
<job>
<runtime>
<description  author="jcb">
---------------------------------------------------------------------
Ce script en ligne de commande détermine, à partir des clefs 
"...\...\DigitalProductID", la valeur de la "ProductKey" 
(clef de produit) sous la forme 5x5 :
     	xxxxx-xxxxx-xxxxx-xxxxx-xxxxx
Chaque caractère fait partie de l'ensemble BCDFGHJKMPQRTVWXY2346789
Par défaut il examine le "DigitalProductID" de Windows, mais il est
capable de trouver et analyser ces clefs pour tous les produits Microsoft.
(Office, FrontPage, Visio, ...)
Ce script affiche aussi la "RAWkey" correspondante (valeur binaire,
exprimée en hexadécimal, en notations "little endian" et "big endian")
Inversement, il sait aussi convertir une RAWKey en ProductKey.
 
Enfin il sert à calculer (partiellement) le ProductID à partir 
de la ProductKey ou de la RAWkey. 
 
JCB © 2005
---------------------------------------------------------------------
</description>
<named name = "c" 
	helpstring = "Nom NetBIOS d'ordinateur 
    Si ce paramètre est absent, on retient l'ordinateur local"
	type = "string" 
	many="false"
	required = "false" />
<named
	name = "e"
	helpstring = "Commutateur indiquant le type de l'entrée :
    R  : clef de la branche HKLM de la base de registres (software\...)
      	 (valeur par défaut)
    T  : Recherche de toutes les clefs 'DigitalProductID'		 
    P  : ProductKey 
    HL : chaine hexadécimale de ProductKey (RAW key)
         en notation Little Endian (octets de poids faibles en 1ers)
    HB : chaine hexadécimale de ProductKey (RAW key)
         en notation Big Endian (octets de poids forts en 1ers)"
	type = "string" 
	required = "false" />
<unnamed name = "v" 
	helpstring = "Suivant la valeur du commutateur précédent
    - clef de la branche HKLM
      NB: ne pas indiquer ni le préfixe (HKLM) 
                          ni le nom de l'entrée (DigitalProductID)
      (à encadrer par des guillemets si le nom contient des espaces)
      Si ce paramètre est absent, on retient la clef :
      \SOFTWARE\Microsoft\Windows NT\CurrentVersion
    - ProductKey sous la forme xxxxx-xxxxx-xxxxx-xxxxx-xxxxx
    - chaine hexadécimale (RAW Key)"
	type = "string" 
	many="false"
	required = "false" />
<example>
Exemples : 
----------
 viewpk 
   affiche la ProductKey de Windows
 
 viewpk /e:T /c:GRANDBASSAM
   affiche les ProductKey de tous les produits Microsoft
   installés sur l'ordinateur "GRANDBASSAM"
 
 viewpk /c:SASSANDRA /e:R "SOFTWARE\Microsoft\Office\11.0\Registration\{9017040C-6000-11D3-8CFE-0150048383C9}" 
   affiche la ProductKey de FrontPage 2003 sur l'ordinateur "SASSANDRA"
 
 viewpk /e:HL 8063EFA7DE99C873A76B9F97FCD303
   affiche la ProductKey à partir de cette chaine Little Endian
 
 viewpk /e:P FCKGW-RHQQ2-YXRKT-8TG6W-2B7Q8 
   affiche la RAWKey à partir de cette ProductKey
 
Dans tous les cas, il est affiché :
   - la RAWKey en notation Little Endian 
   - la RAWKey en notation Big Endian 
   - les 2 nombres centraux du productID
     (algorithme valable seulement pour Windows)
---------------------------------------------------------------------
</example>
</runtime>
<script language="VBScript">
 
const HKEY_LOCAL_MACHINE   = &H80000002
CharSet24 = array("B","C","D","F","G","H","J","K","M","P","Q","R","T","V","W","X","Y","2","3","4","6","7","8","9")
'                  0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23
'                  0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F  10  11  12  13  14  15  16  17
Prefix="HKLM\"
KeyDef="software\Microsoft\Windows NT\CurrentVersion"
Entry1="DigitalProductId"
Entry2="ProductID"
Entry3="ProductName"
SW_SHOWNORMAL=1
Dim shell, fso, net, args, Buffer, PK(25),Result(15), Key
Set shell = WScript.CreateObject("WScript.Shell")
Set net   = Wscript.CreateObject("WScript.Network")
Set args  = Wscript.Arguments
Set fso   = WScript.CreateObject("Scripting.FileSystemObject")
nbargs=args.count
TestHost false
 
Set Named   = WScript.Arguments.Named
Set UnNamed = WScript.Arguments.UnNamed
nu=UnNamed.count
If named.Exists("c") Then Computer=lcase(named.Item("c")) else Computer=lcase(net.ComputerName)
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & Computer & "\root\default:StdRegProv")
On Error Resume Next
job="r"
If named.Exists("e") Then job=lcase(named.Item("e"))
Select Case job
'Analyse clef BDR
	Case "r" 
		BDR=true
		If nu=0 Then Key=KeyDef else Key=UnNamed(0)		
		coderet=oReg.GetBinaryValue(HKEY_LOCAL_MACHINE, Key, Entry1, Buffer)
		If CodeRet<>0 Then
			Wscript.echo "Erreur BDR"
			Wscript.quit	
			End If
		For index = 0 to 14
			PK(index)=Buffer(index+&H34)
			Next
		PrintResult
'Enumération de toutes les clefs
	Case "t"
		On error goto 0
		BDR=true
		rep=shell.Popup("Veuillez patienter SVP." & VBCRLF & "La recherche des clefs peut prendre un certain temps", _
		3, "Clefs de produits Microsoft sur " & Computer,65) 
		If rep=2 Then Wscript.quit
		ExploreKey("Software\Microsoft")
'Analyse de RAWKey ou ProductKey
	Case "hl","hb","p"
		BDR=false
		If nu=0 Then 
			WScript.Arguments.ShowUsage
			WScript.Quit
			end if
		Key=UnNamed(0)
		Select Case job
'Little Endian
			Case "hl" 
				i1=0
				i2=14
				s=1
'Big Endian
			Case "hb"
				i1=14
				i2=0
				s=-1
			Case "p"
			End Select
		If job<>"p" Then
'RAWKey
			j=0
			For index =  i1 To i2 Step s
				Sbyte="&H"  & Mid(Key,index*2+1,2)
				PK(j)=CInt(Sbyte)
				j=j+1
				Next
			PrintResult
		Else
'ProductKey
			j=0
			For index = 1 To len(Key)
'	conversion des caractères en base24
				v=valueB24(Mid(Key,index,1)) 
				If v>=0 Then
					PK(j)=v
					j=j+1
					End If	
				Next
			If j<>25 Then
				WScript.Arguments.ShowUsage
				WScript.Quit		
				End If
'	conversion en binaire
			For i = 0 To 14 
				Result(i)=0
				Next
			NumDigits=24
			ResLen=15
			For i= 0 To 24
				Aux=PK(i)
				m=0
				Do
					Aux=Result(m)*NumDigits + Aux
					Result(m)= Aux AND 255
					m=m+1
					Aux=int(Aux/256)
					Loop Until m >= ResLen
				Next
			For i = 0 To 14
				PK(i)=Result(i)
				Next
			PrintResult
			End If
	Case else 
		 WScript.Arguments.ShowUsage
	     WScript.Quit
	End Select
 
Wscript.quit
'--------------------------------------------------------------------
'Exploration récursive de la BDR 
'recherche des entrées "DigitalProductId"
Sub ExploreKey(CurKey)
coderet=oReg.GetBinaryValue(HKEY_LOCAL_MACHINE,CurKey,Entry1,Buffer)
If CodeRet=0 Then
'Entrée trouvée. Extraction RAWKey
	For index = 0 to 14
		PK(index)=Buffer(index+&H34)
		Next
	Key=CurKey			
	PrintResult
	Exit Sub
	end if
Dim arrSubKeys
'Enumération des sous-clefs
coderet=oReg.EnumKey(HKEY_LOCAL_MACHINE,CurKey,arrSubKeys)
If codeRet=0 Then
	If IsArray(arrSubKeys) Then
		For Each subkey In arrSubKeys
			ExploreKey(CurKey & "\" & subkey)
			Next
		End If
	end if
End Sub
'--------------------------------------------------------------------
Sub PrintResult
RAWKeyBE=""
RAWKeyLE=""
'Affichage des RAWkeys en Little Endian et en Big Endian
For index = 0 to 14
	RAWKeyBE=hexa(PK(index)) & RAWKeyBE 
	RAWKeyLE=RAWKeyLE & hexa(PK(index))
	Next
S=""
'Calcul du ProductID (algorithme valable seulement pour Windows) 
For index =  0 To 3 
	CurByte=PK(Index)
	If index =  3 Then CurByte=CurByte and &H7F
	S=Hexa(CurByte) & S  
	next
PID=int(("&H" &S) /2)
SPID=CStr(PID)
While len(SPID)<9
	SPID="0" & SPID
	Wend
SPID1=left(SPID,3)
SPID2=mid(SPID,4)
sigma=0
For i = 1 To len(SPID2)
	sigma=sigma+Asc(mid(SPID2,i,1))-48
	Next
m=7-sigma mod 7
SPID=SPID1 & "-" & SPID2 & m
'Conversion RAWKey en ProductKey
S=""
For i = 24 To 0 Step -1
	r = 0
	For j = 14 To 0 Step -1
		r = r * 256 Xor PK(j)
		PK(j) = Int(r/24)
		r = r Mod 24
		Next
	S=CharSet24(r) & S 
	If i Mod 5 = 0 And i <> 0 Then S="-" & S
	Next
msg=VBCRLF 
If BDR Then	msg=msg & "HKLM\" & Key & "\" & Entry1
msg=msg & VBCRLF & "ProductKey           = " & S
msg=msg & VBCRLF & "RAWKey Big Endian    = " & RAWKeyBE
msg=msg & VBCRLF & "RAWKey Little Endian = " & RAWKeyLE
' Calcul du ProductID (central)
' NB : valable seulement pour Windows, l'algorithme semblant 
' être différent pour les autres produits
msg=msg & VBCRLF & "ProductID calculé    = " & "xxxxx-" & SPID & "-xxxxx"
If BDR Then
	coderet=oReg.GetStringValue(HKEY_LOCAL_MACHINE, Key, Entry2, SPID)
	If Coderet=0 Then msg=msg & VBCRLF & "ProductID BDR        = " & SPID
	coderet=oReg.GetStringValue(HKEY_LOCAL_MACHINE, Key, Entry3, SPID)
	If Coderet=0 Then msg=msg & VBCRLF & "ProductName          = " & SPID
	End If
Wscript.echo msg
End Sub
'--------------------------------------------------------------------
'Affichage hexadécimal d'un octet avec 0 non significatif éventuel
Function hexa(n)
ch=hex(n)
If len(ch)<2 then ch="0" & ch
hexa=ch
End Function
'--------------------------------------------------------------------
Function valueB24(c)
valueB24=-1
c=ucase(c)
For i = 0 To 23
	If c=CharSet24(i) Then
		valueB24=i		
		exit for
		End If
	Next
End Function
'--------------------------------------------------------------------
'Sous-programme de test du moteur
'Vu les sorties générées, c'est CSCRIPT (et non pas WSCRIPT)
'qui doit être utilisé de préférence
Sub TestHost(force)
dim rep
strappli=lcase(Wscript.ScriptFullName)
strFullName =lcase(WScript.FullName)
i=InStr(1,strFullName,".exe",1)
j=InStrRev(strFullName,"\",i,1)
strCommand=Mid(strFullName,j+1,i-j-1)
if strCommand<>"cscript" then
	If force then 
		Init="Ce script doit être lancé avec CSCRIPT"
	Else
		Init="Il est préférable de lancer ce script avec CSCRIPT"
		End If
	rep=MsgBox(Init & VBCRLF & _
	"Cela peut être rendu permanent avec la commande" & VBCRLF & _
	"cscript //H:CScript //S /Nologo" & VBCRLF & _
	"Voulez-vous que ce soit fait automatiquement?", _
	vbYesNo + vbQuestion,strappli)
	if rep=vbYes  then 
		nomcmd="setscript.bat"
		Set ficcmd = fso.CreateTextFile(nomcmd)
		ficcmd.writeline "@echo off"
		ficcmd.writeline "cscript //H:CScript //S /Nologo"
		ficcmd.writeline "pause"
		params=""
		For i = 0 To nbargs-1 
			params=params & " " & args(i)
			next
		ficcmd.writeline chr(34) & strappli & chr(34) & params
		ficcmd.writeline "pause"
		ficcmd.close
		shell.Run nomcmd, SW_SHOWNORMAL,true
		force=true
		end if
    If force then WScript.Quit
	end if
end sub
'--------------------------------------------------------------------
</script>
</job>

Dans une fenêtre DOS, positionnez vous dans le dossier où le fichier viewpk.wsf, puis exécutez la commande :

cscript viewpk.wsf

Le résultat devrait de la forme suivante :

ProductKey           = FXXXP-4DFJD-GXXX9-VJXX7-HXXX2
RAWKey Big Endian    = 00D62D7BA2A0036A00BF64300C49D9
RAWKey Little Endian = 0049FC396000236A83A0027B2DD600
ProductID calculé    = xxxxx-486-4100400-xxxxx
ProductID BDR        = 00400-OEM-0092002-00006
ProductName          = Windows 7 Ultimate
  • informatique/windows/les_clefs_de_produits_microsoft/start.txt
  • Dernière modification: 2016/04/10 15:53
  • par Cedric ABONNEL