¿Forzar que un programa se ejecute * sin * privilegios de administrador o UAC?

122

¿Hay alguna manera de forzar un programa que normalmente requiere privilegios de administrador (a través de UAC) para ejecutarse sin ellos? (es decir: sin solicitud de UAC y sin acceso a todo el sistema ).

Agregado: sin modificar el ejecutable en sí.


A pesar de la respuesta de James, he encontrado algunas formas en que casi se puede hacer:

  1. Al modificar el ejecutable, puedo eliminar la trustInfoentrada del manifiesto (o el manifiesto por completo, para poder usar uno externo), lo que permite que el programa se inicie sin UAC. Desafortunadamente, esto modifica el ejecutable, por lo que sale poco después debido a una prueba de suma de comprobación interna.
  2. Al usar Process Explorer, puedo iniciarlo como usuario limitado. Sin embargo, esto parece limitarlo significativamente más de lo que me gustaría (se ejecuta como el Modo protegido IE y, por lo tanto, puede acceder significativamente menos de lo que puede hacer mi usuario estándar no elevado).
Andrew Russell
fuente
1
¿Especifica no modificar el ejecutable, pero modificar el .exe es una de sus formas de intentarlo?
cutrightjm
3
@ekaj Solo especifiqué que después de descubrir que no funcionaría;)
Andrew Russell
¿Podría especificar el programa, incluso si ya no lo usa? Eso podría ayudar a las personas a saber a qué intenta acceder que requiere privilegios de administrador
Cutrightjm
@ekaj Lamentablemente no. Sin embargo, no es especialmente relevante: UAC se activa por un programa que solicita elevación durante la creación del proceso (la forma habitual, como en este caso, es con un manifiesto). Una vez que se inicia un proceso, no puede cambiar su estado de elevación, sin importar a qué recursos restringidos intente acceder.
Andrew Russell
Si un programa no tiene manifiesto y se niega a ejecutarse sin privilegios de administrador, lo más probable es que se deba a la detección del instalador de UAC. Publiqué esta pregunta y misha256 tiene una buena solución. Lo probé y puedo confirmar que funciona. superuser.com/questions/857616/… Investigué un poco y descubrí que no hay ninguna razón para que exista la detección del instalador. Tenga en cuenta que si los privilegios de administrador se deben a una entrada de información de confianza en un manifiesto, obviamente esto no funcionará.
user1258361

Respuestas:

74
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\forcerunasinvoker]
@="Run without privilege elevation"

[HKEY_CLASSES_ROOT\*\shell\forcerunasinvoker\command]
@="cmd /min /C \"set __COMPAT_LAYER=RUNASINVOKER && start \"\" \"%1\"\""

Guarde este texto <name_of_file>.regy agréguelo al Registro de Windows. (Hacer doble clic en él debería hacer el truco).

Luego, haga clic derecho en la aplicación que desea ejecutar sin privilegios administrativos y seleccione "Ejecutar sin elevación de privilegios".

En algunos casos, una pequeña cantidad del 0.1% de los programas puede preguntar dos veces sobre el aviso de UAC.

Vom
fuente
1
Solía ​​usar la compatibilidad de Application Compatibility Toolkit, pero eso era mucho trabajo para cada ejecutable y también dejaba basura en el registro para cada archivo. Este método funciona y me gusta mucho más.
Ben Voigt
2
Aceptar esto, ya que parece ser el método más sencillo, y ( ¡por fin! ) He podido verificarlo. También tiene la propiedad muy agradable de ser trivial se puede usar como una línea de comando una vez-off (quitar el exterior "y luego girar \"hacia ").
Andrew Russell
1
Tengo el mismo problema que @Derek, la aplicación parece mantener constantemente re-pidiendo UAC, no confiar en ella con el sistema de acceso de ancho pero necesito su funcionalidad ..
Gizmo
1
Puede agregar esto al registro solo para el usuario que ha iniciado sesión actualmente cambiando las claves a: HKEY_CURRENT_USER \ Software \ Classes * \ shell \ forcerunasinvoker y HKEY_CURRENT_USER \ Software \ Classes * \ shell \ forcerunasinvoker \ command
GodEater
1
@ jpmc26 Creo que /mines un error. La solución funciona exactamente igual sin ella. Vom debe haberse mezclado cmde startinterruptores. Parece que cmd.exeno se queja de interruptores incorrectos. Intenta cmd /whatever, por ejemplo.
cdlvcdlv
53

Guardar en nonadmin.bat:

cmd /min /C "set __COMPAT_LAYER=RUNASINVOKER && start "" %1"

Ahora puede arrastrar y soltar programas para ejecutarlos sin administrador.

Esto no requiere privilegios de administrador como lo hace el cambio de esa clave de registro. Además, no saturará el menú contextual.

Basado en la respuesta de Vom


Actualización: ahora debería funcionar con programas que también tengan espacios en el nombre.

