¿Elevar el privilegio del proceso mediante programación?

Resuelto Scott Marlowe asked hace 15 años • 7 respuestas

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_strInstallUtilestá la ruta completa y el archivo ejecutable de "InstallUtil.exe" y strExePathes 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 ShellExecuteesto?

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.

Scott Marlowe avatar Sep 25 '08 20:09 Scott Marlowe
Aceptado

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 .

mdb avatar Sep 25 '2008 13:09 mdb

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.

Curtis Yallop avatar Jun 05 '2012 22:06 Curtis Yallop

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 ShellExecuteverifica el manifiesto incrustado y solicita al usuario la elevación si es necesario, mientras CreateProcessque otras API no lo hacen. Espero eso ayude.

Ver también: mismo artículo que .chm .

 avatar Oct 23 '2008 23:10
[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.

hB0 avatar Jan 12 '2012 08:01 hB0

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.

Jhollman avatar Jan 05 '2022 20:01 Jhollman