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


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


718
2018-05-12 11:09


origen


Respuestas:


Deseará 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". Cambiar el <requestedExecutionLevel> elemento para:

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

El usuario obtiene el UAC preguntar cuando comienzan el programa. Usar sabiamente su paciencia puede desgastarse rápidamente.


955
2018-05-12 12:35



Agregar un requestedExecutionLevel el elemento para tu manifiesto es solo la mitad de la batalla; tienes que recordar eso UAC puede ser apagado Si es así, debe realizar el control de la forma de la vieja escuela y mostrar un cuadro de diálogo de error si el usuario no es administrador.
 (llamada IsInRole(WindowsBuiltInRole.Administrator) en tu hilo CurrentPrincipal)


133
2018-05-13 01:14



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

46
2017-08-30 05:43



Puede incrustar un archivo de manifiesto en el archivo EXE, lo que hará que Windows (7 o superior) ejecute siempre el programa como administrador.

Puedes encontrar más detalles en Paso 6: Crear e insertar un manifiesto de aplicación (UAC) (MSDN).


39
2018-05-12 11:29



Los pasos detallados son los siguientes.

  1. Agregar archivo de manifiesto de aplicación a la solución
  2. Cambiar la configuración de la aplicación a "app.manifest"
  3. Actualice la etiqueta de "requestedExecutionLevel" para requerirAdministrator.

Adding file in Solution

Select Application Manifest File

Select Manifest option

Update Manifest file

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


33
2018-05-12 15:30



Mientras trabaja en Visual Studio 2008, haga clic derecho en Project -> Add New Item y luego eligió Application Manifest File.

En el archivo de manifiesto, encontrará la etiqueta requestedExecutionLevel, y puedes 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.


14
2018-03-06 07:18



En Visual Studio 2010, haga clic derecho en el nombre de su proyecto. Pulse "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.


10
2017-09-07 15:19



Según

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

deseará agregar un manifiesto de aplicación si todavía no tiene uno o no sabe cómo agregar uno. Como algunos proyectos no agregan automáticamente un archivo de manifiesto por separado, primero ve a las propiedades del proyecto, navega hasta el Solicitud marque y compruebe para asegurarse de que su proyecto no excluye el manifiesto en la parte inferior del grifo.

  • A continuación, haz clic derecho en el proyecto
  • Agregar ítem nuevo
  • Por último, busque y haga clic en Archivo de manifiesto de la aplicación

10
2018-03-17 13:06



Otra forma de hacerlo, solo en código, es detectar si el proceso se está ejecutando como administrador, como en la respuesta por @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, como las demás respuestas lo fuerzan también.

Nota en el código a continuación NeedsToRunAsAdmin es un método que detecta si en las condiciones actuales se requieren privilegios de administrador. Si esto vuelve false el código no se elevará a sí mismo. Esta es una gran ventaja de este enfoque sobre los demás.

Aunque este código tiene las ventajas indicadas anteriormente, sí necesita relanzarse como un nuevo proceso que no siempre es el que usted 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);
}

4
2018-01-12 15:56



esta es una versión simplificada de esto responder

public bool IsUserAdministrator()
{
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch (Exception)
    {
        return false;
    }
}

2
2018-05-05 07:42