¿Es posible ejecutar automáticamente un archivo por lotes como administrador?


48

Me pregunto si es posible abrir automáticamente un archivo por lotes como administrador cuando hace doble clic en el archivo por lotes, porque los comandos deben ejecutarse con derechos administrativos.

Nota: Ya conozco la solución de hacer clic derecho en el archivo y hacer clic en Run As Administrator, pero esta no es una solución automática.



Pude hacer que esto funcionara para mí: stackoverflow.com/a/13811519/27928
Rohit

2
¿Cómo es que dos clics izquierdos son más automáticos que uno izquierdo y uno derecho?
jiggunjer

Respuestas:


44

Sí, puede ejecutar un archivo por lotes con derechos administrativos. Desafortunadamente, no puede hacer esto directamente desde el archivo por lotes. Debería crear primero un acceso directo de ese archivo por lotes y cambiar las propiedades de ese acceso directo para que esto funcione.

Para crear un acceso directo, hay muchas formas, pero la forma más simple y rápida es usar la opción Enviar a en el menú contextual.

Right click batch file > Send to > Desktop (create shortcut)

Por supuesto, puede enviar el acceso directo a donde quiera. Para elevar el archivo por lotes para que se ejecute como administrador, siga los pasos a continuación:

  1. Haga clic derecho en el acceso directo que acaba de crear (debe estar en el escritorio o donde lo envíe)
  2. En la pestaña Acceso directo, haga clic en el botón Avanzado ...
  3. Marque la casilla de verificación Ejecutar como administrador y presione Aceptar tanto en la ventana modal como en la ventana principal de propiedades.
  4. Ejecute el acceso directo haciendo doble clic en él y el archivo por lotes debe ejecutarse como administrador.

1
Siempre puede forzar al archivo por lotes a llamar al acceso directo, y hacer que el acceso directo pase un parámetro para saber que no debe llamar al acceso directo. Insertaría algo como if "%~1" == "" start %USERPROFILE%\Desktop\Shortcut.lnk && GOTO :EOFjusto debajo @echo off, y haría el enlace de acceso directo a en program.bat alugar de solo program.bat.
Trly

2
Ifedi escribe "La respuesta aceptada [esta de Tech1337] realmente funciona. Pero descubrí que en Windows 7, tenía que soportar el diálogo UAC cada vez que se hacía clic en el acceso directo". <- Aunque alguien más dice que funciona sin UAC
barlop

Para mí, el acceso directo no se ejecuta en el directorio actual cuando se hace doble clic, aunque el .bat sí. Incluso con la propiedad "Iniciar en:" en el acceso directo completado. Así que asegúrese de que su archivo .bat especifique las rutas completas de los archivos.
Rob Mosher

29

Como se publicó en una respuesta de Ben Gripka a otra pregunta:

REM --add the following to the top of your bat file--


@echo off

:: BatchGotAdmin
:-------------------------------------
REM  --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
    echo Requesting administrative privileges...
    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    set params = %*:"=""
    echo UAC.ShellExecute "cmd.exe", "/c %~s0 %params%", "", "runas", 1 >> "%temp%\getadmin.vbs"

    "%temp%\getadmin.vbs"
    del "%temp%\getadmin.vbs"
    exit /B

:gotAdmin
    pushd "%CD%"
    CD /D "%~dp0"
:--------------------------------------

Sí, encontré esto y lo estoy usando actualmente. ¡Gracias de todos modos!
Antp

Esencialmente lo que estaba buscando. ¿Esperaba que hubiera una manera de hacer esto sin usar VB?
Chef Faraón

@ChefPharaoh esto crea una consola elevada para ejecutar el archivo por lotes. Puede hacer lo mismo con un script de PowerShell.
jiggunjer

Esta fue la mejor respuesta para mí.
kasperhj

4

La respuesta aceptada sí funciona. Pero descubrí que en Windows 7, tenía que soportar el diálogo UAC cada vez que se hacía clic en el acceso directo. ¡En mi humilde opinión, esto disminuye significativamente "automáticamente" en esta pregunta!

