echo vbscript output from batch file

I found the following vbscript below that can extract the Windows Product key from a Windows 7 machines. This works well for me as I do NOT wish to use a 3rd party tool for this purpose. My problem is that I need the output of the vbscript (which is displayed in a message box), echo'ed from the batch file. Just to clarify, the main file will be a batch file which then calls this vbscript and echo's the Product Key from the batch file (The reason I need to do this from a batch file is because this portion of the batch file is part of a much larger portion of the same batch file that get executed from a Remote Management System when then extracts system details from the machines and populate UDF fields).

Source of vbscript
https://gist.github.com/eyecatchup/d577a2628666a0ad1375

Actual VB code
' VBS Script to get the Windows(R) 7 Product Key from a PC's registry.
'
' Save the VBScript as "getWin7Key.vbs" somewhere on your Windows7 PC.
' Now, when you double-click the local script file an alertbox pops up
' displaying the product key stored in the machine's Windows registry.

Set WshShell = WScript.CreateObject("WScript.Shell")

KeyPath = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DigitalProductId"
MsgBox ExtractKey(WshShell.RegRead(KeyPath))

Function ExtractKey(KeyInput)
    Const KeyOffset = 52
    i = 28
    CharWhitelist = "BCDFGHJKMPQRTVWXY2346789"
    Do
        Cur = 0
        x = 14
        Do
            Cur = Cur * 256
            Cur = KeyInput(x + KeyOffset) + Cur
            KeyInput(x + KeyOffset) = (Cur \ 24) And 255
            Cur = Cur Mod 24
            x = x -1
        Loop While x >= 0
        i = i -1
        KeyOutput = Mid(CharWhitelist, Cur + 1, 1) & KeyOutput
        If (((29 - i) Mod 6) = 0) And (i <> -1) Then
            i = i -1
            KeyOutput = "-" & KeyOutput
        End If
    Loop While i >= 0
    ExtractKey = KeyOutput
End Function

Open in new window


Sample Batch file:
This is a sample of the type of function I need. I am only posting this small portion as it's part of a much larger portion as mentioned earlier.

@echo off
for /f "tokens=2 delims=: " %%a in (
    'cscript //nologo "GetProductKeyWin7.vbs" | find ""' 
) do set "ProductKey=%%a"
echo %ProductKey%

Open in new window


In Summary, I suspect I need help with both scripts as the vbscript probably needs to be modified to output the ProductKey in a different way rather than a message box, and then hopefully the batch file script might find the output and display it when echo-ing it. I say echo, for the sake of testing purposes, but more accurately, I need the ProductKey 'set' in a variable in the batch file.

FYI, I have limited batch file knowledge, and no vbscript knowledge.

Thanks for any assistance that can be provided.
Remote-ITOwner & Remote Support ExecutiveAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

John TsioumprisSoftware & Systems EngineerCommented:
This is how to modify it to write the output of the VBS to a text file
Just create a folder Keys in C -->C:\Keys
' VBS Script to get the Windows(R) 7 Product Key from a PC's registry.
'
' Save the VBScript as "getWin7Key.vbs" somewhere on your Windows7 PC.
' Now, when you double-click the local script file an alertbox pops up
' displaying the product key stored in the machine's Windows registry.

keyFile = "C:\Keys\key.txt"
Const FORAPPENDING = 8
Set WshShell = WScript.CreateObject("WScript.Shell")

KeyPath = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DigitalProductId"
MsgBox ExtractKey(WshShell.RegRead(KeyPath))

Function ExtractKey(KeyInput)
    Const KeyOffset = 52
    i = 28
    CharWhitelist = "BCDFGHJKMPQRTVWXY2346789"
    Do
        Cur = 0
        x = 14
        Do
            Cur = Cur * 256
            Cur = KeyInput(x + KeyOffset) + Cur
            KeyInput(x + KeyOffset) = (Cur \ 24) And 255
            Cur = Cur Mod 24
            x = x -1
        Loop While x >= 0
        i = i -1
        KeyOutput = Mid(CharWhitelist, Cur + 1, 1) & KeyOutput
        If (((29 - i) Mod 6) = 0) And (i <> -1) Then
            i = i -1
            KeyOutput = "-" & KeyOutput
        End If
    Loop While i >= 0
    ExtractKey = KeyOutput
