ViciousXUSMC

Silently Uninstall All Java Versions

11 posts in this topic

#1 ·  Posted (edited)

So I need to update Java on a lot of devices along with an application.

I started to work on the uninstall part and have one small issue.  Installing 3 versions of Java on my computer for testing it seems to get 2 out of 3 and requires me to run the script again to get the 3rd.  So it is removing it, but question is why do I have to run it again.  I added a Sleep() incase it was a issue with running too fast (Like I ran into the other day with renaming files in a loop) but still the same.

I'll post the source code I have so far and maybe somebody can see my error or offer up a better solution.

 

#RequireAdmin
;Uninstall Strings - HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall

For $i = 1 to 300
    $sKey1 = RegEnumKey("HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\", $i)
        If @Error Then ExitLoop
    $sKey2 = RegRead("HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\" & $sKey1, "DisplayName")
        If @Error Then ContinueLoop
    ;If StringInStr($sKey2, "Java") Then    MsgBox(0, "", $sKey2 & " Uninstall String Is" & @CRLF & @CRLF & $sKey1)
    If StringInStr($sKey2, "Java") Then
        Sleep(1000)
        RunWait(@ComSpec & " /c MsiExec /X " & $sKey1 & " /qn", "C:", @SW_HIDE)
    EndIf
Next

For $i = 1 to 300
    $sKey1 = RegEnumKey("HKLM64\Software\Microsoft\Windows\CurrentVersion\Uninstall\", $i)
        If @Error Then ExitLoop
    $sKey2 = RegRead("HKLM64\Software\Microsoft\Windows\CurrentVersion\Uninstall\" & $sKey1, "DisplayName")
        If @Error Then ContinueLoop
    ;If StringInStr($sKey2, "Java") Then    MsgBox(0, "", $sKey2 & " Uninstall String Is" & @CRLF & @CRLF & $sKey1)
    If StringInStr($sKey2, "Java") Then
        Sleep(1000)
        RunWait(@ComSpec & " /c MsiExec /X " & $sKey1 & " /qn", "C:", @SW_HIDE)
    EndIf
Next

MsgBox(0, "", "Uninstall of All Java Versions Completed")

Edit: Hmm I have an idea of what it might be... Need to test.  If I have two java uninstall strings right next to another and say I was in loop 100/300 and it gets uninstalled.  The second instance of java may then fall into spot #100 in RegEnumKey() and get skipped as the next iteration of the loop would be 101/300

I think I can just add an $i = $i -1 or something in my If Statement so that I repeat that iteration if an uninstall is done.

Edit2: Fixed :)  that was the issue it seems.

Edited by ViciousXUSMC

Share this post


Link to post
Share on other sites



What about going the WMI route?:

$oWMI = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & @ComputerName & "\root\cimv2")
$aProducts = $oWMI.ExecQuery("Select * from Win32_Product Where Name LIKE '%Java%'")

For $app in $aProducts
    $app.Uninstall()
Next

 


√-1 2^3 ∑ π, and it was delicious!

Share this post


Link to post
Share on other sites

#3 ·  Posted (edited)

Thats a good idea, I know powershell some but not too familiar with how to use it in autoit.

At some point I am going to have to tweak this probably to remove all but Version X of java, I was just going to do If StringInStr() AND NOT StringInStr() kind of thing based on my code above, how would you pull that off in the WMI method?

I assume -LIke '%Java%" -And -NotLIke '%Java 7 Update 55% sort of deal would work?

Edit: More accurately I should say I know WMI with PowerShell since WMI is not Powershell Exclusive.

With PS it would be an easy for me, but the autoit version you posted has a bunch of other stuff I am not familiar with like winmgmtns, impersonationlevel etc.  Do we have a help file for all that somewhere?

Edited by ViciousXUSMC

Share this post


Link to post
Share on other sites

The winmgmts piece is just grabbing the WMI object. I am sure you can find plenty of docs through Google.

As for further filtering, it is a bit unintuitive. One of my installed Java versions ends in Update 3 and this filter works for me:

$aProducts = $oWMI.ExecQuery("Select * from Win32_Product Where Name LIKE '%Java%' and NOT Name LIKE '%Update 3%'")

 


√-1 2^3 ∑ π, and it was delicious!

Share this post


Link to post
Share on other sites

What about going the WMI route?:

$oWMI = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & @ComputerName & "\root\cimv2")
$aProducts = $oWMI.ExecQuery("Select * from Win32_Product Where Name LIKE '%Java%'")

For $app in $aProducts
    $app.Uninstall()
Next

 

What is the purpose of the 

%Java%

Is it a wildcard at either end?, ive seen things on the web like this

%%CoolWebSearch%%

Is that the same?

Share this post


Link to post
Share on other sites

#6 ·  Posted (edited)

WMI Queries use the same wildcards than SQL. %Java% is equivalent to *Java*.

This article can be interesting : http://blogs.technet.com/b/heyscriptingguy/archive/2012/07/13/use-the-like-operator-to-simplify-your-wql-queries.aspx

%Java% filters returns all products with a name containing "java". In my case : JavaScript Tooling, Java(TM) 6 Update 31, Visual Studio Extensions for Windows Library for JavaScript, Java Auto Updater.

So you can improve the filter, using %Java%Update% or something like %Java%[0-9]%update%[0-9]

 

Edit : to familiarize yourself with WMI, you can use some tools like WMIExplorer 2, WMIExplorer, ScriptOMatic... and of course, MSDN

 

Edited by jguinch

Share this post


Link to post
Share on other sites

Yeah the SQL like queries are nice but that is another place the PowerShell is different I have to use "*Java*" instead of "%java%"

Get-WmiObject Win32_Product | Where Name -LIke "*Java*"

The search is a bit slow and I have not figure out how to do a single line powershell command to uninstall but I am sure its possible. 

Share this post


Link to post
Share on other sites

Figured out why my one line PowerShell uninstall was not working needed the () at the end of .Uninstall()

(Get-WmiObject Win32_Product | Where Name -eq "XXX").uninstall()

 

Share this post


Link to post
Share on other sites

Wondering who uses AutoIT and what it can be used for ?


ADO.au3 UDF     POP3.au3 UDF     XML.au3 UDF    How to use IE.au3  UDF with  AutoIt v3.3.14.x  for other useful stuff click the following button:

Spoiler

Last update: 2017-05-23
Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. 

My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAPPOP3.au3 UDF *  RTF Printer - UDF * XML.au3 - BETA * ADO.au3 UDF SMTP Mailer UDF * WinSCP UDF * GitHub API UDF - modest begining *

My contribution to others projects: * _sql.au3 UDF  *

Useful links: * Forum Rules * Forum etiquette *  Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * 

Wiki: Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Best coding practices * 

IE Related:  * How to use IE.au3  UDF with  AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * 

I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions *  EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *

"Homo sum; humani nil a me alienum puto" - Publius Terentius Afer
"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming"
:naughty:  :ranting:, be  :) and       \\//_.

Anticipating Errors :  "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty."

 

Share this post


Link to post
Share on other sites

@mLipok, your first two links are simply a rehash of what the OP is already trying to do, loop through the registry and uninstall for every instance of Java found.

The second one specifically has to do with using configuration manager. I don't see where the OP states he is using SCCM; unless he is, this link gives him nothing. 


√-1 2^3 ∑ π, and it was delicious!

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