2014-04-28 27 views
12

Ho un exe di aggiornamento che si intende chiudere l'exe primario, sostituirlo con un exe aggiornato e quindi avviare quello exe aggiornato. Quando il programma di aggiornamento tenta di avviare l'exe aggiornato, se la finestra di dialogo Autorizzazioni UAC viene negata dall'utente, il programma di aggiornamento si bloccherà. Questo perché la funzione Process.Start() non restituisce mai. Il mio misuratore dei cicli della CPU indica praticamente nessun utilizzo btw.Process.Start non ritorna mai quando UAC negato

Spero che tutti i miei utenti diano "sì" al Controllo dell'account utente, ma poiché sono qui mi piacerebbe gestire questo caso con una sorta di messaggio di errore almeno. Supponiamo che i miei utenti abbiano almeno Windows 7. Gli stessi exe sono applicazioni Winforms a 32 bit. Il framework .Net designato è 4.0. Utilizzando Visual Studio 2010 Ultimate.

Qualche idea su come rilevare quando il mio utente rifiuta la finestra di dialogo UAC?

Sto indovinando tutto quello che posso fare è eseguire il Process.Start() su un thread separato che verrà timeout dopo un po '. Per ulteriori code:

private void RestartProcess() 
{ 
    ProcessStartInfo startInfo = new ProcessStartInfo(); 
    startInfo.FileName = @"C:\Users\Me\Documents\Visual Studio 2010\Projects\updated.exe"; 
    MessageBox.Show("Attempting to start process"); 
    Process newProc = Process.Start(startInfo); 
    MessageBox.Show("If this shows, the user has clicked YES in the UAC."); 
} 

Soluzione:

Process.Start() uscite in silenzio con un Win32Exception a meno che non si usa un blocco try {} catch {} per catturare l'errore.

+1

Altro codice per favore. –

+0

Suppongo (in base a ciò che hai indicato sopra) che tu sappia quando un utente fa clic su "Sì" nella finestra di dialogo UAC, giusto? Se lo sai, perché non utilizzare la proprietà [Proprietà DialogResult] (http://msdn.microsoft.com/en-us/library/system.windows.forms.form.dialogresult (v = vs.110) .aspx) per gestire il caso di un "No"? – Brandon

+0

Hai provato a armeggiare con [Manifest] (http://msdn.microsoft.com/en-us/library/bb756929.aspx)? Non dare nemmeno agli utenti la possibilità di dire No. – tyh

risposta

7
Process newProc = Process.Start(startInfo); 
    MessageBox.Show("If this shows, the user has clicked YES in the UAC."); 

Questo è normale, l'eccezione sollevata da Process.Start() ignorerà la chiamata MessageBox.Show(). È un Win32Exception per il codice di errore di Windows 1223, ERROR_CANCELLED, "L'operazione è stata annullata dall'utente".

Evidentemente vorrai evitare di ingoiare le eccezioni qui.

+0

Perfetto. Tutto ciò che era richiesto era una semplice dichiarazione di cattura. Grazie, signor Passant. –