Link to home
Start Free TrialLog in
Avatar of juriang
juriangFlag for Netherlands

asked on

VB.NET - Get product key for Windows 7 and 8

Hi,

For a software reinstallation program i'm making I would like to collect the current product key from Windows 7 and 8 so it can be automatically be re-used by my application.

Now I have found multiple examples but none of them seem to work...

I have tried below code but this always results in "N/A", the variable Hexbuf is empty but I don't understand why.

Public Function GetProductKey(ByVal KeyPath As String, ByVal ValueName As String) As String

        Dim HexBuf As Object = My.Computer.Registry.GetValue(KeyPath, ValueName, 0)

        If HexBuf Is Nothing Then Return "N/A"

        Dim tmp As String = ""

        For l As Integer = LBound(HexBuf) To UBound(HexBuf)
            tmp = tmp & " " & Hex(HexBuf(l))
        Next

        Dim StartOffset As Integer = 52
        Dim EndOffset As Integer = 67
        Dim Digits(24) As String

        Digits(0) = "B" : Digits(1) = "C" : Digits(2) = "D" : Digits(3) = "F"
        Digits(4) = "G" : Digits(5) = "H" : Digits(6) = "J" : Digits(7) = "K"
        Digits(8) = "M" : Digits(9) = "P" : Digits(10) = "Q" : Digits(11) = "R"
        Digits(12) = "T" : Digits(13) = "V" : Digits(14) = "W" : Digits(15) = "X"
        Digits(16) = "Y" : Digits(17) = "2" : Digits(18) = "3" : Digits(19) = "4"
        Digits(20) = "6" : Digits(21) = "7" : Digits(22) = "8" : Digits(23) = "9"

        Dim dLen As Integer = 29
        Dim sLen As Integer = 15
        Dim HexDigitalPID(15) As String
        Dim Des(30) As String

        Dim tmp2 As String = ""

        For i = StartOffset To EndOffset
            HexDigitalPID(i - StartOffset) = HexBuf(i)
            tmp2 = tmp2 & " " & Hex(HexDigitalPID(i - StartOffset))
        Next

        Dim KEYSTRING As String = ""

        For i As Integer = dLen - 1 To 0 Step -1
            If ((i + 1) Mod 6) = 0 Then
                Des(i) = "-"
                KEYSTRING = KEYSTRING & "-"
            Else
                Dim HN As Integer = 0
                For N As Integer = (sLen - 1) To 0 Step -1
                    Dim Value As Integer = ((HN * 2 ^ 8) Or HexDigitalPID(N))
                    HexDigitalPID(N) = Value \ 24
                    HN = (Value Mod 24)

                Next

                Des(i) = Digits(HN)
                KEYSTRING = KEYSTRING & Digits(HN)
            End If
        Next

        Return StrReverse(KEYSTRING)

    End Function

Open in new window



I also tried to use below code which is actually for Windows XP, this gives met the result "bbbbb-bbbbb-bbbbb-bbbbb-bbbbb"

Public Function sGetXPKey() As String
    Dim result As String = String.Empty

    Dim RegKey As RegistryKey = _
    Registry.LocalMachine.OpenSubKey("Software\Microsoft\Windows NT\CurrentVersion", False)
    Dim bytDPID() As Byte = RegKey.GetValue("DigitalProductID")
    Dim bytKey(14) As Byte
    Array.Copy(bytDPID, 52, bytKey, 0, 15)
    Dim strChar As String = "BCDFGHJKMPQRTVWXY2346789"
    Dim strKey As String = ""

    For j As Integer = 0 To 24
        Dim nCur As Short = 0
        For i As Integer = 14 To 0 Step -1
            nCur = CShort(nCur * 256 Xor bytKey(i))
            bytKey(i) = CByte(Int(nCur / 24))
            nCur = CShort(nCur Mod 24)
        Next
        strKey = strChar.Substring(nCur, 1) & strKey
    Next

    For i As Integer = 4 To 1 Step -1
        strKey = strKey.Insert(i * 5, "-")
    Next

    Return strKey
End Function

Open in new window


Can someboday please help me? i'm a database application programmer so this is new to me.

Thanks
Avatar of Kimputer
Kimputer

Do you really need the code or is an external program also possible (why invent the wheel again?). By that, I mean using Magic Jelly Bean or Produkey (both are free).
http://www.magicaljellybean.com/keyfinder/
http://www.nirsoft.net/utils/product_cd_key_viewer.html
Avatar of juriang

ASKER

Thanks for your suggestions.

I really need the code. I want to save it to a local database.

Your help is appreciated
Thanks
ASKER CERTIFIED SOLUTION
Avatar of Kimputer
Kimputer

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of juriang

ASKER

@Kimputer: Thanks, this could work though i'm in favor of having the code myself instead of depending on a 3rt party tool.

Who can help me to get above code to work or has another working example?

Thanks
Okay, first code works on Windows XP btw.
Use this to test it:
TextBox1.Text =  GetProductKey("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\", "DigitalProductId")

Open in new window

Actually, just tested the second code, it also works??? (again on XP)
Just tested on Windows 8, wrong code. Meaning your code is not correct for Win7/8, only for Windows XP.
Avatar of juriang

ASKER

Like the topic title mention I need this functionality for Windows 7 and 8.

I did the same testing as you recommended already
TextBox1.Text =  GetProductKey("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\", "DigitalProductId")

Open in new window


Also checked on Windows 7 and 8 if the same registry key exists and it does so I can't think of any reason why the script is not working on Windows 7 and 8.

Please help
Avatar of juriang

ASKER

Anyone who could please help me in providing the code for Windows 7 and 8?

Your help would be very much appreciated.