Necesidad de UAC para la aplicación de consola


Tengo una aplicación de consola que requiere usar algún código que necesita nivel de administrador. He leído que necesito añadir un archivo de manifiesto myprogram.exe.manifiesto que se ven así:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator">
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

Pero todavía no levanta el UAC (en la consola o en la depuración en VS). ¿Cómo puedo resolver este problema?

Actualización

Puedo hacer que funcione si corro la solución en Administrator o cuando corro /bin/*.exe en Administrador. Todavía me pregunto si es posible tener ¿algo que aparecerá cuando se inicie la aplicación en lugar de hacer clic explícitamente con el botón derecho>Ejecutar como administrador?

Author: Patrick Desjardins, 2008-10-22

3 answers

Debe incrustar el manifiesto de UAC como un recurso Win32 incrustado. Consulte Agregar un manifiesto UAC al Código Administrado.

En resumen, se utiliza una herramienta de línea de comandos del SDK de Windows para incrustarlo en el ejecutable.

Puede automatizar esto como un paso posterior a la compilación colocando la siguiente línea como una tarea posterior a la compilación en las propiedades de su proyecto VS:

mt.exe -manifest "$(ProjectDir)$(TargetName).exe.manifest" -updateresource:"$(TargetDir)$(TargetName).exe;#1"
 8
Author: Judah Himango,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-03 16:21:07

Para cualquiera que use Visual Studio, es súper fácil. Estaba a punto de ir a configurar el SDK de Windows y hacer mt.exe pasos posteriores a la construcción y todo eso antes de darme cuenta de que está integrado en VS. Pensé que lo grabaría para la posteridad.

  1. Project / Add New Item -> Visual C # Items - > Application Manifest File
  2. Abra la aplicación.manifest, change requestedExecutionLevel.@nivel a "requireAdministrator"
  3. Construir

Ta-da

 52
Author: scobi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-02 22:31:01

La respuesta de Scott hará lo que pidió, pero Microsoft recomienda que las aplicaciones de consola muestren un mensaje de "acceso denegado" en lugar de solicitar elevación.

De http://msdn.microsoft.com/en-us/library/bb756922.aspx:

Una aplicación de consola presenta su salida en la ventana de consola y no con una interfaz de usuario separada. Si una aplicación necesita un administrador completo token de acceso para ejecutar, luego esa aplicación debe iniciarse desde un ventana de consola elevada.

Debe hacer lo siguiente para las aplicaciones de consola:

  1. Marque que su aplicación "asInvoker": Puede hacer esto creando el manifiesto de su aplicación en la que establece requestedExecutionLevel == asInvoker. Esta configuración permite a las personas que llaman desde contextos no elevados crear su proceso, lo que les permite proceder al paso 2.

  2. Proporcionar un mensaje de error si la aplicación se ejecuta sin un administrador completo token de acceso: Si la aplicación se inicia en una consola no elevada, la aplicación debe enviar un breve mensaje y salir. El mensaje recomendado es: "Acceso denegado. Se necesitan permisos de administrador para usar las opciones seleccionadas. Utilice un símbolo del sistema del administrador para completar estas tareas."

La aplicación también debe devolver el código de error ERROR_ELEVATION_REQUIRED si no se inicia para facilitar el scripting.

Mi código C# para esto está abajo. Se se prueba en Windows XP (administrador - > aceptar, usuario estándar - > denegado) y Windows Server 2008 (administrador elevado -> aceptar, administrador no elevado- > denegado, usuario estándar - > denegado).

static int Main(string[] args)
{
    if (!HasAdministratorPrivileges())
    {
        Console.Error.WriteLine("Access Denied. Administrator permissions are " +
            "needed to use the selected options. Use an administrator command " +
            "prompt to complete these tasks.");
        return 740; // ERROR_ELEVATION_REQUIRED
    }

    ...
    return 0;
}

private static bool HasAdministratorPrivileges()
{
    WindowsIdentity id = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(id);
    return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
 24
Author: Joe Daley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-21 00:48:00