Sobre el error "La operación solicitada requiere elevación" que puede devolver Runas.exe en Windows Vista/7

En un foro que frecuento un usuario tenía el siguiente problema: Al intentar ejecutar como administrador un programa en Windows 7 usando el comando Runas.exe, le aparecía el siguiente mensaje de error:

740: La operación solicitada requiere elevación.

Ciertamente el usuario estaba proporcionando el nombre de usuario y la contraseña de un usuario con privilegios administrativos así que… ¿dónde estaría el problema?

En primer lugar, vamos a analizar con calma lo que quiere decir el mensaje de error. El mensaje de error “La operación solicitada requiere elevación” está recogido en el fichero de cabecera Ntstatus.h del SDK de Windows Vista y posteriores. Concretamente está definido con el nombre de macro ERROR_ELEVATION_REQUIRED.

¿Cuándo se devuelve ese código de error durante el funcionamiento de Windows?

En Windows los procesos se crean usando la API CreateProcess. Uno de los pasos que se siguen antes de crear un proceso en Windows Vista y posteriores es comprobar si el proceso en cuestión necesita elevar sus privilegios o no. A la hora de determinar este aspecto, entran en juego, entre otros, dos parámetros: El nivel de ejecución (runlevel) impuesto por el manifiesto de la propia aplicación, y el token del usuario que está lanzando ese programa. Existen tres posibles niveles de ejecución para una aplicación:

  • asInvoker: El nivel de ejecución es el mismo que el del proceso padre.
  • highestAvailable: El nivel de ejecución es el de mayores privilegios posibles, considerando el tipo de cuenta desde la cual se ejecuta el proceso.
  • requireAdministrator: El nivel de ejecución es administrativo, independientemente de las demás circunstancias.

Esta tabla recoge de forma básica las posibilidades:

Nivel de ejecución de la aplicación Token del usuario Requiere elevación o no
AsInvoker Cualquiera No
highestAvailable Administrador “elevado” No
highestAvailable Administrador “estándar”
highestAvailable Otro caso No
requireAdministrator Administrador “elevado” No
requireAdministrator Otro caso

Por administrador “elevado” me refiero a aquella cuenta con privilegios administrativos pero que, o bien ya ha elevado explícitamente sus privilegios (a través de un cuadro de UAC), o bien no tiene activada la característica Modo de aprobación del administrador (Admin Approval Mode). Esta característica se puede desactivar desde Directiva de grupo, pero yo personalmente lo desaconsejo. Un ejemplo de este tipo de cuentas es la cuenta “Administrador”, creada durante la instalación del sistema operativo. Recuerde que el resto de cuentas con privilegios administrativos poseen dos tokens: uno limitado, con el que “actúan” por defecto, y otro “administrativo”, que pueden aplicar si el usuario así lo indica a través de un cuadro de UAC.

Una vez que CreateProcess falla (devuelve un valor distinto de 1) y el último error se establece como ERROR_ELEVATION_REQUIRED (columna “Requiere elevación o no” de la tabla anterior), es asunto del proceso padre el tratar convenientemente este error. Si no lo hace, se registrará en Visor de sucesos, apartado dedicado a UAC, un evento informando de que el proceso padre no trató apropiadamente el error ERROR_ELEVATION_REQUIRED.

¿Qué ocurre cuando se lanza una aplicación desde la línea de comandos?

Imaginemos que el usuario intenta ejecutar el desfragmentador de disco de Windows 7 usando para ello una sintaxis de Runas.exe como esta:

runas /u:UsuarioAdministrador dfrgui.exe

Básicamente la línea de comandos detecta que no se trata de un comando interno, sino que se trata del programa Runas.exe, y por tanto se dispone a ejecutarlo usando CreateProcess. Como Runas.exe no es un programa que está marcado para requerir elevación de privilegios, CreateProcess retorna éxito.

Una vez que el planificador del sistema operativo cede el control al proceso Runas.exe recién creado, este se dispone a analizar su línea de comandos. Se encuentra con una petición de ejecutar Dfrgui.exe como si fuera el usuario administrador pasado como parámetro. Sin embargo, Runas.exe es poco más que un “envoltorio” de la API CreateProcessWithLogonW, que a su vez es poco más que un envoltorio de la API CreateProcess, pero pasando otro perfil de usuario distinto como parámetro.

Durante su ejecución, CreateProcess determina que Dfrgui.exe requiere privilegios administrativos (puesto que así se lo indica su manifiesto), y por ello devuelve falso y establace el último error como ERROR_ELEVATION_REQUIRED. Como Runas.exe es una herramienta que no está diseñada para tratar apropiadamente ese error, simplemente lo devuelve por pantalla de la forma “740: La operación solicitada requiere elevación”.

Una vez desvelado el misterio, resta por comentar un aspecto que a estas alturas quizá ya se haya planteado:

¿Cómo es posible que ejecutando Dfrgui.exe desde la línea de comandos -sin usar Runas.exe- sí que aparezca un cuadro de UAC?

El secreto está en que la línea de comandos, antes de llamar a CreateProcess, informa al sistema de que va a tratar los posibles ERROR_ELEVATION_REQUIRED que puedan surgir. Esto lo consigue estableciendo unos atributos no documentados a la estructura STARTUPINFOEX, que se pasa como parámetro a la familia de API CreateProcess. Esto hace que no se registre el correspondiente error en el apartado UAC del Visor de sucesos. Seguidamente, la línea de comandos, sabiendo que se trata de un programa que debe elevar sus privilegios, lo intenta ejecutar mediante la API ShellExecuteEx. Esta API sí muestra el correspondiente cuadro de UAC, así que es la vía apropiada para ejecutar una aplicación que requiera privilegios administrativos.

