¿Elevar el privilegio del proceso mediante programación?
Estoy intentando instalar un servicio usando InstallUtil.exe pero lo invoco a través de Process.Start
. Aquí está el código:
ProcessStartInfo startInfo = new ProcessStartInfo (m_strInstallUtil, strExePath);
System.Diagnostics.Process.Start (startInfo);
¿Dónde m_strInstallUtil
está la ruta completa y el archivo ejecutable de "InstallUtil.exe" y strExePath
es la ruta/nombre completo de mi servicio?
Ejecutar la sintaxis de la línea de comando desde un símbolo del sistema elevado funciona; ejecutar desde mi aplicación (usando el código anterior) no lo hace. Supongo que estoy lidiando con algún problema de elevación del proceso, entonces, ¿cómo ejecutaría mi proceso en un estado elevado? ¿ Necesito buscar ShellExecute
esto?
Todo esto es en Windows Vista. Estoy ejecutando el proceso en el depurador VS2008 elevado a privilegios de administrador.
También intenté configurarlo startInfo.Verb = "runas";
pero no pareció resolver el problema.
Puede indicar que el nuevo proceso debe iniciarse con permisos elevados configurando la propiedad Verb de su objeto startInfo en 'runas', de la siguiente manera:
startInfo.UseShellExecute = true;
startInfo.Verb = "runas";
Esto hará que Windows se comporte como si el proceso se hubiera iniciado desde el Explorador con el comando de menú "Ejecutar como administrador".
Esto significa que aparecerá el mensaje de UAC y el usuario deberá reconocerlo: si esto no es deseable (por ejemplo, porque sucedería en medio de un proceso largo), deberá ejecutar todo el proceso de host con permisos elevados mediante Crear e incrustar un manifiesto de aplicación (UAC) para requerir el nivel de ejecución 'más alto disponible': esto hará que el mensaje de UAC aparezca tan pronto como se inicie su aplicación y hará que todos los procesos secundarios se ejecuten con permisos elevados sin necesidad de solicitar más .
Este código reúne todo lo anterior y reinicia la aplicación WPF actual con privilegios de administrador:
if (IsAdministrator() == false)
{
// Restart program and run as admin
var exeName = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
ProcessStartInfo startInfo = new ProcessStartInfo(exeName);
startInfo.Verb = "runas";
System.Diagnostics.Process.Start(startInfo);
Application.Current.Shutdown();
return;
}
private static bool IsAdministrator()
{
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
// To run as admin, alter exe manifest file after building.
// Or create shortcut with "as admin" checked.
// Or ShellExecute(C# Process.Start) can elevate - use verb "runas".
// Or an elevate vbs script can launch programs as admin.
// (does not work: "runas /user:admin" from cmd-line prompts for admin pass)
Actualización: se prefiere la forma de manifiesto de la aplicación:
Haga clic derecho en el proyecto en Visual Studio, agregue un nuevo archivo de manifiesto de aplicación, cambie el archivo para que tenga requireAdministrator configurado como se muestra arriba.
Un problema con la forma original: si coloca el código de reinicio en app.xaml.cs OnStartup, aún puede iniciar la ventana principal brevemente aunque se haya llamado a Shutdown. Mi ventana principal explotaba si app.xaml.cs init no se ejecutaba y en determinadas condiciones de carrera lo haría.
Según el artículo Chris Corio: Teach Your Apps To Play Nicely With Windows Vista User Account Control, MSDN Magazine, enero de 2007 , solo ShellExecute
verifica el manifiesto incrustado y solicita al usuario la elevación si es necesario, mientras CreateProcess
que otras API no lo hacen. Espero eso ayude.
Ver también: mismo artículo que .chm .
[PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")]
Esto lo hará sin UAC; no es necesario iniciar un nuevo proceso. Si el usuario que ejecuta es miembro del grupo de administradores como en mi caso.
Sé que esta es una publicación muy antigua, pero solo quería compartir mi solución:
System.Diagnostics.ProcessStartInfo StartInfo = new System.Diagnostics.ProcessStartInfo
{
UseShellExecute = true, //<- for elevation
Verb = "runas", //<- for elevation
WorkingDirectory = Environment.CurrentDirectory,
FileName = "EDHM_UI_Patcher.exe",
Arguments = @"\D -FF"
};
System.Diagnostics.Process p = System.Diagnostics.Process.Start(StartInfo);
NOTA: Si VisualStudio ya está ejecutando Elevated, entonces el cuadro de diálogo UAC no aparecerá; para probarlo, ejecute el archivo ejecutable desde la carpeta bin.