How to remove all oracle java using powershell
I wanted to start by saying i did read some other topics on this but at this point i still have to do it none the less (decision been made above my pay grade).
We are in the process of moving and testing out Azul java to see how well that works for us. Meantime I need to figure out how to script the uninstall of the all Oracle java (preferably I would have a script for JRE and another for JDK).
Currently how I have been removing java versions is by having a list of all jre versions doing msiexec /x "GUID of the java version" /qn
but it is incredibly time consuming so I wanted to get those strings pragmatically.
Right now I run the following command:
Get-WmiObject -Class Win32_Product | Where-Object {$_.Name -like 'Java*'}
However, I am trying to find out how to automatically get the IdentifyNumber for every result as long as Vendor = Oracle Corporation and pipe it to the msiexec command to problematically remove them. Azul is installed on the same system as the command is being ran but is not showing up (which is good but just in case I wanted to have the vendor qualifier).
My question is: Can someone help me pipe the IdentifyNumber of the product into msiexec command assuming Vendor is Oracle Corporation
Thank you in advance.
Update 1:
Following feedback from Drew and Ansgar
$Source = Get-ItemProperty HKLM:SoftwareWow6432NodeMicrosoftWindowsCurrentVersionUninstall*
$Uninstall = $Source | Where-Object {($_.Publisher -like '*Oracle*')-and ($_.DisplayName -like 'Java*')} | select UninstallString
$UninstallString = $Uninstall.UninstallString
$UninstallSting | ForEach-Object{Invoke-Expression -ScriptBlock ($UninstallString)}
However, I cant seem to pipe the strings correctly as I keep getting:
Invoke-Command : Cannot convert 'System.Object' to the type 'System.Management.Automation.ScriptBlock' required by parameter 'ScriptBlock'. Specified method
is not supported.
At C:KonstantinJavaUninstallAllJava.ps1:8 char:62
+ ... ting | ForEach-Object{Invoke-Command -ScriptBlock ($UninstallString)}
+ ~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Invoke-Command], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.InvokeCommandCommand
powershell
add a comment |
I wanted to start by saying i did read some other topics on this but at this point i still have to do it none the less (decision been made above my pay grade).
We are in the process of moving and testing out Azul java to see how well that works for us. Meantime I need to figure out how to script the uninstall of the all Oracle java (preferably I would have a script for JRE and another for JDK).
Currently how I have been removing java versions is by having a list of all jre versions doing msiexec /x "GUID of the java version" /qn
but it is incredibly time consuming so I wanted to get those strings pragmatically.
Right now I run the following command:
Get-WmiObject -Class Win32_Product | Where-Object {$_.Name -like 'Java*'}
However, I am trying to find out how to automatically get the IdentifyNumber for every result as long as Vendor = Oracle Corporation and pipe it to the msiexec command to problematically remove them. Azul is installed on the same system as the command is being ran but is not showing up (which is good but just in case I wanted to have the vendor qualifier).
My question is: Can someone help me pipe the IdentifyNumber of the product into msiexec command assuming Vendor is Oracle Corporation
Thank you in advance.
Update 1:
Following feedback from Drew and Ansgar
$Source = Get-ItemProperty HKLM:SoftwareWow6432NodeMicrosoftWindowsCurrentVersionUninstall*
$Uninstall = $Source | Where-Object {($_.Publisher -like '*Oracle*')-and ($_.DisplayName -like 'Java*')} | select UninstallString
$UninstallString = $Uninstall.UninstallString
$UninstallSting | ForEach-Object{Invoke-Expression -ScriptBlock ($UninstallString)}
However, I cant seem to pipe the strings correctly as I keep getting:
Invoke-Command : Cannot convert 'System.Object' to the type 'System.Management.Automation.ScriptBlock' required by parameter 'ScriptBlock'. Specified method
is not supported.
At C:KonstantinJavaUninstallAllJava.ps1:8 char:62
+ ... ting | ForEach-Object{Invoke-Command -ScriptBlock ($UninstallString)}
+ ~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Invoke-Command], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.InvokeCommandCommand
powershell
1
Win32_Product is evil. Do not use it.
– Ansgar Wiechers
Nov 26 '18 at 22:42
add a comment |
I wanted to start by saying i did read some other topics on this but at this point i still have to do it none the less (decision been made above my pay grade).
We are in the process of moving and testing out Azul java to see how well that works for us. Meantime I need to figure out how to script the uninstall of the all Oracle java (preferably I would have a script for JRE and another for JDK).
Currently how I have been removing java versions is by having a list of all jre versions doing msiexec /x "GUID of the java version" /qn
but it is incredibly time consuming so I wanted to get those strings pragmatically.
Right now I run the following command:
Get-WmiObject -Class Win32_Product | Where-Object {$_.Name -like 'Java*'}
However, I am trying to find out how to automatically get the IdentifyNumber for every result as long as Vendor = Oracle Corporation and pipe it to the msiexec command to problematically remove them. Azul is installed on the same system as the command is being ran but is not showing up (which is good but just in case I wanted to have the vendor qualifier).
My question is: Can someone help me pipe the IdentifyNumber of the product into msiexec command assuming Vendor is Oracle Corporation
Thank you in advance.
Update 1:
Following feedback from Drew and Ansgar
$Source = Get-ItemProperty HKLM:SoftwareWow6432NodeMicrosoftWindowsCurrentVersionUninstall*
$Uninstall = $Source | Where-Object {($_.Publisher -like '*Oracle*')-and ($_.DisplayName -like 'Java*')} | select UninstallString
$UninstallString = $Uninstall.UninstallString
$UninstallSting | ForEach-Object{Invoke-Expression -ScriptBlock ($UninstallString)}
However, I cant seem to pipe the strings correctly as I keep getting:
Invoke-Command : Cannot convert 'System.Object' to the type 'System.Management.Automation.ScriptBlock' required by parameter 'ScriptBlock'. Specified method
is not supported.
At C:KonstantinJavaUninstallAllJava.ps1:8 char:62
+ ... ting | ForEach-Object{Invoke-Command -ScriptBlock ($UninstallString)}
+ ~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Invoke-Command], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.InvokeCommandCommand
powershell
I wanted to start by saying i did read some other topics on this but at this point i still have to do it none the less (decision been made above my pay grade).
We are in the process of moving and testing out Azul java to see how well that works for us. Meantime I need to figure out how to script the uninstall of the all Oracle java (preferably I would have a script for JRE and another for JDK).
Currently how I have been removing java versions is by having a list of all jre versions doing msiexec /x "GUID of the java version" /qn
but it is incredibly time consuming so I wanted to get those strings pragmatically.
Right now I run the following command:
Get-WmiObject -Class Win32_Product | Where-Object {$_.Name -like 'Java*'}
However, I am trying to find out how to automatically get the IdentifyNumber for every result as long as Vendor = Oracle Corporation and pipe it to the msiexec command to problematically remove them. Azul is installed on the same system as the command is being ran but is not showing up (which is good but just in case I wanted to have the vendor qualifier).
My question is: Can someone help me pipe the IdentifyNumber of the product into msiexec command assuming Vendor is Oracle Corporation
Thank you in advance.
Update 1:
Following feedback from Drew and Ansgar
$Source = Get-ItemProperty HKLM:SoftwareWow6432NodeMicrosoftWindowsCurrentVersionUninstall*
$Uninstall = $Source | Where-Object {($_.Publisher -like '*Oracle*')-and ($_.DisplayName -like 'Java*')} | select UninstallString
$UninstallString = $Uninstall.UninstallString
$UninstallSting | ForEach-Object{Invoke-Expression -ScriptBlock ($UninstallString)}
However, I cant seem to pipe the strings correctly as I keep getting:
Invoke-Command : Cannot convert 'System.Object' to the type 'System.Management.Automation.ScriptBlock' required by parameter 'ScriptBlock'. Specified method
is not supported.
At C:KonstantinJavaUninstallAllJava.ps1:8 char:62
+ ... ting | ForEach-Object{Invoke-Command -ScriptBlock ($UninstallString)}
+ ~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Invoke-Command], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.InvokeCommandCommand
powershell
powershell
edited Nov 28 '18 at 0:16
Konstantin V
asked Nov 26 '18 at 22:36
Konstantin VKonstantin V
118118
118118
1
Win32_Product is evil. Do not use it.
– Ansgar Wiechers
Nov 26 '18 at 22:42
add a comment |
1
Win32_Product is evil. Do not use it.
– Ansgar Wiechers
Nov 26 '18 at 22:42
1
1
Win32_Product is evil. Do not use it.
– Ansgar Wiechers
Nov 26 '18 at 22:42
Win32_Product is evil. Do not use it.
– Ansgar Wiechers
Nov 26 '18 at 22:42
add a comment |
2 Answers
2
active
oldest
votes
I would recommend the Registry method.
Get-ItemProperty HKLM:SoftwareWow6432NodeMicrosoftWindowsCurrentVersionUninstall* |
Where-Object {$_.Publisher -like '*oracle*'} | select UninstallString
This will give you your MsiExec.exe
link. E.G. MsiExec.exe /X{26A24AE4-039D-4CA4-87B4-2F32180181F0}
Following your example I have the following: <blink>$Source = Get-ItemProperty HKLM:SoftwareWow6432NodeMicrosoftWindowsCurrentVersionUninstall* $Uninstall = $Source | Where-Object {($_.Publisher -like 'Oracle')-and ($_.DisplayName -like 'Java*')} | select UninstallString $UninstallString = $Uninstall.UninstallString $UninstallSting | ForEach-Object{Invoke-Expression -ScriptBlock ($UninstallString)} <blink> but the last part where i try to run each string keeps failing and i cant figure out why
– Konstantin V
Nov 27 '18 at 23:59
add a comment |
So i was able to figure it out so here is what I came up with which seem to work
Set "Source" variable to registry location
$Source = Get-ItemProperty HKLM:SoftwareWow6432NodeMicrosoftWindowsCurrentVersionUninstall*
Set "Uninstall" variable to inherit from source and reduce the scope to Oracle and Java
$Uninstall = $Source | Where-Object {($_.Publisher -like '*Oracle*')-and ($_.DisplayName -like 'Java*')} | select UninstallString
Set "UninstallString" variable to get only the uninstall string from "Uninstall" variable
$UninstallStrings = $Uninstall.UninstallString -replace "MsiExec.exe ","MsiExec.exe /qn " -replace "/I","/X"
Run all the uninstall strings
ForEach($UninstallString in $UninstallStrings){& cmd /c "$UninstallString"}
I am sure it can be a lot cleaner but this is the best i can do for now. For some versions of java the uninstall strings would give /i variable instead of /x (JDK 6) which is why i had to do the second replace statement.
Example:
UninstallString
---------------
MsiExec.exe /X{26A24AE4-039D-4CA4-87B4-2F03217079FF}
MsiExec.exe /X{26A24AE4-039D-4CA4-87B4-2F83216045FF}
MsiExec.exe /I{32A3A4F4-B792-11D6-A78A-00B0D0160450}
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53490170%2fhow-to-remove-all-oracle-java-using-powershell%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
I would recommend the Registry method.
Get-ItemProperty HKLM:SoftwareWow6432NodeMicrosoftWindowsCurrentVersionUninstall* |
Where-Object {$_.Publisher -like '*oracle*'} | select UninstallString
This will give you your MsiExec.exe
link. E.G. MsiExec.exe /X{26A24AE4-039D-4CA4-87B4-2F32180181F0}
Following your example I have the following: <blink>$Source = Get-ItemProperty HKLM:SoftwareWow6432NodeMicrosoftWindowsCurrentVersionUninstall* $Uninstall = $Source | Where-Object {($_.Publisher -like 'Oracle')-and ($_.DisplayName -like 'Java*')} | select UninstallString $UninstallString = $Uninstall.UninstallString $UninstallSting | ForEach-Object{Invoke-Expression -ScriptBlock ($UninstallString)} <blink> but the last part where i try to run each string keeps failing and i cant figure out why
– Konstantin V
Nov 27 '18 at 23:59
add a comment |
I would recommend the Registry method.
Get-ItemProperty HKLM:SoftwareWow6432NodeMicrosoftWindowsCurrentVersionUninstall* |
Where-Object {$_.Publisher -like '*oracle*'} | select UninstallString
This will give you your MsiExec.exe
link. E.G. MsiExec.exe /X{26A24AE4-039D-4CA4-87B4-2F32180181F0}
Following your example I have the following: <blink>$Source = Get-ItemProperty HKLM:SoftwareWow6432NodeMicrosoftWindowsCurrentVersionUninstall* $Uninstall = $Source | Where-Object {($_.Publisher -like 'Oracle')-and ($_.DisplayName -like 'Java*')} | select UninstallString $UninstallString = $Uninstall.UninstallString $UninstallSting | ForEach-Object{Invoke-Expression -ScriptBlock ($UninstallString)} <blink> but the last part where i try to run each string keeps failing and i cant figure out why
– Konstantin V
Nov 27 '18 at 23:59
add a comment |
I would recommend the Registry method.
Get-ItemProperty HKLM:SoftwareWow6432NodeMicrosoftWindowsCurrentVersionUninstall* |
Where-Object {$_.Publisher -like '*oracle*'} | select UninstallString
This will give you your MsiExec.exe
link. E.G. MsiExec.exe /X{26A24AE4-039D-4CA4-87B4-2F32180181F0}
I would recommend the Registry method.
Get-ItemProperty HKLM:SoftwareWow6432NodeMicrosoftWindowsCurrentVersionUninstall* |
Where-Object {$_.Publisher -like '*oracle*'} | select UninstallString
This will give you your MsiExec.exe
link. E.G. MsiExec.exe /X{26A24AE4-039D-4CA4-87B4-2F32180181F0}
answered Nov 26 '18 at 23:10
DrewDrew
1,367416
1,367416
Following your example I have the following: <blink>$Source = Get-ItemProperty HKLM:SoftwareWow6432NodeMicrosoftWindowsCurrentVersionUninstall* $Uninstall = $Source | Where-Object {($_.Publisher -like 'Oracle')-and ($_.DisplayName -like 'Java*')} | select UninstallString $UninstallString = $Uninstall.UninstallString $UninstallSting | ForEach-Object{Invoke-Expression -ScriptBlock ($UninstallString)} <blink> but the last part where i try to run each string keeps failing and i cant figure out why
– Konstantin V
Nov 27 '18 at 23:59
add a comment |
Following your example I have the following: <blink>$Source = Get-ItemProperty HKLM:SoftwareWow6432NodeMicrosoftWindowsCurrentVersionUninstall* $Uninstall = $Source | Where-Object {($_.Publisher -like 'Oracle')-and ($_.DisplayName -like 'Java*')} | select UninstallString $UninstallString = $Uninstall.UninstallString $UninstallSting | ForEach-Object{Invoke-Expression -ScriptBlock ($UninstallString)} <blink> but the last part where i try to run each string keeps failing and i cant figure out why
– Konstantin V
Nov 27 '18 at 23:59
Following your example I have the following: <blink>$Source = Get-ItemProperty HKLM:SoftwareWow6432NodeMicrosoftWindowsCurrentVersionUninstall* $Uninstall = $Source | Where-Object {($_.Publisher -like 'Oracle')-and ($_.DisplayName -like 'Java*')} | select UninstallString $UninstallString = $Uninstall.UninstallString $UninstallSting | ForEach-Object{Invoke-Expression -ScriptBlock ($UninstallString)} <blink> but the last part where i try to run each string keeps failing and i cant figure out why
– Konstantin V
Nov 27 '18 at 23:59
Following your example I have the following: <blink>$Source = Get-ItemProperty HKLM:SoftwareWow6432NodeMicrosoftWindowsCurrentVersionUninstall* $Uninstall = $Source | Where-Object {($_.Publisher -like 'Oracle')-and ($_.DisplayName -like 'Java*')} | select UninstallString $UninstallString = $Uninstall.UninstallString $UninstallSting | ForEach-Object{Invoke-Expression -ScriptBlock ($UninstallString)} <blink> but the last part where i try to run each string keeps failing and i cant figure out why
– Konstantin V
Nov 27 '18 at 23:59
add a comment |
So i was able to figure it out so here is what I came up with which seem to work
Set "Source" variable to registry location
$Source = Get-ItemProperty HKLM:SoftwareWow6432NodeMicrosoftWindowsCurrentVersionUninstall*
Set "Uninstall" variable to inherit from source and reduce the scope to Oracle and Java
$Uninstall = $Source | Where-Object {($_.Publisher -like '*Oracle*')-and ($_.DisplayName -like 'Java*')} | select UninstallString
Set "UninstallString" variable to get only the uninstall string from "Uninstall" variable
$UninstallStrings = $Uninstall.UninstallString -replace "MsiExec.exe ","MsiExec.exe /qn " -replace "/I","/X"
Run all the uninstall strings
ForEach($UninstallString in $UninstallStrings){& cmd /c "$UninstallString"}
I am sure it can be a lot cleaner but this is the best i can do for now. For some versions of java the uninstall strings would give /i variable instead of /x (JDK 6) which is why i had to do the second replace statement.
Example:
UninstallString
---------------
MsiExec.exe /X{26A24AE4-039D-4CA4-87B4-2F03217079FF}
MsiExec.exe /X{26A24AE4-039D-4CA4-87B4-2F83216045FF}
MsiExec.exe /I{32A3A4F4-B792-11D6-A78A-00B0D0160450}
add a comment |
So i was able to figure it out so here is what I came up with which seem to work
Set "Source" variable to registry location
$Source = Get-ItemProperty HKLM:SoftwareWow6432NodeMicrosoftWindowsCurrentVersionUninstall*
Set "Uninstall" variable to inherit from source and reduce the scope to Oracle and Java
$Uninstall = $Source | Where-Object {($_.Publisher -like '*Oracle*')-and ($_.DisplayName -like 'Java*')} | select UninstallString
Set "UninstallString" variable to get only the uninstall string from "Uninstall" variable
$UninstallStrings = $Uninstall.UninstallString -replace "MsiExec.exe ","MsiExec.exe /qn " -replace "/I","/X"
Run all the uninstall strings
ForEach($UninstallString in $UninstallStrings){& cmd /c "$UninstallString"}
I am sure it can be a lot cleaner but this is the best i can do for now. For some versions of java the uninstall strings would give /i variable instead of /x (JDK 6) which is why i had to do the second replace statement.
Example:
UninstallString
---------------
MsiExec.exe /X{26A24AE4-039D-4CA4-87B4-2F03217079FF}
MsiExec.exe /X{26A24AE4-039D-4CA4-87B4-2F83216045FF}
MsiExec.exe /I{32A3A4F4-B792-11D6-A78A-00B0D0160450}
add a comment |
So i was able to figure it out so here is what I came up with which seem to work
Set "Source" variable to registry location
$Source = Get-ItemProperty HKLM:SoftwareWow6432NodeMicrosoftWindowsCurrentVersionUninstall*
Set "Uninstall" variable to inherit from source and reduce the scope to Oracle and Java
$Uninstall = $Source | Where-Object {($_.Publisher -like '*Oracle*')-and ($_.DisplayName -like 'Java*')} | select UninstallString
Set "UninstallString" variable to get only the uninstall string from "Uninstall" variable
$UninstallStrings = $Uninstall.UninstallString -replace "MsiExec.exe ","MsiExec.exe /qn " -replace "/I","/X"
Run all the uninstall strings
ForEach($UninstallString in $UninstallStrings){& cmd /c "$UninstallString"}
I am sure it can be a lot cleaner but this is the best i can do for now. For some versions of java the uninstall strings would give /i variable instead of /x (JDK 6) which is why i had to do the second replace statement.
Example:
UninstallString
---------------
MsiExec.exe /X{26A24AE4-039D-4CA4-87B4-2F03217079FF}
MsiExec.exe /X{26A24AE4-039D-4CA4-87B4-2F83216045FF}
MsiExec.exe /I{32A3A4F4-B792-11D6-A78A-00B0D0160450}
So i was able to figure it out so here is what I came up with which seem to work
Set "Source" variable to registry location
$Source = Get-ItemProperty HKLM:SoftwareWow6432NodeMicrosoftWindowsCurrentVersionUninstall*
Set "Uninstall" variable to inherit from source and reduce the scope to Oracle and Java
$Uninstall = $Source | Where-Object {($_.Publisher -like '*Oracle*')-and ($_.DisplayName -like 'Java*')} | select UninstallString
Set "UninstallString" variable to get only the uninstall string from "Uninstall" variable
$UninstallStrings = $Uninstall.UninstallString -replace "MsiExec.exe ","MsiExec.exe /qn " -replace "/I","/X"
Run all the uninstall strings
ForEach($UninstallString in $UninstallStrings){& cmd /c "$UninstallString"}
I am sure it can be a lot cleaner but this is the best i can do for now. For some versions of java the uninstall strings would give /i variable instead of /x (JDK 6) which is why i had to do the second replace statement.
Example:
UninstallString
---------------
MsiExec.exe /X{26A24AE4-039D-4CA4-87B4-2F03217079FF}
MsiExec.exe /X{26A24AE4-039D-4CA4-87B4-2F83216045FF}
MsiExec.exe /I{32A3A4F4-B792-11D6-A78A-00B0D0160450}
answered Nov 29 '18 at 22:45
Konstantin VKonstantin V
118118
118118
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53490170%2fhow-to-remove-all-oracle-java-using-powershell%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
Win32_Product is evil. Do not use it.
– Ansgar Wiechers
Nov 26 '18 at 22:42