¿Cómo fuerzo a mi aplicación .NET a ejecutarse como administrador?

876

Una vez que mi programa está instalado en una máquina cliente, ¿cómo forzo a mi programa a ejecutarse como administrador en Windows 7?

Oro
fuente
3
Además de lo que escribió binario Worrier, es posible que desee escribir algo de código para probar si tiene privilegios de administrador .. (es que lo que está pidiendo?)
Lexu
39
Sin embargo, no tomaría esta tarea a la ligera, debe verificar para qué necesita realmente el administrador y ver si puede solucionarlo. Ningún cliente estará contento de ejecutar una aplicación en modo administrador todo el tiempo. Muchos clientes más grandes ni siquiera considerarán una aplicación como esa, y si la prueba de logotipo es importante para usted, no pasará así.
Alex
2
Alex está muy en punto. Si es posible, solo eleve cuando sea necesario, de lo contrario, la Política de grupo, UAC y una serie de otras variables entran en juego. Por lo menos, con UAC, el usuario tendría que autorizar en cada ejecución en lugar de solo cuando se realiza una acción específica del usuario.
Anthony Mason
La forma correcta es incrustar un archivo de manifiesto en su aplicación.
Elmue

Respuestas:

1145

Querrá modificar el manifiesto que se incrusta en el programa. Esto funciona en Visual Studio 2008 y versiones posteriores: Proyecto + Agregar nuevo elemento, seleccione "Archivo de manifiesto de la aplicación". Cambia el <requestedExecutionLevel>elemento a:

 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

El usuario recibe el aviso de UAC cuando inicia el programa. Use sabiamente; Su paciencia puede agotarse rápidamente.

Hans Passant
fuente
33
Si obtiene un error ClickOnce cuando intenta compilar, vea esta respuesta: stackoverflow.com/questions/11023998/…
SSS
17
Su proyecto también debe configurarse para usar el manifiesto de la aplicación: en Propiedades del proyecto, verifique la pestaña "Aplicación" y asegúrese de que el "Manifiesto:" en 'Recursos' esté configurado en su app.manifest (o lo que sea que haya denominado. archivo de manifiesto).
Victor Chelaru
77
Tuve que volver a cargar el proyecto antes de que VS me pidiera reiniciar en modo administrador.
Jon
3
@Alejandro: Sí, UAC puede deshabilitarse, pero cuando eso sea así, la aplicación se ejecutará automáticamente como administrador (suponiendo que su usuario tenga privilegios de administrador), porque deshabilitar UAC significa que todo se ejecuta con el privilegio más alto permitido al usuario. Es como quejarse de que si instala una cerradura elegante en la puerta, no funcionará si se retira la puerta.
Erik Funkenbusch
44
@ErikFunkenbusch No se "ejecutará automáticamente como administrador", se ejecutará bajo los permisos normales del usuario (administrador si el usuario es administrador, o estándar si el usuario es estándar). Confiar en ese caso particular, incluso si es el predeterminado, es lo que los buenos programas evitarán como la peste. Siguiendo su analogía, la elegante cerradura es agradable y todo, pero el software correctamente diseñado debe anticipar el caso de que se quite toda la puerta, incluso si es una ocurrencia rara.
Alejandro
155

Agregar un requestedExecutionLevelelemento a tu manifiesto es solo la mitad de la batalla; debes recordar que UAC se puede apagar. Si es así, debe realizar la verificación a la manera de la vieja escuela y colocar un cuadro de diálogo de error si el usuario no es administrador
(llame IsInRole(WindowsBuiltInRole.Administrator)a su hilo CurrentPrincipal).

Anders
fuente
22
También es posible usar <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> así
Marcos Kram
18
@ MarkKram: ¿Qué tiene que ver el más altoDisponible con esto? La pregunta es sobre forzar al administrador, el más alto disponible es menos restrictivo que el administrador requerido y permitirá que un usuario que no sea administrador inicie la aplicación sin elevarlo sin aviso de UAC, solo los administradores recibirán un aviso ...
Anders
Ya no recuerdo los detalles exactos, pero creo que esto depende de lo que quieras decir con deshabilitado. Poner el "control deslizante UAC" hasta el final no es lo mismo que deshabilitar UAC (excepto en Vista). Si UAC está completamente deshabilitado, el mecanismo de nivel de integridad completo está deshabilitado y solo está disponible la característica clásica runas.exe de 2000 / XP. La comprobación del rol de administrador maneja el caso runas.exe.
Anders
1
Establecí EnableLUA en 0 en Server 2008 R2 y me eliminé del grupo Administradores, reinicié y ahora se ejecuta un exe que especifica level = "requireAdministrator" sin ningún aviso
Tal Aloni,
87

