¿Hay un comando que pueda elevar el símbolo del sistema en su lugar?


61

En los sistemas * nix, puede obtener un shell raíz como este:

$ su # or 'sudo -s'
#

El shell raíz se genera en su lugar dentro de la misma terminal.

Estoy tratando de encontrar algo que haga una elevación similar en el lugar en el símbolo del sistema de Windows. En otras palabras, no debería generar una nueva ventana o mostrar mensajes UAC. Hasta ahora he podido hacer una tarea programada que omite UAC, pero la ventana elevada del símbolo del sistema no se genera en su lugar.

¿Existe un comando similar para Windows que realice una elevación in situ sin generar una nueva ventana?


31
tenga en cuenta que su / sudo -s en realidad también inicia un nuevo proceso de shell. Es solo que los procesos elevados están conectados a la misma terminal, por lo que parecen estar elevados en el lugar.
Lie Ryan

"no debería generar una nueva ventana o mostrar avisos de UAC" ¿Estás diciendo que no debería requerir interacción gráfica? ¿O es que no quiere que se le solicite en absoluto ? Por ejemplo, sudoa veces pedirá una contraseña, pero lo hace con una interfaz de texto. Me pregunto cómo lo manejan los servidores Nano (que no creo que incluso ofrezcan una GUI para Escritorio remoto).
jpmc26

2
@ jpmc26 La interacción en la interfaz de texto está bien.
user2064000

@ jpmc26 Me pregunto si el servidor Nano incluso tiene UAC. Dado que está optimizado para contenedores, no suena muy útil. También se deshabilitó en las versiones Server Core, IIRC. Si lo habilitó accidentalmente, tiene una gran cantidad de problemas :)
Luaan

2
@ user2064000 La solicitud de UAC se inicia (al menos de forma predeterminada para archivos binarios que no son de Windows) en el Escritorio seguro, no en el escritorio actual del usuario. Además de ser un poco molesto, está diseñado para evitar que otros procesos interfieran con el aviso de UAC. Además, si se requiere autenticación, tendrá que estar en el Escritorio seguro, y algunos administradores también pueden requerir una secuencia Ctrl-Alt-Del para probar que Windows está tomando la contraseña y no algún otro proceso que se haga pasar por una solicitud de contraseña. Por lo tanto, escribir una contraseña en la ventana cmd probablemente no volaría desde una perspectiva de seguridad de Microsoft.
Calchas

Respuestas:


65

TL; DR : la única opción es generar otro proceso. (Una nueva cmd.exe). En el caso del símbolo del sistema, iniciar una nueva instancia con un token de acceso que tenga permisos más altos siempre dará como resultado una nueva ventana creada.


No es posible otorgar permisos adicionales a un proceso que ya se está ejecutando .

Cuando un usuario con derechos administrativos inicia sesión en una máquina Windows con el Control de cuentas de usuario (UAC) habilitado, se crean dos tokens de acceso separados :

  1. Uno con acceso de administrador completo, y
  2. Un segundo "token filtrado" con acceso de usuario estándar

En el momento en que CMD.EXEse crea un proceso (por ejemplo ), se le asigna uno de estos dos tokens de acceso . Si el proceso se ejecuta "elevado" como administrador, se utiliza el token de acceso sin filtrar. Si al proceso no se le otorgan derechos de administrador, se utiliza el token de usuario estándar filtrado.

Una vez que se ha creado un proceso, no es posible reemplazar su token de acceso . 1 En este hilo de MSDN Application Security for Windows Desktop , un póster que se identifica a sí mismo como miembro del Equipo de Kernel de Windows dice:

El núcleo NT nunca tuvo la intención de permitir el cambio de token una vez que un proceso comenzó a ejecutarse. Esto se debe a que los identificadores, etc. pueden haberse abierto en un contexto de seguridad antiguo, las operaciones durante el vuelo pueden usar contextos de seguridad inconsistentes, etc. Como tal, generalmente no tiene sentido cambiar el token de un proceso una vez que ha comenzado la ejecución. Sin embargo, esto no se hizo cumplir hasta Vista . [énfasis mío] (Fuente gracias a @Ben N )

Nota: El Control de cuentas de usuario se introdujo con el lanzamiento de Windows Vista .

Esta respuesta de Superusuario cita dos fuentes adicionales que confirman lo mismo:

Por lo tanto, simplemente no es posible elevar el símbolo del sistema o cualquier otro proceso en el lugar. La única opción es generar otro proceso con un nuevo token de acceso (que puede ser otra instancia del proceso original si lo desea). En el caso del símbolo del sistema, iniciar una nueva instancia con un token de acceso que tenga permisos más altos siempre generará una nueva ventana, y si los avisos UAC están habilitados en el sistema, también se activarán.


