c# .net .net-2.0 uac manifest

c# - UAC necesita una aplicación de consola



.net .net-2.0 (3)

Tengo una aplicación de consola que requiere usar algún código que necesite nivel de administrador. He leído que necesito agregar un archivo de manifiesto myprogram.exe.manifest que se vea 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 aún no aumenta el UAC (en la consola o en la depuración en VS). ¿Cómo puedo resolver este problema?

Actualizar

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


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

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

Puede automatizar esto como un paso posterior a la construcció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"


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

  1. Proyecto | Agregar nuevo elemento -> Elementos de Visual C # -> Archivo de manifiesto de aplicación
  2. Abra app.manifest, cambie requiredExecutionLevel. @ Level para "requireAdministrator"
  3. Construir

Ta-da


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

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

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

Debe hacer lo siguiente para las aplicaciones de consola:

  1. Marque que su aplicación es "asInvoker": puede hacerlo creando el manifiesto de su aplicación en el que establece RequestedExecutionLevel == asInvoker. Esta configuración permite a los llamantes de contextos no elevados crear su proceso, lo que les permite pasar al paso 2.

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

La aplicación también debe devolver el código de error ERROR_ELEVATION_REQUIRED al no haberse ejecutado para facilitar la creación de scripts.

Mi código de C # para esto está debajo. Se prueba en Windows XP (administrador -> ok, usuario estándar -> denegado) y Windows Server 2008 (administrador elevado -> ok, 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); }