Los pasos detallados son los siguientes.

  1. Agregar archivo de manifiesto de la aplicación a la solución
  2. Cambie la configuración de la aplicación a "app.manifest"
  3. Actualice la etiqueta de "requiredExecutionLevel" para requireAdministrator.

Agregar archivo a la solución

Seleccionar archivo de manifiesto de la aplicación

Seleccione la opción de manifiesto

Actualizar archivo de manifiesto

Tenga en cuenta que con este código debe desactivar la configuración de seguridad de ClickOnce, para ello, vaya a Propiedades -> Seguridad -> Seguridad de ClickOnce

Hassan Rahman
fuente
New Item...no es una opción en mi proyecto de Servicio de instalación. ¿Cómo haría para agregar el manifiesto de la aplicación? Puedo agregarlo a mi proyecto principal pero no es su instalador.
HackSlash
61

Implementé un código para hacerlo manualmente:

using System.Security.Principal;
public bool IsUserAdministrator()
{
    bool isAdmin;
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch (UnauthorizedAccessException ex)
    {
        isAdmin = false;
    }
    catch (Exception ex)
    {
        isAdmin = false;
    }
    return isAdmin;
}
NG.
fuente
45
Esto solo detecta si el contexto se está ejecutando como administrador, no impide que la aplicación se ejecute como administrador según lo solicitado por el OP
Matt Wilko
55
No creo que haya una forma programática de forzar a una aplicación a elevar sus propios permisos. Si lo hubiera, ese sería un gran riesgo de seguridad, ¿no?
Mark Richman
66
Aunque su solución es buena, la pregunta era diferente. ;)
Yash
vea una versión refactorizada de este método aquí stackoverflow.com/a/50186997 (subjetivo)
Hakan Fıstık
¡Esto no responde la pregunta!
Elmue
19

Mientras trabaja en Visual Studio 2008, haga clic derecho Project -> Add New Itemy luego elija Application Manifest File.

En el archivo de manifiesto, encontrará la etiqueta requestedExecutionLevely puede establecer el nivel en tres valores:

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

O

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

O

<requestedExecutionLevel level="highestAvailable" uiAccess="false" />

Para configurar su aplicación para que se ejecute como administrador, debe elegir la del medio.

Rashad Maqsood
fuente
Esto funciona. Sin embargo, hizo que apareciera una ventana cmd en blanco al ejecutar la aplicación CMD (usando la aplicación c # cmd para ejecutar un exe en segundo plano).
WM
13

Según

<requestedExecutionLevel level="highestAvailable" uiAccess="false" />

querrá agregar un manifiesto de aplicación si aún no tiene uno o no sabe cómo agregar uno. Como algunos proyectos no agregan automáticamente un archivo de manifiesto por separado, primero vaya a las propiedades del proyecto, vaya a la pestaña Aplicación y verifique que su proyecto no excluya el manifiesto en la parte inferior del grifo.

  • A continuación, haga clic con el botón derecho en el proyecto.
  • Agregar ítem nuevo
  • Por último, busque y haga clic en Archivo de manifiesto de la aplicación
Justin Mcconnell
fuente
12

En Visual Studio 2010, haga clic derecho en el nombre de su proyecto. Presione "Ver configuración de Windows", esto genera y abre un archivo llamado "app.manifest". Dentro de este archivo, reemplace "asInvoker" con "requireAdministrator" como se explica en las secciones comentadas dentro del archivo.

Evolucionado
fuente
66
Esta respuesta es sobre VB.NET :-), no VS 2010 en general. Las respuestas "Agregar nuevo elemento" son sobre C #. En C ++ puedes hacerlo en la configuración del proyecto.
Philm
12

Otra forma de hacerlo, solo en código, es detectar si el proceso se está ejecutando como administrador, como en la respuesta de @NG.. Y luego abra la aplicación nuevamente y cierre la actual.

Uso este código cuando una aplicación solo necesita privilegios de administrador cuando se ejecuta bajo ciertas condiciones, como cuando se instala como un servicio. Por lo tanto, no es necesario que se ejecute como administrador todo el tiempo, ya que las otras respuestas también lo fuerzan.