En resumen, me gustaría resaltar estos puntos del tema del artículo:

  • En Windows Vista y Windows 7 la única forma de ejecutar algo con privilegios administrativos es mediante un cuadro de UAC. No vale con poner el nombre de usuario y la contraseña de un administrador en la línea de comandos.
  • Todo lo que se ejecute mediante la API CreateProcess, o alguna derivada de ella, no hará que aparezca un cuadro de UAC. Un ejemplo de ello es la utilidad Runas.exe.
  • Runas.exe, en Windows Vista/7, sirve para ejecutar una aplicación como si fuera otro usuario, pero no sirve para ejecutarla con mayores privilegios.
  • Si quiere que se ejecute una aplicación que requiere privilegios administrativos, use la API ShellExecuteEx, o alguna de sus derivadas. Esta API sí permite la aparición de un cuadro de UAC para que el usuario eleve sus privilegios.

27 thoughts on “Sobre el error "La operación solicitada requiere elevación" que puede devolver Runas.exe en Windows Vista/7

  1. excelente explicación, me topé con ese error al intentar instalar front page sobre una instalación previa de office 2003 en windows seven y deduje que se trataba de un asunto de privilegios, por lo cual simplemente solicité en el menú contextual del ejecutable ejecutar como admin, luego, por curiosidad busqué algún material sobre ese mensaje ” requiere elevación” y he encontrado su explicación, muchas gracias .

  2. Si quiere que se ejecute una aplicación que requiere privilegios administrativos, use la API ShellExecuteEx, o alguna de sus derivadas. Esta API sí permite la aparición de un cuadro de UAC para que el usuario eleve sus privilegios.<---requiero los privilegios pero no tengo idea de como usar la API Shellexecuteex que mencionas, podrias ayudarme? gracias.

  3. Tengo ese mismo problema al instala el juego LOST PLANET 2

    Imposible ejecutar el archivo:
    D:/Program Files/Lost Planet 2/Directx/DXSETUP.exe

    CreateProcess falló; código 740.
    La operación solicitada requiere elevación.

    como puedo solucinar este problema instalo q instalo el juego y nada q corre plz alguien q me de una ayudita detallada de como solucionar este problema 🙁 saludos…

  4. Tengo ese mismo problema al instala el juego LOST PLANET 2

    Imposible ejecutar el archivo:
    D:/Program Files/Lost Planet 2/Directx/DXSETUP.exe

    CreateProcess falló; código 740.
    La operación solicitada requiere elevación.

    como puedo solucinar este problema instalo q instalo el juego y nada q corre plz alguien q me de una ayudita detallada de como solucionar este problema 🙁 saludos…

  5. mucha palabreria pero nada util para los que no sabemos nada de computadoras…..muy util para ustedes los inteligentes pero nada utila para nosotros los comunes

  6. Hola, para los que no entienden mucho como yo, encontré esta solución sencilla.

    1. INICIO
    2. TODOS LOS PROGRAMAS
    3. ACCESORIOS
    4. CLIC DERECHO SOBRE COMMAND PROMPT
    5. EJECUTAR COMO ADMINISTRADOR
    y listo!!!

  7. pero no especificas como se puede hacer uso de la API ShellExecuteEx en lugar de la que trae el metodo o funcion CreateProcess, como se puede trabajar o corregir este error.

  8. Saludos pero como se puede hacer para cambiar la API que trae el metodo CreateProcess.y poner en su lugar la API ShellExecuteEx.

  9. Gracias por la explicacion sencilla, ejecutar como administrador y se soluciono!!!No me sirvio toda la explicacion larga, no vi ninguna solucion ahi.Si necesitaria saber como funciona el sistema operativo me hubiese instalado linux.Gracias!

  10. Si A veces se es más efciente siendo CONCRETO Y AL GRANO en este caso estoy de acuerdo con el comentario anterior. asi lo he hecho y ya quedó resuelto.

  11. Dani, un saludo.

    podes hacer esto tambien:

    RunAs /user:XXXX cmd
    Escriba la contraseña para XXXXX:(pones el pass)

    perfect!

    ;D

  12. Vaya rollo que nos ha soltado el tio, ¿y donde esta la solución que yo no la veo? Hay que explicar las cosas para todo el mundo, o sea los que entienden mucho de informática y los que no tanto.

  13. Hola! quise instalar un juego en mi notebook con W8 y me salta el siguiente error:
    c/Program Files (x86)/2k Games/Borderlands2/Binaries/Redist/DXRedistCutdown/DXSETUP.exe

    CreateProcess falló; código 740.
    La operación solicitada requiere elevación.
    ayuda!

  14. Muy bueno el post Daniel. Gracias a la gente apasionada como tu.
    Permiteme el detallarlo para los novatos en los que me incluyo, en el casod e ARP -D
    Ejecutar WindowsPowerShell en modo administrador ( boton derecho sobre el icono y selecionar este modo )
    Ahora ya puedes lanzar los comandos para modo consola

Leave a Reply to LegBa Cancel reply

Your email address will not be published. Required fields are marked *