1 Puede ajustar los privilegios en un token de acceso existente con la función AdjustTokenPrivileges , pero de acuerdo con MSDN :

La función AdjustTokenPrivileges no puede agregar nuevos privilegios al token de acceso. Solo puede habilitar o deshabilitar los privilegios existentes del token.


19

Si bien soy un usuario entusiasta TCC-LE, existe una solución que no necesita ningún programa nuevo:

  • Comience cmdcomo administrador.
  • Esto debería comenzar en %SystemRoot%\system32\- si no, cdallí.
  • copy cmd.exe cmdadmin.exe(o cualquier nombre que elija, como su.exe).
  • Ahora ejecuta Explorer y encuentra cmdadmin.exe.
  • Haga clic derecho y seleccione Propiedades .
  • En la pestaña Compatibilidad seleccione ejecutar como administrador (o configúrelo para todos los usuarios).

Ahora cmdadmines su suo sudo: puede iniciarlo sin parámetros para darle un shell con privilegios administrativos, o puede ejecutarlo /cpara ejecutar un solo comando en este modo. Dependiendo de sus políticas, es posible que se le solicite confirmación o no.

Tenga en cuenta que esto siempre abrirá una nueva ventana (como lo hace la solución TCC start /elevated ...): para una aplicación GUI esto se espera, pero para un programa de línea de comandos, puede usar en /klugar de /c, para darle la oportunidad de ver la salida ; o puede ejecutar a través de un archivo por lotes ( sudo.cmd¿tal vez?) que se concatena & pauseal final de su cadena de ejecución.

En cualquier caso, no es lo mismo que suo sudo, pero es lo más cercano que obtendrá. Al configurar el diseño de Windows manualmente, la nueva ventana se puede crear directamente debajo y colindando con el original.


Esto es probablemente lo más cerca que el OP puede llegar al comportamiento sudo, con la advertencia de que todavía tiene que lidiar con una nueva ventana / proceso que se genera. Aunque probablemente no sea la mejor idea desde el punto de vista de la seguridad, deshabilitar todas las indicaciones de UAC eliminaría tener que responder a la solicitud de UAC cuando se inicia el proceso elevado.
Digo reinstalar a Mónica el

@Twisty - Gracias por el comentario. Era consciente de las implicaciones de seguridad, pero no son peores que la premisa original de que la cuenta permite Ejecutar como administrador . Depende de cualquiera que lo implemente decidir si quiere recordatorios constantes cada vez que se invoca.
AFH

2
No mencioné las implicaciones de seguridad para su beneficio, sino más bien para otros lectores. Sin embargo, no estaré de acuerdo en que deshabilitar las indicaciones de UAC no es peor que ejecutarse como administrador. Los avisos de UAC pueden evitar que un usuario conectado como administrador otorgue derechos administrativos no deseados a un proceso. Sin las indicaciones, el usuario pierde esta oportunidad.
Digo reinstalar a Mónica el

@Twisty - Solo así. Mi respuesta vino por motivos similares. Gracias de nuevo.
AFH

1
en lugar de copiar cmd.exe, cree un enlace simbólico. De esta manera, si Windows lo actualiza y corrige los errores de seguridad, no ejecuta una versión anteriormklink cmdadmin.exe cmd.exe
Josef

11

¿Hay un comando que pueda elevar el símbolo del sistema en su lugar?

Hay una forma bastante inconveniente:

powershell -Command "Start-Process 'cmd.exe' -Verb runAs"

Había mejores formas, pero Microsoft las cerró. Por supuesto, siempre puede arremangarse y escribir su propio script equivalente sudocon el código fuente que le acabo de dar.

En otras palabras, no debería generar una nueva ventana o mostrar mensajes UAC.

¡Blasfemia! ¡Quémalo en la hoguera! ;) Broma aparte, no. No hay Eso sería un error y una vulnerabilidad de seguridad. Microsoft hizo un esfuerzo explícito para garantizar que el proceso elevado y estándar tenga lo menos en común posible.

Los niños inteligentes que están pensando en dos back-end (uno estándar y uno elevado) y un front-end gráfico para ambos, deben leer sobre el aislamiento de la sesión 0 .


2

¿Existe un comando similar para Windows que realice una elevación in situ sin generar una nueva ventana?

No hay un comando incorporado. Aunque no lo he probado, creo que sí, porque he visto múltiples formas de usar software / código adicional para solucionar este problema.

En otras palabras, no debería generar una nueva ventana o mostrar mensajes UAC.

Olvídalo. Absolutamente olvídalo. Eso va en contra del diseño de UAC. Si pudieras manejar eso, estás rompiendo un proceso de seguridad fundamental. Espere que su solución pase por un parche después de que Microsoft se entere y arregle cualquier proceso que pueda hacer para solucionar esto.

