Domanda

Ho un'applicazione che verificherebbe gli aggiornamenti all'inizio e, se vengono trovati gli aggiornamenti, coprirebbe alcuni file sulla rete nella cartella dei file del programma. Ovviamente tale attività non può essere eseguita da Standard Users In scenari normali.

Ho provato a creare un servizio per eseguire il processo di aggiornamento ma ho avuto alcuni problemi di sicurezza e io ha chiesto questa domanda a riguardo nei superuseri.

Ora, considerando il fatto che la maggior parte delle applicazioni richiede privilegi elevati per svolgere tale compito, penso che potrebbe essere l'approccio giusto. Ma come posso richiedere l'elevazione per l'aggiornamento in tutta la versione di Windows, incluso. Ho trovato molti argomenti su un file manifest, ma dal momento che ho bisogno di funzionare con XP non posso creare una soluzione specifica per Uac.

È stato utile?

Soluzione

I privilegi possono essere elevati solo all'avvio per un processo; I privilegi di un processo in esecuzione non possono essere elevati. Per elevare un'applicazione esistente, è necessario creare una nuova istanza del processo di applicazione, con il verbo "runas":

private static string ElevatedExecute(NameValueCollection parameters)
{
    string tempFile = Path.GetTempFileName();
    File.WriteAllText(tempFile, ConstructQueryString(parameters));

    try
    {
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.UseShellExecute = true;
        startInfo.WorkingDirectory = Environment.CurrentDirectory;
        Uri uri = new Uri(Assembly.GetExecutingAssembly().GetName().CodeBase);
        startInfo.FileName = uri.LocalPath;
        startInfo.Arguments = "\"" + tempFile + "\"";
        startInfo.Verb = "runas";
        Process p = Process.Start(startInfo);
        p.WaitForExit();
        return File.ReadAllText(tempFile);
    }
    catch (Win32Exception exception)
    {
        return exception.Message;
    }
    finally
    {
        File.Delete(tempFile);
    }
}

Dopo che l'utente conferma l'esecuzione del programma come amministratore, un'altra istanza della stessa applicazione viene eseguita senza un'interfaccia utente; Si può visualizzare un'interfaccia utente in esecuzione senza privilegi elevati e un'altra in esecuzione in background con privilegi elevati. Il primo processo attende fino a quando il secondo termina la sua esecuzione. Per ulteriori informazioni e un esempio funzionante puoi controllare il Archivio MSDN.

Per impedire a tutti questi dialoghi shenanigans nel mezzo di un lungo processo, dovrai eseguire l'intero processo host con autorizzazioni elevate da Incorporare il manifest appropriato nella tua domanda Per richiedere il livello di esecuzione "più alto": ciò farà apparire il prompt UAC non appena l'app viene avviata e causerà il funzionamento di tutti i processi figlio con autorizzazioni elevate senza ulteriori suggerimenti.

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