2009-10-27 18 views
6

Ho questa applicazione che deve fare alcune cose in percorsi protetti (come% PROGRAMFILES%), so che dovrei usare% APPDATA%, ma non posso cambiarlo per adesso. Ho isolato tutte le cose che potrebbero richiedere UAC di presentarsi su un altro progetto, ecco un esempio di codice:Pimp mio UAC e alcune domande a riguardo

using System; 
using System.Diagnostics; 
using System.IO; 
using System.Windows.Forms; 

class Class1 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      File.CreateText(Path.Combine(Application.StartupPath, "something.txt")); 
     } 
     catch (UnauthorizedAccessException ex) 
     { 
      MessageBox.Show(ex.Message, "UnauthorizedAccessException", MessageBoxButtons.OK, MessageBoxIcon.Error); 

      if (args.Length == 0) 
      { 
       Process proc = new Process(); 
       proc.StartInfo.FileName = Application.ExecutablePath; 
       proc.StartInfo.Arguments = "not again"; 
       proc.StartInfo.Verb = "runas"; 
       proc.Start(); 
      } 
      else 
      { 
       MessageBox.Show("Exit to avoid loop."); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 
} 

Quindi, io chiamo questo eseguibile dal mio programma principale, e se non riesce a causa di un accesso non autorizzato, si avvierà da solo mostrando la richiesta UAC.

Le mie domande sono:

1) ho dovuto convertire l'uscita del progetto da una DLL a un EXE, perché non riuscivo a trovare un modo per richiedere UAC elevazione da una DLL, non v'è alcun modo semplice per farlo quella?

2) Ho anche notato che alcuni programmi visualizzano un messaggio UAC personalizzato, con il logo del programma e tutte quelle cose, mi permetta di mostrare un esempio:

Ugly UAC

Personalized UAC

Come può Lo faccio per il mio programma?

3) Per evitare di entrare in un ciclo quando è in esecuzione con privilegi elevati e ottiene un altro UnauthorizedAccessException ho fatto quella cosa passando tutti gli argomenti. Cosa faresti per raggiungere lo stesso obiettivo?

Penso che sia tutto per ora. Grazie per il tuo tempo.

+0

Per quanto riguarda i colori, quelli dipendono dal programma. Vedi http://news.softpedia.com/images/news2/Windows-Vista-UAC-Colors-3.png per un breve riepilogo. – sisve

risposta

4

1 non è possibile controllare la modalità di elevazione del processo che ospita la DLL. È possibile grant permission to the target folder or registry per tutti during the install process se è possibile controllare il processo di installazione.

2 è necessario sign the program with a certificate published by a certificate authority that would be trusted by the client. Visita il tuo negozio di certificati locale (pannello di controllo-> Opzioni Internet, scheda contenuto, editori) per vedere le autorità di certificazione comuni.

3 quando si ottiene UnauthorizedAccessExceotion, lanciarlo sull'host di hosting o restituire un valore di errore che indica un problema di sicurezza. Il chiamante della DLL decide quindi cosa fare, come visualizzare una finestra di dialogo di errore di sicurezza per informare l'utente se il programma è già elevato (autorizzazione non concessa dal controller di dominio?), Oppure restarting the process in elevated mode using the runas command se non è elevato.

6

Ho avuto gli stessi problemi. Googling circa 2 giorni ho trovato l'unica soluzione che si adatta alle mie esigenze - avviare l'applicazione con diritti amministrativi. Inizio l'applicazione, controllo se viene eseguita come amministratore. E se non lo fa - riavviare con diritti amministrativi.

static void Main(string[] args) 
    { 
     if (NeedElevation(args) && Elevate(args)) 
     { // If elevastion succeeded then quit. 
      return; 
     } 
     // your code here 
    } 

    public static bool Elevate(string[] args) 
    { 
     try 
     { 
      ProcessStartInfo info = Process.GetCurrentProcess().StartInfo; 
      info.Verb = "runas"; 
      info.Arguments = NoElevateArgument; 
      foreach (string arg in args) 
      { 
       info.Arguments += ' ' + arg; 
      } 
      info.FileName = Assembly.GetEntryAssembly().Location; 

      Process process = new System.Diagnostics.Process(); 
      process.StartInfo = info; 

      process.Start(); 
     } 
     catch (Exception) 
     { 
      MessageBox.Show("You don't have administrative privileges thus the Automatic Application Updates cannot be started. But the rest of application is available as usually.", 
       "Not enough user rights", MessageBoxButtons.OK, MessageBoxIcon.Information); 
      return false; 
     } 

     return true; 
    } 
+0

TU sei un risparmiatore di vita. Grazie, ha funzionato magnificamente. – GR7

Problemi correlati