Cómo iniciar un proceso como modo de administrador en C #

Tengo un proyecto de aplicación de Visual Studio para Windows. He agregado código para descargar un archivo de actualización del instalador. El instalador después de que haya finalizado la descarga necesitaría privilegios de administrador para ejecutarse. He agregado un archivo de manifiesto.

Cuando el usuario hace clic en DownloadUpdate.exe, UAC solicita al usuario los permisos de administrador. Así que asumí que todos los procesos creados y llamados dentro de DownloadUpdate.exe se ejecutarán en la capacidad de administración. Así que hice la configuración de llamar a mi archivo descargado con el siguiente código:

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; 

Prueba esto:

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

Alternativamente, vaya a la ruta manifiesta para su aplicación .

Esta es una respuesta clara a su pregunta: ¿Cómo fuerzo a mi aplicación .NET a ejecutarse como administrador?

Resumen:

Haga clic con el botón derecho en el proyecto -> Agregar nuevo elemento -> Archivo de manifiesto de la aplicación

Luego, en ese archivo, cambie una línea como esta:

  

¡Comstack y ejecuta!

Esto funciona cuando lo bash. Comprobé dos veces con dos progtwigs de muestra:

 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(); } } } } 

Primero verifiqué que obtuve la bomba UAC:

System.UnauthorizedAccessException: se deniega el acceso a la ruta ‘c: \ program files \ test.txt’.
// etc.

Luego se agregó un manifiesto a ConsoleApplication1 con la frase:

   

Sin bomba Y un archivo que no puedo borrar fácilmente 🙂 Esto es consistente con varias pruebas previas en varias máquinas con Vista y Win7. El progtwig iniciado hereda el token de seguridad del progtwig de inicio. Si el juez de salida ha adquirido privilegios de administrador, el progtwig iniciado también los tiene.

Antes que nada, debes incluirlo en tu proyecto

 using System.Diagnostics; 

Después de eso, podría escribir un método general que podría usar para diferentes archivos .exe que quiera usar. Sería como a continuación:

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

Si quiere, por ejemplo, ejecutar notepad.exe, entonces todo lo que hace es llamar a este método:

 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, ""); 

Funciona también con ProcessStartInfo :

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

Este es un ejemplo del proceso de ejecución como administrador sin 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(); 

Probablemente necesites configurar tu aplicación como una aplicación x64.

El complemento de IIS solo funciona en 64 bits y no funciona en 32 bits, y un proceso generado a partir de una aplicación de 32 bits parece funcionar como un proceso de 32 bits y lo mismo ocurre con las aplicaciones de 64 bits.

Mira: el proceso de inicio es de 64 bits

Usa este método:

 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; } } 

Espero eso ayude.

  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();