logKey(KeyOutput)
End Function

Sub logKey(ByVal strKey)
    Dim objFSO
    Dim objFile
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    ' Validate the file exits before attempting to write, create if it does not
    If objFSO.FileExists(keyFile) Then
        Set objFile = objFSO.OpenTextFile(keyFile ,FORAPPENDING)
    Else
        Set objFile = objFSO.CreateTextFile(keyFile ,True)
    End If    
 objFile.WriteLine "The key is : " & strKey
    objFile.Close
End Sub

Open in new window

0
oBdACommented:
In the VBScript, all you have to do is change line 10:
Replace "MsgBox" with "WScript.Echo"
so that the line reads
WScript.Echo ExtractKey(WshShell.RegRead(KeyPath))

Open in new window

Batch part:
for /f %%a in ('cscript.exe //nologo "GetProductKeyWin7.vbs"') do set ProductKey=%%a
echo %ProductKey%

Open in new window

1

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
Bill PrewIT / Software Engineering ConsultantCommented:
Here is a slight mod to the VBS to just write the key to STDOUT and nothing else.  And also a modified version of the BAT that will run it and catch the output into a variable.  Hope this helps.

***** GetProductKeyWin7.vbs *****
Option Explicit

Dim KeyPath, KeyOffset, KeyOutput, CharWhiteList
Dim WshShell, i, Cur, x

Set WshShell = WScript.CreateObject("WScript.Shell")

KeyPath = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DigitalProductId"
Wscript.Echo ExtractKey(WshShell.RegRead(KeyPath))

Function ExtractKey(KeyInput)
    Const KeyOffset = 52
    i = 28
    CharWhitelist = "BCDFGHJKMPQRTVWXY2346789"
    Do
        Cur = 0
        x = 14
        Do
            Cur = Cur * 256
            Cur = KeyInput(x + KeyOffset) + Cur
            KeyInput(x + KeyOffset) = (Cur \ 24) And 255
            Cur = Cur Mod 24
            x = x -1
        Loop While x >= 0
        i = i -1
        KeyOutput = Mid(CharWhitelist, Cur + 1, 1) & KeyOutput
        If (((29 - i) Mod 6) = 0) And (i <> -1) Then
            i = i -1
            KeyOutput = "-" & KeyOutput
        End If
    Loop While i >= 0
    ExtractKey = KeyOutput
End Function

Open in new window



***** EE29069016.BAT *****
@echo off
for /f "tokens=* " %%a in ('cscript //nologo "GetProductKeyWin7.vbs"' ) do (
    set "ProductKey=%%a"
)
echo %ProductKey%

Open in new window


»bp
1
Remote-ITOwner & Remote Support ExecutiveAuthor Commented:
Thanks oDbA & bp, this is exactly what I was after, works perfectly!
0
Remote-ITOwner & Remote Support ExecutiveAuthor Commented:

Additional feedback:


For those who might stumble across this post and find this useful as well, but also need the ability to extract the Product key from Windows 8 & 10 rather than just Windows 7. I found the following vbscript that seems to do the job well: https://winaero.com/blog/how-to-view-your-product-key-in-windows-10-windows-8-and-windows-7. It seems to be an advanced version of the getWin7Key.vbs one.

For my purposes, I've modified it according to oDbA's suggestion above for the purpose of using it through a batch file, and are able to use it on Windows 10 now as well. I've tested it on both Windows 7 & 10 and the Product keys seems to correctly match what's on the OS. Running the 'getWin7Key.vbs' vbscript on Windows 10 also produces a product key, but it's incorrect and doesn't match the actual product key, so this scripts works much better.

Here's the Modified version of the Script based on oDbA's suggestion:

Option Explicit  
 
