tag - Cómo iniciar un proceso como modo de administrador en C#
summary example c# (9)
Esta pregunta ya tiene una respuesta aquí:
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;
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");
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:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
¡Compila y ejecuta!
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();
Esto funciona cuando lo intento. Comprobé dos veces con dos programas 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:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
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 programa iniciado hereda el token de seguridad del programa de inicio. Si el juez de salida ha adquirido privilegios de administrador, el programa iniciado también los tiene.
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
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 .
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();
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);