Pregunta

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?

¿Fue útil?

Solución

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

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

El usuario obtiene el UAC se indica cuando comienzan el programa. Usar sabiamente; Su paciencia puede desgastarse rápidamente.

Otros consejos

Agregando un requestedExecutionLevel El elemento para tu manifiesto es solo la mitad de la batalla; Tienes que recordar que UAC se puede apagar. Si es así, debe realizar el control de la vieja escuela y poner un diálogo de error si el usuario no es administrador
(llamar IsInRole(WindowsBuiltInRole.Administrator) en tu hilo CurrentPrincipal).

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 "SolicedEdExecutionLevel" a RequastEdMinistrator.

Adding file in Solution

Select Application Manifest File

Select Manifest option

Update Manifest file

Tenga en cuenta que con este código debe desactivar la configuración de seguridad de Clickonce, para hacer esto, ir a las propiedades interiores -> Seguridad -> Securencia de ClickOnce

Implementé algún 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;
}

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

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

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

En el archivo manifiesto, encontrará la etiqueta requestedExecutionLevel, y 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 establecer su aplicación para ejecutarse como administrador, debe elegir la del medio.

Según

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

Deberá agregar un manifiesto de la 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 separado, primero vaya a las propiedades del proyecto, navegue a la Solicitud Pestaña y verifique para asegurarse de que su proyecto no excluya el manifiesto en la parte inferior del grifo.

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

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 "requitroadMinistrator" como se explica en las secciones comentadas dentro del archivo.

Otra forma de hacer esto, solo en código es detectar si el proceso se ejecuta como administrador como en La respuesta de @ng.. Y luego abra la aplicación nuevamente y cierre la actual.

Utilizo este código cuando una aplicación solo necesita privilegios de administración cuando se ejecuta bajo ciertas condiciones, como cuando se instala como servicio. Por lo tanto, no necesita ejecutarse como administrador todo el tiempo, como las otras respuestas, también lo obligan.

Nota en el siguiente código NeedsToRunAsAdmin es un método que detecta si en condiciones actuales se requieren privilegios de administración. Si esto regresa 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, necesita relanzarse 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);
}

Esta es una versión simplificada de este responder, arriba por @ng

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

Puede crear el manifiesto usando la configuración de seguridad de Clickonce y luego deshabilitarla:

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

Después de hacerle clic, se creará un archivo en la carpeta de propiedades del proyecto llamada App.Manifest Una vez que esto se crea, puede desmarcar el Enable 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.

Haga clic derecho en su ejecutable, vaya a Propiedades> Compatibilidad y marque el cuadro 'Ejecutar este programa como Admin'.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top