Estoy tratando de escribir un archivo por lotes para que mis usuarios lo ejecuten desde sus máquinas Vista con UAC. El archivo está reescribiendo su archivo de hosts, por lo que debe ejecutarse con permisos de administrador. Necesito poder enviarles un correo electrónico con un enlace al archivo .bat. El comportamiento deseado es que cuando hacen clic con el botón derecho en el archivo y dicen Abrir, obtendrán uno de esos cuadros de diálogo de UAC que oscurecen la pantalla y los obligan a responder si desean dar permiso a la aplicación para ejecutarse como administrador. En cambio, solo están viendo "Acceso denegado" en la ventana de la línea de comandos.
¿Es esto posible hacer de manera diferente?
Respuestas:
Este script hace el truco! Solo pégalo en la parte superior de tu archivo bat. Si desea revisar el resultado de su secuencia de comandos, agregue un comando de "pausa" en la parte inferior de su archivo por lotes.
ACTUALIZACIÓN: Este script ahora está ligeramente editado para admitir argumentos de línea de comando y un sistema operativo de 64 bits.
Gracias Eneerge @ https://sites.google.com/site/eneerge/scripts/batchgotadmin
fuente
Aquí hay una frase que he estado usando:
Notas:
fuente
am_admin
if not "%1"=="am_admin" (powershell start -verb runas '%0' 'am_admin "%~1" "%~2"' & exit)
los parámetros estén uno arriba de donde estaban'am_admin %*'
para pasar todo, no funciona bien con comillas y espacios aunque: / Puedes usarloshift
en lote para reventar el primer argumento, arreglando así todos los argumentos excepto%0
.cd /D %~dp0
despuésif not "%1"=="am_admin" (powershell start -verb runas '%0' am_admin & exit /b)
Aquí está mi código! Parece grande, pero se trata principalmente de líneas de comentarios (las líneas que comienzan con: :).
caracteristicas:
Verificación de carpeta asignada (le advierte si el administrador no puede acceder a la unidad asignada)
Se puede utilizar como una biblioteca externa (consulte mi publicación en este tema: https://stackoverflow.com/a/30417025/4932683 )
Simplemente adjunte esto al final de su archivo por lotes, o guárdelo como una biblioteca (verifique arriba)
Ejemplo sobre cómo usarlo
fuente
&fc;: 2>nul
enset "_FN=_%~ns1" & echo/%TEMP%| findstr /C:"(" >nul && (echo/ERROR: %%TEMP%% path can not contain parenthesis &pause &endlocal &fc;: 2>nul & goto:eof)
fijaba el nivel de error a 1. He quitado ese poco y funcionó perfecto. Estoy usando Windows 10 Home.fc;:
ya que va: eof justo después? Tampoco estoy seguro de por qué ese pequeño problema causó el problema, ya que debería ejecutarse.echo/%TEMP%| findstr /C:"(" >nul
comprueba si hay una variable de entorno(
char en su%temp%
entorno, y solo debe ejecutar la parte después de&&
si es positiva. Sin(
embargo, es extraño por qué su prueba es positiva.Otro enfoque es
y entonces
Denis
[Agregado después - Sí, no noté la fecha de este hilo.]
fuente
La solución de Ben Gripka provoca bucles infinitos. Su lote funciona así (pseudocódigo):
Como puede ver, esto provoca un bucle infinito, si el VBS falla al solicitar privilegios de administrador.
Sin embargo, el ciclo infinito puede ocurrir, aunque los privilegios de administrador se han solicitado con éxito.
La verificación en el archivo por lotes de Ben Gripka es propensa a errores. Jugué con el lote y observé que los privilegios de administrador están disponibles aunque la verificación falló. Curiosamente, la verificación funcionó como se esperaba, si comencé el archivo por lotes desde el explorador de Windows, pero no lo hizo cuando lo inicié desde mi IDE.
Así que sugiero usar dos archivos por lotes separados. El primero genera el VBS que llama al segundo archivo por lotes:
El segundo, llamado "my_commands.bat" y ubicado en el mismo directorio que el primero contiene sus comandos reales:
Esto no provoca bucles infinitos y también elimina la comprobación de privilegios de administrador propensa a errores.
fuente
Otra solución de PowerShell ...
No se trata de ejecutar un script por lotes como administrador, sino de cómo elevar otro programa del lote ...
Tengo un archivo por lotes "contenedor" para un exe. Tienen el mismo "nombre de archivo raíz", pero extensiones alternativas. Puedo iniciar el exe como administrador y establecer el directorio de trabajo en el que contiene el script, con la siguiente invocación de PowerShell de una línea :
Más información
¡También hay una gran cantidad de
Start-Process
opciones adicionales que puedes aplicar! Echa un vistazo: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-process?view=powershell-6Tenga en cuenta que uso el
@
prefijo. Eso es equivalente a@echo off
para la una línea. Utilizo%~n0
aquí para obtener el "nombre raíz" del script por lotes, luego concateno el.exe
para señalarlo como el binario adjunto. El uso de%~dp0
proporciona la ruta completa al directorio donde reside el lote. Y, por supuesto, el-Verb RunAs
parámetro proporciona la elevación .fuente
Sé que esta no es una solución para OP, pero como estoy seguro de que hay muchos otros casos de uso aquí, pensé en compartir.
He tenido problemas con todos los ejemplos de código en estas respuestas, pero luego encontré: http://www.robotronic.de/runasspcEn.html
No solo le permite ejecutarse como administrador, sino que comprueba el archivo para asegurarse de que no haya sido manipulado y almacena la información necesaria de forma segura. Admito que no es la herramienta más obvia para descubrir cómo usarla, pero para aquellos de nosotros que escribimos código, debería ser lo suficientemente simple.
fuente
@echo off
ytitle
puede venir antes de este código:Muchas de las otras respuestas son excesivas si no necesita preocuparse por lo siguiente:
cd %~dp0
cambiará al directorio que contiene el archivo por lotes)fuente
Lo anterior funciona en mi Windows 10 versión 1903
fuente
Dado que tengo problemas con este script, aparece un nuevo símbolo del sistema que se ejecuta nuevamente, en bucle infinito (usando Win 7 Pro), le sugiero que pruebe otro enfoque: ¿Cómo puedo elevar automáticamente mi archivo por lotes, para que solicite a ¿Derechos de administrador de UAC si es necesario?
Tenga cuidado, debe agregar esto al final del script, como se indica en una edición, para que pueda volver al directorio del script después de que se hayan elevado los privilegios: cd / d% ~ dp0
fuente
Según la publicación de toster-cx y otras publicaciones interesantes en esta página, obtuve información sobre cómo configurar y resolver mi problema. Tuve un problema similar en el que deseaba que la utilidad Disk Cleanup se ejecute cada semana dos veces los lunes y jueves durante las horas de almuerzo (por ejemplo, 2 pm). Sin embargo, esto requería derechos elevados.
Compartir archivos por lotes que podrían ayudar a otros principiantes como yo:
Muchas gracias por este foro y Rems POST aquí [ https://www.petri.com/forums/forum/windows-scripting/general-scripting/32313-schtasks-exe-need-to-pass-parameters-to-script ] [1]
Su publicación ayudó a configurar el argumento opcional al programar la tarea.
fuente
También está la consulta FSUTIL de esta publicación, que también está vinculada en ss64.com que tiene el siguiente código:
Mientras FSUTIL esté cerca, es una alternativa confiable.
fuente
No puede solicitar derechos de administrador desde un archivo por lotes, pero puede escribir un script de host de scripts de Windows en% temp% y ejecutarlo (y eso a su vez ejecuta su lote como administrador). Desea llamar al método ShellExecute en el Shell. Objeto de aplicación con "runas" como verbo
fuente
Use
mshta
para solicitar derechos de administrador:O, usando powershell:
fuente
usa el comando runas. Pero, no creo que pueda enviar un archivo .bat fácilmente.
fuente
runas
comando no puede usarse para provocar elevación.