Luego descubrí que, en mi propia situación, el .batprograma en cuestión debe ejecutar el archivo en cuestión. En este caso, al marcar la Run with highest privilegesopción en la Generalpestaña de la tarea, se soluciona muy bien el problema. La .batcontinuación, se ejecuta como administrador sin ningún tipo de molestias.

PD: ¡No me di cuenta de que no podía cargar imágenes en esta respuesta, porque ahora tengo una pequeña captura de pantalla conmigo! O puedo?


2
Si agrega enlaces a las imágenes, alguien los alineará por usted.
Ramhound

@Ramhound. Añadir enlaces a las imágenes? La imagen está en mi escritorio, no en algún lugar en línea. ¿O seguramente me estoy perdiendo algo?
Ifedi Okonkwo

Sí; Los subes; Simplemente no puede incluir las capturas de pantalla en su respuesta.
Ramhound

¡O ese botón de carga no estaba allí, o ayer estaba medio ciego! Estoy seguro de que fue lo último. De todos modos, completé la carga del archivo muy bien, solo para que me dijeran que necesitaba un representante de 10 para publicar imágenes. Gracias, sin embargo.
Ifedi Okonkwo

Sin embargo, aún puede colocar el enlace en la respuesta.
Ramhound

4

en Windows 7

  1. Crear un acceso directo a ese archivo Batch

  2. Haga clic derecho en el archivo de acceso directo

  3. Haga clic en el botón de avance para encontrar una casilla de verificación para ejecutar como administrador

Mira la captura de pantalla a continuación

Captura de pantalla


1
Dices lo mismo que la respuesta aceptada.
Antp

Sí, solo quería crear una lista simple con captura de pantalla para todos los que tienen prisa.
fedmich

3
Si alguien tiene prisa, dudo que se desplace hacia abajo para obtener la respuesta. Gracias de todos modos
Antp

3

Puede usar mi script Batch_Admin para elevar automáticamente al Administrador para su uso en cualquier tipo de script propio de Batch, o BAT o .CMD. Esta función asegura el trabajo en un entorno estándar, con herramientas estándar y de la misma manera en diferentes sistemas Windows. Utiliza varios comandos estándar e integrados de Windows. No use ningún otro script externo. Se puede usar para llamar a cualquier programa como Administrador, no solo scripts Batch. Es suficiente crear un pequeño script, que luego llama al programa que requiere permiso de administrador. Coloque esto en cualquier carpeta PATH de búsqueda (desde% PATH%).

Para usarlo, simplemente inserte la siguiente línea (exactamente como) en su secuencia de comandos Batch principal, que se ejecutará como Administrador. Esto se hace mejor en la parte superior de nuestro script principal y es mejor que primero, que se llamará a través de la LLAMADA adicional, algunos sub-scripts (vea la explicación detallada a continuación).

net session >nul 2>nul&if errorlevel 1  Batch_Admin "%~0" %*

Esto se puede insertar dentro de cualquier script secundario, llamado por la sintaxis CALL. Para mostrar un mensaje mientras todavía no tiene privilegios de administrador, por ejemplo. durante 5 segundos antes de llamar a Batch_Admin establezca la variable "ShowAdminInfo" en la cantidad de segundos

SET ShowAdminInfo=5
net session >nul 2>nul&if errorlevel 1  Batch_Admin "%~0" %*

Entonces, cómo funciona:

• Llama a UAC.ShellExecute a través de VBScript para recoger los permisos de usuario

• Batch ejecuta el script, o BAT o CMD

• La persona que llama al script puede tener espacios de nombre largos incluidos en la llamada entre comillas

• Devuelva todos los parámetros a la llamada al script maestro pasado desde la línea de comando, como si no hubiera transmisión de la llamada y comience algo desde cero, también con caracteres especiales, como signos de exclamación (!) Y porcentaje (%), y también con paréntesis ()

