Come avviare un processo come modalità amministratore in C #

Ho un progetto di app di Visual Studio per Windows. Ho aggiunto il codice per scaricare un file di aggiornamento del programma di installazione. Il programma di installazione dopo il completamento del download richiede i privilegi di amministratore per l’esecuzione. Ho aggiunto un file manifest.

Quando l’utente fa clic su DownloadUpdate.exe, UAC richiede all’utente le autorizzazioni di amministratore. Quindi ho assunto che tutti i processi creati e chiamati all’interno di DownloadUpdate.exe vengano eseguiti nella capacità di amministrazione. Così ho fatto in modo che l’installazione chiamasse il mio file scaricato con il seguente codice:

Process p = new Process(); p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; p.StartInfo.FileName = strFile; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardError = true; 

Prova questo:

 //Vista or higher check if (System.Environment.OSVersion.Version.Major >= 6) { p.StartInfo.Verb = "runas"; } 

In alternativa, usa il percorso manifest per la tua applicazione .

Questa è una risposta chiara alla tua domanda: come posso forzare l’esecuzione della mia applicazione .NET come amministratore?

Sommario:

Fare clic destro sul progetto -> Aggiungi nuovo elemento -> File manifest dell’applicazione

Quindi in quel file cambia una riga come questa:

  

Compila ed esegui!

Funziona quando ci provo. Ho verificato due volte con due programmi di esempio:

 using System; using System.Diagnostics; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Process.Start("ConsoleApplication2.exe"); } } } 

 using System; using System.IO; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { try { File.WriteAllText(@"c:\program files\test.txt", "hello world"); } catch (Exception ex) { Console.WriteLine(ex.ToString()); Console.ReadLine(); } } } } 

Prima ho verificato di avere la bomba UAC:

System.UnauthorizedAccessException: l’accesso al percorso ‘c: \ program files \ test.txt’ è negato.
// eccetera..

Quindi aggiunto un manifest a ConsoleApplication1 con la frase:

   

Nessuna bomba E un file che non posso cancellare facilmente 🙂 Questo è coerente con diversi test precedenti su varie macchine che eseguono Vista e Win7. Il programma avviato eredita il token di sicurezza dal programma di avviamento. Se lo starter ha acquisito i privilegi di amministratore, anche il programma avviato li ha.

Prima di tutto devi includere nel tuo progetto

 using System.Diagnostics; 

Successivamente è ansible scrivere un metodo generale che è ansible utilizzare per diversi file .exe che si desidera utilizzare. Sarebbe come sotto:

 public void ExecuteAsAdmin(string fileName) { Process proc = new Process(); proc.StartInfo.FileName = fileName; proc.StartInfo.UseShellExecute = true; proc.StartInfo.Verb = "runas"; proc.Start(); } 

Se vuoi ad esempio eseguire notepad.exe, allora tutto ciò che fai è chiamare questo metodo:

 ExecuteAsAdmin("notepad.exe"); 
 var pass = new SecureString(); pass.AppendChar('s'); pass.AppendChar('e'); pass.AppendChar('c'); pass.AppendChar('r'); pass.AppendChar('e'); pass.AppendChar('t'); Process.Start("notepad", "admin", pass, ""); 

Funziona anche con ProcessStartInfo :

 var psi = new ProcessStartInfo { FileName = "notepad", UserName = "admin", Domain = "", Password = pass, UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true }; Process.Start(psi); 

Ecco un esempio del processo di esecuzione come amministratore senza Windows Prompt

  Process p = new Process(); p.StartInfo.FileName = Server.MapPath("process.exe"); p.StartInfo.Arguments = ""; p.StartInfo.UseShellExecute = false; p.StartInfo.CreateNoWindow = true; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.Verb = "runas"; p.Start(); p.WaitForExit(); 

Probabilmente hai bisogno di impostare la tua applicazione come app x64.

IIS Snap In funziona solo a 64 bit e non funziona a 32 bit, e un processo generato da un’applicazione a 32 bit sembra funzionare come un processo a 32 bit e lo stesso vale per le app a 64 bit.

Guarda: Inizia il processo come 64 bit

Usa questo metodo:

 public static int RunProcessAsAdmin(string exeName, string parameters) { try { System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); startInfo.UseShellExecute = true; startInfo.WorkingDirectory = CurrentDirectory; startInfo.FileName = Path.Combine(CurrentDirectory, exeName); startInfo.Verb = "runas"; //MLHIDE startInfo.Arguments = parameters; startInfo.ErrorDialog = true; Process process = System.Diagnostics.Process.Start(startInfo); process.WaitForExit(); return process.ExitCode; } catch (Win32Exception ex) { WriteLog(ex); switch (ex.NativeErrorCode) { case 1223: return ex.NativeErrorCode; default: return ErrorReturnInteger; } } catch (Exception ex) { WriteLog(ex); return ErrorReturnInteger; } } 

Spero che sia d’aiuto.

  Process proc = new Process(); ProcessStartInfo info = new ProcessStartInfo("Your Process name".exe, "Arguments"); info.WindowStyle = ProcessWindowStyle.Hidden; info.UseShellExecute =true; info.Verb ="runas"; proc.StartInfo = info; proc.Start();