Nota en el siguiente código NeedsToRunAsAdmines un método que detecta si bajo las condiciones actuales se requieren privilegios de administrador. Si esto devuelve falseel código no se elevará solo. Esta es una gran ventaja de este enfoque sobre los demás.

Aunque este código tiene las ventajas indicadas anteriormente, debe reiniciarse como un nuevo proceso que no siempre es lo que desea.

private static void Main(string[] args)
{
    if (NeedsToRunAsAdmin() && !IsRunAsAdmin())
    {
        ProcessStartInfo proc = new ProcessStartInfo();
        proc.UseShellExecute = true;
        proc.WorkingDirectory = Environment.CurrentDirectory;
        proc.FileName = Assembly.GetEntryAssembly().CodeBase;

        foreach (string arg in args)
        {
            proc.Arguments += String.Format("\"{0}\" ", arg);
        }

        proc.Verb = "runas";

        try
        {
            Process.Start(proc);
        }
        catch
        {
            Console.WriteLine("This application requires elevated credentials in order to operate correctly!");
        }
    }
    else
    {
        //Normal program logic...
    }
}

private static bool IsRunAsAdmin()
{
    WindowsIdentity id = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(id);

    return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
TheLethalCoder
fuente
1
+1 para el enfoque de solo código. Tenga en cuenta que necesita UAC habilitado para tener la oportunidad de iniciar cualquier cosa runascomo administrador de un usuario que no sea administrador, de lo contrario, se abrirá en silencio con los permisos de usuario actuales (marcado en Windows 7 de 64 bits). Por lo que puedo decir, lo único que puede hacer con UAC deshabilitado y falta el derecho de administrador es detener la ejecución en el momento adecuado.
realmente agradable
9

Puede crear el manifiesto utilizando la Configuración de seguridad de ClickOnce y luego deshabilitarlo:

Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings

Después de hacer clic en él, se creará un archivo en la carpeta de propiedades del proyecto llamado app.manifest una vez que se haya creado, puede desmarcarEnable ClickOnce Security Settings opción

Abra ese archivo y cambie esta línea:

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

a:

 <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />

Esto hará que el programa requiera privilegios de administrador.

Yochai Timmer
fuente
7

Esta es una versión simplificada de la respuesta this , anterior por @NG

public bool IsUserAdministrator()
{
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch
    {
        return false;
    }
}
Hakan Fıstık
fuente
1
¡Esto no responde la pregunta!
Elmue
@Elmue es más lógico agregar tu comentario a la respuesta original que acabo de refactorizar, puedes encontrar un enlace a esa respuesta en la mía.
Hakan Fıstık
-3

Haga clic derecho en su ejecutable, vaya a Propiedades> Compatibilidad y marque la casilla 'Ejecutar este programa como administrador'.

Si desea ejecutarlo como administrador para todos los usuarios, haga lo mismo en 'cambiar la configuración para todos los usuarios'.

SlickJayD
fuente
44
Esto no responde la pregunta. "Una vez que mi programa está instalado en una máquina cliente", no "cómo lo hago".
Joe
Perdón por no estar claro. Una vez que su programa esté instalado, cambie esta configuración en las propiedades de su ejecutable (su programa principal, no el instalador). Él quiere forzar a su programa a ejecutarse como administrador.
SlickJayD
2
Es mejor establecer el requisito de administrador en el manifiesto. Yo diría que responde la pregunta, pero apenas.
BradleyDotNET
3
@ Joe Para ser justos, la respuesta aceptada no responde la pregunta de los OP, ya que requiere que reinstales la aplicación exe. Eso no es una solución para "Una vez que mi programa está instalado". En todo caso, esta respuesta rechazada es más correcta que la respuesta aceptada, por lo que no entiendo por qué esa respuesta tiene más de 400 votos.
NickG
En realidad, responde ambas preguntas perfectamente. No hay muchas posibilidades de cambiar el manifiesto una vez instalado y los programas no deberían intentar elevar sus permisos una vez que se ejecutan, en muchos entornos, es un buen camino para llamarse malware. En la mayoría de las empresas, esta respuesta es la mejor porque pone la responsabilidad sobre el usuario y sus permisos. Escribo mucho código que no puedo "ver" o ejecutar una vez que está en producción. Trate de no ser más inteligente que sus propias preocupaciones de seguridad.
jinzai