• Contiene una ubicación de script maestro si la llamada se realizó en el directorio donde este script es el maestro

• Auxiliar muestra un mensaje si establecemos ante nosotros la variable "ShowAdminInfo", por ejemplo. durante 5 segundos, lo que puede evitar el paso inmediato de los derechos del Administrador que proporciona información adicional y la posibilidad de una decisión informada. Ejemplos de configuración que debe establecerse: SET ShowAdminInfo = 5 De manera predeterminada, porque esta variable no está definida, no se muestra.

• El script está llamando también en la ruta de búsqueda del sistema% PATH% y desde un recurso de red, como: \ Computer \ share \ test.bat

• Evita malentendidos al escribir los archivos auxiliares necesarios cuando el script llama a varios Batch_Admin casi al mismo tiempo. Utiliza el número aleatorio del 1 al 100

• Pero, lo mejor es usarlo en el script principal. La transición a los derechos de administrador siempre requiere que ejecute el script completamente de nuevo, en una nueva ventana, en un nuevo entorno, sin recurrir a las variables que se configuraron previamente en nuestro script y los valores de estas variables no pasaron para llamar como Administrador . Solo el script se ejecutará nuevamente.

Debajo de un script completo Batch_Admin. Información extendida sobre esto está en mi sitio.

Copie el siguiente texto en el Bloc de notas y guárdelo en el disco como: Batch_Admin.bat

@echo off
if "%~1"=="" (echo *** Batch_Admin ***&echo.&echo Automatically get admin rights for another Batch. See info inside.&TIMEOUT /T 30>nul&goto:eof)

::  A D M I N I S T R A T O R   - Automatically get admin rights for script batch. Paste this on top:    net session >nul 2>nul&if errorlevel 1  Batch_Admin "%~0" %*
::                                Also keep Batch directory localisation and then set variable:   PATH_BAT
::                                if earlier variable "ShowAdminInfo" is empty (not defined) then no info, else showing info with number of seconds
::
::                                Elaboration:  Artur Zgadzaj
setlocal
setlocal DisableDelayedExpansion

SET "Localy="
if exist "%~1"      SET "Localy=YES"
if exist "%~1.BAT"  SET "Localy=YES"
if exist "%~1.CMD"  SET "Localy=YES"
if defined Localy   FOR %%I IN ("%~1") DO SET "PATH_BAT=%%~dI%%~pI"

 SET P1=%~1
 SET Parameters=%*
 SET Parameters=%Parameters:!=^^!%
setlocal EnableDelayedExpansion
 SET Parameters=!Parameters:%P1%=!
 SET Parameters=!Parameters:%%=%%%%!
setlocal DisableDelayedExpansion
 SET Parameters=%Parameters:~3%

net session >nul 2>nul&if not errorlevel 1  goto Administrator_OK

if not defined ShowAdminInfo   goto skip_message_Administrator
echo.
echo Script:  %~1
echo.
echo *****************************************************************
echo ***    R U N N I N G     A S     A D M I N I S T R A T O R    ***
echo *****************************************************************
echo.
echo Call up just as the Administrator. You can make a shortcut to the script and set:
echo.
echo          shortcut ^> Advanced ^> Running as Administrator
echo.
echo     Alternatively run once "As Administrator"
echo     or in the Schedule tasks with highest privileges
echo.
echo Cancel Ctrl-C or wait for launch  %ShowAdminInfo%  seconds ...
TIMEOUT /T %ShowAdminInfo% > nul

:skip_message_Administrator
MD %TEMP% 2> nul
SET /A $Admin$=%RANDOM% * 100 / 32768 + 1

SET "Percent="
del "%TEMP%\$Admin_%$Admin$%_Test.bat" 2>nul
echo %Parameters% > "%TEMP%\$Admin_%$Admin$%_Test.bat"
if not exist "%TEMP%\$Admin_%$Admin$%_Test.bat"  SET Percent=^"
del "%TEMP%\$Admin_%$Admin$%_Test.bat" 2>nul