La solución para evitar los avisos de UAC es tener una elevación elevada para comenzar. UAC no debería molestarte si estás lo suficientemente autorizado. Si comienza con una elevación más baja (que a menudo se recomienda para obtener beneficios de seguridad) y luego intenta hacer algo que requiera una elevación más alta, espere la interacción de UAC.


Los avisos de UAC ya se pueden omitir con una tarea programada; Estoy buscando algo que haga la elevación in situ en lugar de generar una nueva ventana de símbolo del sistema.
user2064000

Si hace eso, ¿puede realmente configurar la Tarea Programada sin satisfacer los requisitos de UAC? En cuanto al desove, digo que no lo espero porque he notado que todas las soluciones elevadoras que he visto hasta ahora han implicado comenzar un nuevo proceso. Creo que técnicamente se puede elevar sin comenzar un nuevo proceso, ya que los programas de instalación pueden solicitar UAC después de que se inicien, pero no recuerdo haber visto soluciones disponibles, fácilmente importables en un archivo por lotes, todavía.
TOOGAM

En efecto; Las tareas programadas derrotan completamente a UAC. Una vez elevado, puede elevarse a SYSTEM a través de los servicios y luego usar el token de reemplazo en el proceso cmd.exe original.
Joshua

Hay un script PowerToy algo oficial que hace el trabajo básico; puede escribir elevate cmdpara abrir una nueva ventana de símbolo del sistema con un indicador UAC (¡el sitio también tiene comandos del menú contextual!). O, por supuesto, puede simplemente hacer Ctrl + Shift + Hacer clic en el icono de la barra de tareas de cualquier ventana de símbolo del sistema existente para hacer lo mismo: eso es lo que suelo hacer con más frecuencia. (Lo que sé no es lo que solicitó el OP, pero lo que solicitó el OP está bloqueado por diseño)
Miral

2

Lo que quieres es imposible en Windows, porque no es compatible con este concepto. Necesita comenzar un nuevo proceso con permisos más altos .

Yo uso nircmd para elevar procesos desde la línea de comandos. Tu comando seríanircmdc elevate cmd


2

Vi esta pregunta y se me ocurrió una solución simple. Esta es una pequeña utilidad llamada rsudo, que ejecuta comandos escalados desde una ventana CMD normal.

Nota: Un UAC se van a plantear. Ocultar esto no es posible, esa es la forma en que UAC ha sido diseñado.

Usage:
  rsudo.exe "[command]"

Descargar [La descarga no funciona, se actualizará pronto]

Nota: Los comandos se ejecutan en una nueva ventana. Si desea ver la salida, ejecutersudo.exe "pause && [command]"


¿No debe ser rsudo.exe "[command] && pause"?

@ flota No, un error hace pauseque se ejecute primero entonces
rahuldottech

Rahul, gracias! ¿Alguna posibilidad de código fuente? ;) (O tal vez solo estaba buscando en el lugar equivocado en su sitio.)
cxw

@cwz seguro! Lo
editaré

0

Este es raro.

Puede intentar hacer un ssh en su propia computadora que usaría la misma terminal existente, pero en realidad sería una completamente diferente.

Funcionará, pero probablemente no sea lo que quieres.

Sin embargo, otros pueden encontrarlo útil.


-1

Pruebe el símbolo del sistema JPSOFT Take Command TCC / LE. Viene en versiones de 32 y 64 bits y es gratuito a menos que desee más funcionalidad.

Vaya a https://jpsoft.com/ y haga clic en Descargas y seleccione lo que desee.

TCC / LE tiene un START / ELEVATED, que inicia el programa elevado con todos los privilegios de administrador. (Solo Windows Vista o posterior).


1
¿Cómo se relaciona esto con la pregunta?
user2064000

@DavidGrainger resulta que el interruptor / elevado todavía no me permite omitir UAC y hacer la elevación en el lugar (ver la pregunta para más detalles). ¿Me estoy perdiendo de algo?
user2064000

Este es un reemplazo para el símbolo del sistema de Windows. Además, iniciarlo elevado no es diferente de iniciar el símbolo del sistema incorporado elevado.
Digo reinstalar a Mónica el

La única forma tal vez sea cambiar la configuración de UAC a "Nunca notificar" Cuando aparezca la notificación de UAC, haga clic en el enlace "Mostrar más detalles", luego seleccione el enlace "Mostrar cuándo debería aparecer esta notificación". Seleccione la configuración que funciona. Es posible que desee volver a cambiarlo cuando haya terminado, de modo que las acciones no deseadas queden atrapadas. Esto se puede lograr en la configuración de Windows.
David Grainger el

TCC / LE hace muchas otras cosas también. Lo probé con el UAC establecido en nunca y luego usé "Inicio / Elevado / PGM" C: \ Archivos de programa \ IrfanView \ i_view64.exe "/ thumbs" para abrir un programa Elevado.
David Grainger el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.