Domanda

Sono in grado di disinstallare con successo un'applicazione di terze parti tramite la riga di comando e tramite un programma di installazione Inno Setup personalizzato.

Esecuzione dalla riga di comando:

MSIEXEC.exe /x {14D74337-01C2-4F8F-B44B-67FC613E5B1F} /qn

Comando di installazione Inno:

[Run]
Filename: msiexec.exe; Flags: runhidden waituntilterminated; 
Parameters: "/x {{14D74337-01C2-4F8F-B44B-67FC613E5B1F} /qn";
StatusMsg: "Uninstalling Service...";

Sono anche in grado di disinstallare l'applicazione a livello di codice durante l'esecuzione del seguente codice C# in modalità debug.

Codice C#:

string fileName = "MSIEXEC.exe";
string arguments = "/x {14D74337-01C2-4F8F-B44B-67FC613E5B1F} /qn";

ProcessStartInfo psi = new ProcessStartInfo(fileName, arguments)
{
    CreateNoWindow = true,
    UseShellExecute = false,
    RedirectStandardOutput = true
};

Process process = Process.Start(psi);
string errorMsg = process.StandardOutput.ReadToEnd();
process.WaitForExit();

Lo stesso codice C#, tuttavia, produce il seguente output di errore quando viene eseguito come servizio Windows compilato e distribuito:

"This action is only valid for products that are currently installed."

Commenti aggiuntivi:

  • Il servizio Windows che sta emettendo il comando di disinstallazione è in esecuzione sulla stessa macchina del codice testato in modalità di debug.Il servizio Windows è in esecuzione/connesso come account di sistema locale.
  • Ho consultato i miei registri delle applicazioni e ho convalidato che gli argomenti di comando eseguiti sono uguali in modalità debug e di rilascio.
  • Ho consultato lo spettatore per eventi ma non offre alcun indizio.

Pensieri?Qualsiasi aiuto sarebbe molto apprezzato.Grazie.

È stato utile?

Soluzione 3

Grazie a chi offre aiuto.Sembra che si tratti di un problema di permessi.Ho aggiornato il mio servizio affinché venga eseguito con un account amministratore e sono riuscito a disinstallare correttamente l'applicazione di terze parti.Secondo Orion, sebbene l'account del sistema locale sia un account potente che ha pieno accesso al sistema -- http://technet.microsoft.com/en-us/library/cc782435.aspx - non sembra avere i diritti necessari per eseguire la disinstallazione.

[Vedi commenti aggiuntivi per la storia completa relativa alla capacità di LocalSystem di disinstallare l'applicazione per la quale è stata installata.]

Altri suggerimenti

Passo 1: Controllare i file di registro degli errori MSI

Ho il sospetto che il tuo problema sia dovuto all'esecuzione come LocalSystem.

L'account di sistema locale non è uguale a un normale account utente che dispone di diritti di amministratore.Non ha accesso alla rete e la sua interazione con il registro e il file system è molto diversa.

Dalla memoria, qualsiasi richiesta di lettura/scrittura nella tua 'home directory' o HKCU nel registro entra effettivamente nel profilo utente predefinito o, nel caso delle directory temporanee, c:\windows\temp

Ho riscontrato problemi simili in passato con l'installazione, un cliente utilizzava l'account SYSTEM per eseguire l'installazione e questo causava ogni sorta di problemi di autorizzazione per gli utenti non amministrativi.

I file di registro MSI non saranno di grande aiuto se l'applicazione non appare "installata", suggerirei di iniziare con l'acquisizione dell'output di MSIINV.EXE sotto l'account di sistema, che ti fornirà un "Inventario" dei programmi attualmente installati (o ciò che l'utente vede installato) http://blogs.msdn.com/brada/archive/2005/06/24/432209.aspx

Penso che probabilmente dovrai tornare al tavolo da disegno e vedere se hai davvero bisogno del servizio Windows per eseguire la disinstallazione.Probabilmente ti imbatterai in tutti i tipi di problemi UAC di Vista se non l'hai già fatto...

Questo è bizzarro.LocalSystem ha sicuramente i privilegi per installare le applicazioni (è così che funzionano Windows Update e la distribuzione del software in Active Directory), quindi dovrebbe essere anche in grado di disinstallarle.

Forse l'applicazione è inizialmente installata per utente anziché per macchina?

@Paul Lalonde

Il programma di installazione dell'app è racchiuso in un programma di installazione InnoSetup personalizzato.Il programma di installazione di InnoSetup, a sua volta, viene eseguito manualmente dall'utente che ha effettuato l'accesso.Detto questo, la disinstallazione viene attivata da un servizio in esecuzione con l'account di sistema locale.

A quanto pare, stavi facendo qualcosa.Ho messo insieme un rapido test in cui ho installato il servizio in esecuzione con l'account LocalSystem e ho disinstallato l'applicazione e tutto ha funzionato perfettamente.Avevi ragione.L'account LocalSystem ha richiesto autorizzazioni di disinstallazione per le applicazioni in cui viene installato.Hai salvato la giornata.Grazie per il feedback!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top