echo @SET "PATH_BAT=%PATH_BAT%"               > "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat"
echo @SET "BatchFullName=%BatchFullName%"    >> "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat"
if defined Localy  (echo @CD /D "%PATH_BAT%" >> "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat")
echo @"%~1" %Parameters% %Percent% >> "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat"

echo SET UAC = CreateObject^("Shell.Application"^)                                   > "%TEMP%\$Admin_%$Admin$%_Batch_getPrivileges.vbs"
echo UAC.ShellExecute "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat", "", "", "runas", 1 >> "%TEMP%\$Admin_%$Admin$%_Batch_getPrivileges.vbs"
"%TEMP%\$Admin_%$Admin$%_Batch_getPrivileges.vbs"
endlocal
exit /B

:Administrator_OK
"%~1" %Parameters%
goto:eof
REM *** A D M I N I S T R A T O R  - Automatically get admin rights  (The End)  ***

Creo que esto es similar o idéntica a la anterior respuesta: superuser.com/a/852877/375935
jiggunjer

1

Alternativamente, podría crear un segundo archivo por lotes, esto podría permitirle ejecutar cualquier cosa como administrador, mientras solo ingresa la contraseña de administrador una vez. La contraseña se guarda en un token de autenticación, y requiere una verdadera computadora para descifrar.

runas /savecred /user:(domain)\(admin user) "(file path to exe,bat,whatever)"

1
@echo off        
:: BatchGotAdmin        
:-------------------------------------        
REM  --> Check for permissions  
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"  
REM --> If error flag set, we do not have admin.  
if '%errorlevel%' NEQ '0' (    echo Requesting administrative privileges...    goto UACPrompt) else ( goto gotAdmin )  
:UACPrompt  
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"  
    echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"  
    "%temp%\getadmin.vbs"  
    exit /B
:gotAdmin  
chkdsk

Esto también funciona FUENTE: https://social.technet.microsoft.com/Forums/windows/en-US/bc8a4561-d97e-4339-9b1c-9b90e54a7f92/request-elevation-inside-cmdbatch-file


¿Puedes explicar tu solución?
scai


0

Puede usar una utilidad de línea de comandos elevate. (enlace de descarga: https://drive.google.com/open?id=0Bz7qe_olclTwVGZLUklFMHNxQ00 )

Usage: Elevate [-?|-wait|-k] prog [args]
-?    - Shows this help
-wait - Waits until prog terminates
-k    - Starts the the %COMSPEC% environment variable value and
                executes prog in it (CMD.EXE, 4NT.EXE, etc.)
prog  - The program to execute
args  - Optional command line arguments to prog

¿No te trae esto un análisis de UAC?
Antp

eso trae a colación ... sin embargo, es mejor que nada (ver "acceso denegado" ..)
T.Todua

Sin embargo, no es realmente "automático"
Antp

0

Es un ejemplo para ejecutar el bate como administrador. Esto funciona para mi.

Dice así:

if "%~s0"=="%~s1" ( cd %~sp1 & shift ) else (
  echo CreateObject^("Shell.Application"^).ShellExecute "%~s0","%~0 %*","","runas",1 >"%tmp%%~n0.vbs" & "%tmp%%~n0.vbs" & del /q "%tmp%%~n0.vbs" & goto :eof
)
:eof
start Cmd /k "netsh wlan show profile"
pause </

cls
Color 0A
@echo off
echo.
cls
set/p ProfileName=Type the name of the current Wifi signal? 
echo.
start Cmd /k "netsh wlan show profile name=%ProfileName% key=clear"
pause </
exit
pause

¡Bienvenido a Super User! Si bien esto puede responder la pregunta, sería una mejor respuesta si pudiera proporcionar alguna explicación de por qué lo hace.
DavidPostill

Sin embargo, otra variante de superuser.com/a/852877/375935
jiggunjer
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.