Desinstalando um programa InstallShield InstallScript MSI usando C # silenciosamente

Isso será muito específico para o InstallShield, por isso duvido que alguém tenha lidado com isso antes, mas escrevi um arquivo em lotes para desinstalar versões anteriores do nosso produto e ele não funciona. (Sempre desinstalamos versões anteriores antes de uma instalação / atualização, pois as atualizações no InstallShield parecem não funcionar). A desinstalação dos projetos MSI do InstallScript é muito diferente das desinstalações comuns, pois você precisa "registrar" uma desinstalação e armazenar os resultados em um arquivo, por exemplo:

setup.exe /x /r /f1"C:\temp\UNINST.ISS"

Isso armazena a imagem de desinstalação em c: \ temp \ UNINST.ISS e, em seguida, é necessário passar isso para o desinstalador para que o produto seja desinstalado:

setup.exe /s /f1"UNINST.ISS"

Portanto, fiz isso para todas as versões anteriores do nosso produto e, em seguida, escrevi um script em lote (com o código do produto {7F2A0A82-BB08-4062-85F8-F21BFC3F3708} para fazer as desinstalações mais ou menos assim:

echo Uninstalling 5.3.0
pause
if exist "C:\Program Files (x86)\InstallShield Installation Information\ {7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup.exe" (
    del /q "C:\Program Files (x86)\InstallShield Installation Information\{7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup-5.3.0.exe"
    copy /y "C:\Program Files (x86)\InstallShield Installation Information\{7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup.exe" "C:\Program Files (x86)\InstallShield Installation Information\{7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup-5.3.0.exe"
    cls
    echo Uninstalling 5.3.0
    "C:\Program Files (x86)\InstallShield Installation Information\{7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup-5.3.0.exe" /s /f1".\Uninstall response files\5.3.0\UNINST-5.3.0.ISS"
    :wait1
        timeout /t 3 /NOBREAK > nul
        tasklist | find /i "Setup-5.3.0.exe" >nul 2>nul
        if not errorlevel 1 goto wait1
)

echo Uninstalling 5.3.1...

O problema é que não funciona. Se eu executar a desinstalação a partir de uma janela CMD elevada, ela funcionará bem:

"C:\Program Files (x86)\InstallShield Installation Information\{7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup-5.3.0.exe" /s /f1".\Uninstall response files\5.3.0\UNINST-5.3.0.ISS"

Mas quando executo o script em lote, ele parece passar direto pela desinstalação e não faz nada. Então, pensei em tentar escrever um programa C # simples para fazer isso, mas isso também não está funcionando:

Console.Clear();
Console.WriteLine("Uninstalling 5.3.0");
if (File.Exists(@"C:\Program Files (x86)\InstallShield Installation Information\{7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup.exe"))
    {
        File.Copy(@"C:\Program Files (x86)\InstallShield Installation Information\{7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup.exe", @"C:\Program Files (x86)\InstallShield Installation Information\{7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup-5.3.0.exe", true);

        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.FileName = @"C:\Program Files (x86)\InstallShield Installation Information\{7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup-5.3.0.exe";
        Directory.SetCurrentDirectory(@"..\..\..\");
        startInfo.Arguments = "/s / f1\".\\Uninstall response files\\5.3.0\\UNINST-5.3.0.ISS\"";
        startInfo.UseShellExecute = false;
        startInfo.WindowStyle = ProcessWindowStyle.Normal;
        using (Process process = new Process())
        {
            process.StartInfo = startInfo;
            process.Start();
            process.WaitForExit();
        }
    }

Tentei depurar isso e confirmei que o diretório atual está correto (usandoDirectory.GetCurrentDirectory()), mas recebo este erro:

process.StandardError' threw an exception of type 'System.InvalidOperationException'    System.IO.StreamReader {System.InvalidOperationException}

questionAnswers(2)

yourAnswerToTheQuestion