Hjulle
fuente
Lo probé en algunos programas que requieren acceso en mis discos y no pudo detectarlos o no funcionó en primer lugar: / (rufus rufus.akeo.ie, por ejemplo)
keinabel
77
@keinabel Eso es probablemente porque realmente necesitaban administrador para funcionar. Este script es para programas que exigen privilegios de administrador sin hacer realmente algo que lo requiera. El acceso sin formato a las unidades es una cosa típica de administrador.
Hjulle
2
¡Con buena pinta! Pude instalar XAMPP usando este método.
Krishnaraj
Esto no parece estar funcionando para mí para ningún ejecutable en el directorio "C: \ Archivos de programa \ ...". Me sale un Windows cannot find 'C:\Program'. Make sure you typed the name correctly, and then try again. He probado este comando manualmente varias veces con ligeras variaciones y sin suerte. ¿Algunas ideas?
Jake Smith
1
Tuve el mismo problema con la ubicación del archivo en una carpeta con espacios. Lo resolvió eliminando algunas comillas dobles: cmd / min / C "set __COMPAT_LAYER = RUNASINVOKER && start" "% 1"
ragnar
35

Espero no llegar demasiado tarde a la fiesta, pero estaba buscando una pregunta similar y sin ver una respuesta aquí descubrí que el RunAscomando incorporado de Windows , cuando se ejecuta como administrador, puede hacerlo con el /trustlevelinterruptor.

RUNAS /trustlevel:<TrustLevel> program

/showtrustlevels  displays the trust levels that can be used
                  as arguments to /trustlevel.
/trustlevel       <Level> should be one of levels enumerated
                  in /showtrustlevels.

Esto funcionó en mi caso. Irónicamente, iniciar un programa explícitamente sin elevación requiere un símbolo del sistema elevado . Imagínate. :) Espero que te ayude.

Mxx
fuente
Puedo confirmar que esto no funciona. Acabo de probarlo y recibí un error: "ERROR DE RUNAS: no se puede ejecutar - (nombre del programa aquí). La operación solicitada requiere elevación".
usuario1258361
99
@ user1258361 tiene que ejecutar este comando desde el indicador elevado, tal como escribí en negrita ...
Mxx
No parece requerir un aviso elevado en Windows 7 ...
SamB
44
Probado con solicitud elevada, línea de comando utilizada runas / trustlevel: 0x20000 (programa), el programa se ejecutó como administrador de todos modos. Como referencia, 0x20000 es usuario básico.
user1258361
2
requiere un símbolo del sistema elevado ... por supuesto que sí. De lo contrario, ya no tiene derechos de administrador y cualquier proceso que inicie también les faltará.
Twisty Impersonator
16

Si tiene una aplicación particular que desea ejecutar siempre sin UAC, puede orientarla con el Registro (agregue el texto a un archivo REG e impórtelo en el Registro):

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
"C:\\example\\application.exe"="RunAsInvoker"

A diferencia de esta respuesta , esta solución no requiere un clic o cambio alternativo para la interacción del usuario.

Microsoft llama a este proceso agregando el RunAsInvoker "Calce de compatibilidad" .

palswim
fuente
La respuesta a una pregunta diferente pero relacionada proporcionó la inspiración para esta respuesta.
palswim
1
¡Muchas gracias! ¡Esto fue lo único que funcionó para mí! Tenía una aplicación que se llamaba desde el menú contextual de Windows, y siempre aparecía como administrador, a pesar de que se llamaba correctamente desde cualquier otro lugar. Después de esta corrección, la aplicación comenzó a llamarse correctamente.
usuario
3

Resolví este problema hoy usando el kit de herramientas de personalización de aplicaciones MS.

Seguí las instrucciones en un artículo de tech republic .

Básicamente:

1) obtienes el kit de herramientas de MS aquí .

2) Haga clic en Fix

3) Elija la opción RunAsInvoker

4) Haga clic derecho en la corrección y elija Instalar

usuario53639
fuente
Su respuesta hace exactamente lo contrario del efecto deseado. La pregunta original era cómo forzar una aplicación que solicita privilegios elevados para ejecutarse sin elevar. Su respuesta todavía usa UAC pero simplemente deshabilita esa solicitud. Esa es una respuesta incorrecta para esta pregunta.
Mxx
@mxx en realidad no. Si el usuario actual es limitado (o si tiene UAC habilitado), el proceso se iniciará con privilegios limitados por completo.
LogicDaemon
1
@LogicDaemon Si realmente lees el artículo, verás que explica que si sigues esos pasos, ejecutarás una aplicación como Administrador sin aviso de UAC . Esto es lo opuesto a lo que OP solicitó.
Mxx
@mxx no. Lea en technet lo que realmente hace RunAsInvoker. De hecho, esto es lo que pidió el iniciador de temas, aunque esto solo funciona para aplicaciones más antiguas.
LogicDaemon
Mientras Explorer, un cmd que no sea administrador, o cualquier otro proceso estándar sea el padre, RunAsInvoker se ejecutará con los mismos derechos limitados. (Explorer se ejecuta restringido de forma predeterminada, de lo contrario, nunca le pediría que lo eleve para eliminar un archivo). En realidad, parece funcionar incluso con nuevas aplicaciones. RunAsInvoker significa que hereda exactamente el mismo token ACL.
SilverbackNet
3