Dim objshell,path,DigitalID, Result  
Set objshell = CreateObject("WScript.Shell") 
'Set registry key path 
Path = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\" 
'Registry key value 
DigitalID = objshell.RegRead(Path & "DigitalProductId") 
Dim ProductName,ProductID,ProductKey,ProductData 
'Get ProductName, ProductID, ProductKey 
'ProductName = "Product Name: " & objshell.RegRead(Path & "ProductName") 
'ProductID = "Product ID: " & objshell.RegRead(Path & "ProductID") 
'ProductKey = "Installed Key: " & ConvertToKey(DigitalID)  
'ProductData = ProductName  & vbNewLine & ProductID  & vbNewLine & ProductKey

' ********************************************
' Modification: Sets ProductKey and Echo's only the Key
ProductKey = ConvertToKey(DigitalID)  
Wscript.Echo (ProductKey) 
' ********************************************
 
'Show messbox if save to a file  
'If vbYes = MsgBox(ProductData  & vblf & vblf & "Save to a file?", vbYesNo + vbQuestion, "BackUp Windows Key Information") then 
'   Save ProductData  
'End If 
  
 
 
'Convert binary to chars 
Function ConvertToKey(Key) 
    Const KeyOffset = 52 
    Dim isWin8, Maps, i, j, Current, KeyOutput, Last, keypart1, insert 
    'Check if OS is Windows 8 
    isWin8 = (Key(66) \ 6) And 1 
    Key(66) = (Key(66) And &HF7) Or ((isWin8 And 2) * 4) 
    i = 24 
    Maps = "BCDFGHJKMPQRTVWXY2346789" 
    Do 
           Current= 0 
        j = 14 
        Do 
           Current = Current* 256 
           Current = Key(j + KeyOffset) + Current 
           Key(j + KeyOffset) = (Current \ 24) 
           Current=Current Mod 24 
            j = j -1 
        Loop While j >= 0 
        i = i -1 
        KeyOutput = Mid(Maps,Current+ 1, 1) & KeyOutput 
        Last = Current 
    Loop While i >= 0  
     
    If (isWin8 = 1) Then 
        keypart1 = Mid(KeyOutput, 2, Last) 
        insert = "N" 
        KeyOutput = Replace(KeyOutput, keypart1, keypart1 & insert, 2, 1, 0) 
        If Last = 0 Then KeyOutput = insert & KeyOutput 
    End If     
     
 
    ConvertToKey = Mid(KeyOutput, 1, 5) & "-" & Mid(KeyOutput, 6, 5) & "-" & Mid(KeyOutput, 11, 5) & "-" & Mid(KeyOutput, 16, 5) & "-" & Mid(KeyOutput, 21, 5) 
    
     
End Function 
'Save data to a file 
Function Save(Data) 
    Dim fso, fName, txt,objshell,UserName 
    Set objshell = CreateObject("wscript.shell") 
    'Get current user name  
    UserName = objshell.ExpandEnvironmentStrings("%UserName%")  
    'Create a text file on desktop  
    fName = "C:\Users\" & UserName & "\Desktop\WindowsKeyInfo.txt" 
    Set fso = CreateObject("Scripting.FileSystemObject") 
    Set txt = fso.CreateTextFile(fName) 
    txt.Writeline Data 
    txt.Close 
End Function 

Open in new window



To get it to work for me, I've 'commented' out the bits in the script above that I don't need and modified it to only produce the key which seems to work well on Windows 7 and 10 that I've tested.

Modified bit:
' ********************************************
' Modification: Sets ProductKey and Echo's only the Key
ProductKey = ConvertToKey(DigitalID)  
Wscript.Echo (ProductKey) 
' ********************************************

Open in new window


The batch file then works as per oDbA's post above when calling the vbscript after saving it as GetWinProductKey.vbs.

@echo off
for /f "tokens=* " %%a in ('cscript //nologo "GetWinProductKey.vbs"' ) do (
    set "ProductKey=%%a"
)
echo %ProductKey%

Open in new window


Guys, thanks again for your help!
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
VB Script

From novice to tech pro — start learning today.