Sign in to follow this  
Followers 0
Tekoni

REG EXPORT cannot find 64-bit keys

3 posts in this topic

I am creating a program to find and delete extraneous Microsoft Office license keys. As a safety feature, I have the program export each extra key found via this command:

Local $iPID = Run(@ComSpec & " /c REG EXPORT " & $LicensePath64 & " " & Chr(34) & @ScriptDir & "\Logs\" & $arrExtraLicense[$i][1] & ".reg" & Chr(34) & " /y", "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)

I am running Windows 7 64-bit, so I have test keys in both HKLMSOFTWAREMicrosoft... and HKLMSOFTWAREWow6432NodeMicrosoft... The command exported the keys in Wow6432Node just fine, but the other keys produce this error: "The system was unable to find the specified registry key or value."

To make sure I wasn't making any mistakes, I had the program write the command to the log file:

C:\Windows\system32\cmd.exe /c REG EXPORT HKLM\SOFTWARE\Microsoft\Office\14.0\Registration\{90140000-003A-0000-1000-0000000FF1CE} "C:\Users\tdickinson\Documents\K1000 Scripts\Microsoft Key Remover\Logs\Microsoft Office Project Standard 2010.reg" /y

 and copy/pasted it into a CMD window. It worked perfectly, both with and without admin rights. I have #RequireAdmin included, so I can't think it's a permissions error. What am I doing wrong?

Full loop code below: 

For $i = 0 to $iRows - 1

      $ver = StringMid($arrExtraLicense[$i][0], 3, 2)
      $bit = StringMid($arrLicense_GUID[$i][0], 20, 1)

      If @OSArch <> "X64" Then
         $LicensePath = "HKLM\SOFTWARE\Microsoft\Office\"&$ver&".0\Registration\{"&$arrExtraLicense[$i][0]&"}"
      ElseIf $bit = 1 Then
         $LicensePath = "HKLM64\SOFTWARE\Microsoft\Office\"&$ver&".0\Registration\{"&$arrExtraLicense[$i][0]&"}"
      ElseIf $bit = 0 Then
         $LicensePath = "HKLM64\SOFTWARE\Wow6432Node\Microsoft\Office\"&$ver&".0\Registration\{"&$arrExtraLicense[$i][0]&"}"
      EndIf

      RegRead($LicensePath,"")

      If @error = 0 Or @error = -1 Then

         If @OSArch <> "X64" Then
            FileWriteLine($fLog, @CRLF & "Key Found for " & $arrExtraLicense[$i][1] & ": " & $LicensePath & @CRLF)

            Local $iPID = RunWait(@ComSpec & " /c REG EXPORT " & $LicensePath & " " & Chr(34) & @ScriptDir & "\Logs\" & $arrExtraLicense[$i][1] & ".reg" & Chr(34), "", @SW_HIDE)

         Else
            $LicensePath64 = StringTrimLeft($LicensePath, 6)
            $LicensePath64 = "HKLM" & $LicensePath64

            FileWriteLine($fLog, @CRLF & "Key Found for " & $arrExtraLicense[$i][1] & ": " & $LicensePath64 & @CRLF)

            Local $iPID = Run(@ComSpec & " /c REG EXPORT " & $LicensePath64 & " " & Chr(34) & @ScriptDir & "\Logs\" & $arrExtraLicense[$i][1] & ".reg" & Chr(34) & " /y", "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)

            ;;;;;;;;;;;;;;;;
            ;Error Checking
            ;;;;;;;;;;;;;;;;

            Local $command = @ComSpec & " /c REG EXPORT " & $LicensePath64 & " " & Chr(34) & @ScriptDir & "\Logs\" & $arrExtraLicense[$i][1] & ".reg" & Chr(34) & " /y"
            ProcessWaitClose($iPID, 10)
            Local $msgExport = StdoutRead($iPID)
            Local $msgExportError = StderrRead($iPID)
            If $msgExport <> "" Then
               MsgBox(0, "Stdout Read:", $msgExport)
            ElseIf $msgExportError <> "" Then
               MsgBox(0, "Stderr Read:", $msgExportError & @CRLF & $command)
               FileWriteLine($fLog, $command)
            EndIf

         EndIf

         FileWriteLine($fLog, "Key backup saved to " & @ScriptDir & "\Logs\" & $arrExtraLicense[$i][1] & ".reg")

         RegDelete($LicensePath)

         If @error Then
            FileWriteLine($fLog, @TAB & "RegDelete Error " & @error & ": Problem deleting key." & @CRLF)
            $msgError = $msgError & $arrExtraLicense[$i][1] & @CRLF
         Else
            FileWriteLine($fLog, @TAB & "Key Deleted." & @CRLF)
            $msgDeleted = $msgDeleted & $arrExtraLicense[$i][1] & @CRLF
         EndIf

      EndIf

   Next

Share this post


Link to post
Share on other sites



Because your script runs a x86 cmd, the reg query cannot find the x64 hive into the registry.

Try to launch the native cmd, using @WindowsDir & "Sysnativecmd.exe" instead of @ComSpec

1 person likes this

Share this post


Link to post
Share on other sites

That worked perfectly! Thank you!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0