Si es un exearchivo de instalación (instalación) que requiere privilegio de administración, hay un truco para ejecutarlo sin acceso elevado:

Si el nombre del archivo contiene palabras como setupo installwindows lo ejecuta con fuerza con acceso elevado, incluso si no necesita acceso elevado:

ingrese la descripción de la imagen aquí

Si el archivo .exe tiene un manifiesto, estas heurísticas para elevación no se aplican.

Esto está documentado en los documentos UAC (Control de cuentas de usuario):

La detección del instalador detecta los archivos de configuración, lo que ayuda a evitar que las instalaciones se ejecuten sin el conocimiento y consentimiento del usuario.

La detección del instalador solo se aplica a:

  • Archivos ejecutables de 32 bits.

  • Aplicaciones sin un atributo de nivel de ejecución solicitado.

  • Procesos interactivos que se ejecutan como un usuario estándar con UAC habilitado.

Antes de crear un proceso de 32 bits, se verifican los siguientes atributos para determinar si se trata de un instalador:

  • El nombre del archivo incluye palabras clave como "instalar", "configurar" o "actualizar".

  • ...

Modo de lectura aquí: https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works

Shayan
fuente
2
Por supuesto, eso solo funciona cuando el manifiesto de la aplicación no especifica explícitamente que debe ejecutarse elevado.
Daniel B
3
@DanielB: de hecho, este truco solo funciona cuando no hay manifiesto
AntoineL
1
Votado. Buena observación. Un enlace a documentos oficiales también sería bueno.
Denis Nikolaenko
@DenisNikolaenko Ty, fuente agregada :)
Shayan
1

Mientras que en su pregunta, Andrew declaró que lo siguiente no funcionó del todo:

Al modificar el ejecutable, puedo eliminar la entrada trustInfo del manifiesto (o el manifiesto por completo, por lo que puedo usar uno externo), lo que permite que el programa se inicie sin UAC. Desafortunadamente, esto modifica el ejecutable, por lo que sale poco después debido a una prueba de suma de comprobación interna.

Pude modificar un archivo .manifest externo para el software que estaba usando y cambiar

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

a

<ms_asmv2:requestedExecutionLevel level="asInvoker" uiAccess="false" />

Resulta que el software que estaba usando realmente no requería derechos de administrador, por lo que pude ejecutarlo en una cuenta de usuario estándar sin UAC o contraseñas de administrador. ¡Gracias!

Aurimas
fuente
En su lugar, puede ser más fácil editar el ejecutable, ya que el manifiesto solo puede incluirse en el archivo. Tenga en cuenta que el prefijo del espacio de nombres ms_asmv2:también puede omitirse. Además, es posible que cambiar el tamaño del bloque xml incrustado pueda dañar el binario, por lo que "requireAdministrator" debe cambiarse a "asInvoker" acolchado a la misma longitud con espacios antes de uiAccess.
kdb
-2

Solucioné este problema cambiando los permisos en la carpeta que contenía el programa.

Agregué a cada usuario que ejecutará ese programa y les otorgué privilegios de "control total". Eso solucionó el problema y dejé la opción "Ejecutar como administrador" sin marcar.

No tengo ningún problema de seguridad para los usuarios que ejecutarán el programa.

Tim D
fuente
-5

No, si un programa requiere UAC, entonces está intentando acceder a algo fuera de su sandbox. El programa no se ejecutará correctamente sin el acceso elevado.

Si solo quiere deshacerse de la notificación, puede deshabilitar UAC.

Deshabilite UAC en Windows Vista: Inicio, escriba "usuario". Haga clic en "Cuentas de usuario". En la ventana emergente, haga clic en "Configuración de control de cuenta de usuario" y luego apague UAC.

Deshabilite UAC en Windows 7: Inicio, escriba "usuario". Haga clic en "Configuración de control de cuenta de usuario". Arrastre la barra de opciones hasta el final para "Nunca notificar".

James Watt
fuente
77
Deshabilitar UAC no es lo que estoy tratando de lograr. Además: su descripción de cómo funciona UAC es correcta solo en un sentido general. Es posible que un programa solicite UAC cuando no lo necesita estrictamente. Y UAC ocurre antes de que se inicie un programa: una vez que se ejecuta, si va más allá de sus permisos, simplemente obtendrá errores de permiso denegado.
Andrew Russell el
Dejando a un lado la semántica, no puede "deshabilitar" las notificaciones de UAC para un programa específico mientras limita su acceso.
James Watt
James: En realidad, parece que puedes, he actualizado mi pregunta.
Andrew Russell el
A falta de modificar el código del programa en sí, me interesaría saber una solución que funcione si encuentra una.
James Watt