2010-04-08 14 views
13

Stiamo lavorando su un sistema di aggiornamento per il nostro software. L'aggiornamento deve essere eseguito in background come servizio e, quando è disponibile un aggiornamento, scaricarlo e installarlo. Abbiamo bisogno del servizio per installare l'aggiornamento dal momento che l'MSI richiede l'elevazione per l'esecuzione, ma alcuni dei nostri clienti saranno utenti con restrizioni.Esecuzione di msiexec da un servizio (account di sistema locale)

L'MSI è un MSI WiX ed esegue un aggiornamento importante durante l'esecuzione. Il problema è che l'aggiornamento non sembra funzionare quando viene eseguito dal nostro servizio. Posso vedere msiexec eseguire e restituisce correttamente, ma sembra non apportare modifiche al sistema. Lo stesso comando, eseguito dal mio account utente funziona come previsto.

Esiste qualche avvertenza sull'esecuzione di msiexec da un servizio di sistema locale?

Stiamo semplicemente facendo:

string arguments = "/i /quiet /lv*x " + pathToLogFile; 
System.Diagnostics.Process.Start("msiexec.exe", arguments); 
+0

Quali argomenti stai passando? Sei sicuro di aver passato gli argomenti giusti per rendere questa un'installazione silenziosa? E cosa fa il tuo programma di installazione? –

+0

Ho aggiornato la domanda per mostrare i nostri argomenti. L'installer potrebbe fare molte cose (a seconda delle funzionalità selezionate), incluse l'aggiunta di chiavi di registro a HKLM e HKCR, l'installazione di driver, la registrazione di oggetti COM e, naturalmente, la copia di file. Sfortunatamente l'accesso dell'amministratore è inevitabile. – Jarrod

+0

Hai provato ad aggiungere l'opzione/qn (msiexec /? Ti mostrerà tutte le opzioni disponibili)? E il file di registro fornisce informazioni su errori o passaggi saltati? Puoi diff il registro con quello di un'installazione di successo? –

risposta

5

Se il servizio è un servizio di Windows quindi effettuare le seguenti operazioni:

  1. proprietà di Open del vostro servizio nella console Servizi.

  2. Vai Log On scheda

  3. Impostare un account dotato di diritti per aggiornare il sistema (il vostro o creato appositamente per questo scopo)

  4. Riavviare il servizio

In questo caso, il servizio verrà eseguito con i diritti appropriati e può eseguire aggiornamenti.

+0

Penso che possiamo fare questo lavoro. Grazie! – Jarrod

0

Avevo anche lo stesso compito descritto sopra e ho scoperto che se il programma è stato installato per TUTTI gli utenti, l'esecuzione di msiexec funzionerebbe da Servizio che è in esecuzione con l'account SYSTEM. Quindi, per fare in modo che funzioni, è necessario installare per TUTTI gli utenti. Nel mio caso, ho specificato il comando msxexec come segue quando il programma viene installato per la prima volta.

msiexec /i setup.msi ALLUSERS="1" 

Una volta eseguita questa operazione, è possibile aggiornare il programma da Servizio senza alcun problema.

0

Potrebbe essere necessario utilizzare il parametro REINSTALLMODE che consente di controllare l'aggiornamento. Se non vengono forniti, l'installazione potrebbe non riuscire ad aggiornare l'app (o almeno è quello che ho trovato, anche se sono ancora un po 'incerto se lo stesso comportamento si applica in System.Diagnostics.Process.Start):

msiexec.exe /i /quiet yourinstaller.msi REINSTALL=All REINSTALLMODE=vomus 

Vedi here per ulteriori informazioni sui vari flag che è possibile passare a msiexec.exe.

3

Nel caso in cui qualcun altro si imbattesse in questo, ecco cosa stavo trovando.

Stavo installando un programma da un servizio eseguito come LocalSystem. L'installazione ritornerebbe immediatamente con il codice di uscita 0. Tuttavia, il programma non sembrava essere installato. I file non sono stati copiati e non sono state create scorciatoie. Guardare nel file di registro era difficile perché non aveva un semplice messaggio di successo o di errore. Quando ho eseguito il servizio come normale account amministratore, ha funzionato correttamente.Ho finalmente notato nel file di registro che ha detto

determinato che prodotto esistente (sia il prodotto o il prodotto essere aggiornato con una patch) è installato per computer.

Non è stato elencato come installato in Pannello di controllo> Programmi, ma per qualche motivo Windows ha pensato che fosse già installato. Sfortunatamente, eseguire msiexec /x per disinstallare il programma non ha avuto alcun effetto.

Ho provato a cambiare il codice del prodotto e il codice di aggiornamento, e viola, ha funzionato. Nel mio caso, ho controllato il codice del prodotto di installazione e i codici di aggiornamento, quindi ho potuto farlo. Se nel caso di qualcun altro, non si dispone di tale accesso, si potrebbe provare a installare qualche altro software arbitrario (che avrà un codice diverso prodotto/aggiornamento) e vedere se funziona, e se lo fa, almeno lo sai questo è il problema

Problemi correlati