programacion off hacer ejemplos como comentarios comandos batch bat avanzados autoejecutable archivos archivo batch-file

batch-file - hacer - echo off bat



Cómo crear un archivo por lotes para ejecutar cmd como administrador (12)

Necesito ejecutar un archivo por lotes que necesita registrar una DLL. El registro de DLL está fallando porque el archivo Batch no está iniciando el símbolo del sistema como "administrador".

¿Hay alguna forma de iniciar el " Símbolo del sistema " como administrador a través del archivo por lotes?

Ambiente: Win7 / Vista


(Esto se basa en la respuesta de @ DarkXphenomenon , que desafortunadamente tuvo algunos problemas).

Debe incluir su código dentro de esta envoltura:

if _%1_==_payload_ goto :payload :getadmin echo %~nx0: elevating self set vbs=%temp%/getadmin.vbs echo Set UAC = CreateObject^("Shell.Application"^) >> "%vbs%" echo UAC.ShellExecute "%~s0", "payload %~sdp0 %*", "", "runas", 1 >> "%vbs%" "%temp%/getadmin.vbs" del "%temp%/getadmin.vbs" goto :eof :payload echo %~nx0: running payload with parameters: echo %* echo --------------------------------------------------- cd /d %2 shift shift rem put your code here rem e.g.: perl myscript.pl %1 %2 %3 %4 %5 %6 %7 %8 %9 goto :eof

Esto hace que el archivo por lotes se ejecute como usuario elevado. Agrega dos parámetros al código privilegiado:

  • palabra de payload , para indicar que es una llamada de carga útil, es decir, ya elevada. De lo contrario, simplemente abriría nuevos procesos una y otra vez.

  • Ruta del directorio donde se llamó el script principal. Debido a que Windows siempre inicia el archivo cmd.exe elevado en "% windir% / system32", no hay una manera fácil de saber cuál era la ruta original ( y retener la capacidad de copiar su script sin tocar el código)

Nota: Desafortunadamente, por alguna razón, el shift no funciona para %* , así que si necesita pasar argumentos reales, tendrá que recurrir a la notación fea que usé en el ejemplo ( %1 %2 %3 %4 %5 %6 %7 %8 %9 ), que también introduce el límite de máximo de 9 argumentos


Aquí hay una versión más simple de esencialmente el mismo archivo.

@echo off break off title C:/Windows/system32/cmd.exe cls :cmd set /p cmd=C:/Enter Command: %cmd% echo. goto cmd


Como el usuario 2549366 sugirió anteriormente, "Puede usar un acceso directo que enlaza con el archivo por lotes". pero en la pestaña Propiedades -> Compatibilidad del acceso directo, ejecutar como administrador puede estar deshabilitado.

Entonces, simplemente haga clic derecho en su "archivo.bat - acceso directo" y luego vaya a -> Propiedades -> pestaña Acceso directo -> Avanzado y allí puede hacer clic en Ejecutar como administrador. Después de eso, puede ejecutar el acceso directo.


Es posible que tenga que usar otro archivo por lotes primero para iniciar el segundo con derechos de administrador.

En el primer uso

runas /noprofile /user:mymachine/administrator yourbatchfile.bat

Después de leer más, debe poder escribir la contraseña cuando se le solicite. No puede canalizar la contraseña ya que esta función fue bloqueada por razones de seguridad.

Puede tener más suerte con psexec .


Esta podría ser una solución. He hecho algo similar, pero esta no parece funcionar, por ejemplo, si la función necesaria requiere privilegios de administrador, debería pedirle que la reinicie como administrador.

@echo off mkdir C:/Users/cmdfolder if echo=="Access is denied." (goto :1A) else (goto :A4) :A1 cls color 0d echo restart this program as administator :A4 pause


Este script hace el truco! Solo pégalo en la parte superior de tu archivo bat. Si desea revisar la salida de su script, agregue un comando de "pausa" en la parte inferior de su archivo por lotes.

Este script ahora está ligeramente editado para admitir argumentos de línea de comando.

@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" ::-------------------------------------- ::ENTER YOUR CODE BELOW:


Esto funciona para mí en Windows 7 a 10 con parámetros y también para iniciar la aplicación o el archivo desde cualquier lugar (incluido el navegador) y también para acceder al archivo desde cualquier lugar, Reemplazar (SU ANUNCIO DE GUARDADO AQUÍ) con su código, esta solución puede ayudar: )

@echo off call :isAdmin if %errorlevel% == 0 ( goto :run ) else ( echo Requesting administrative privileges... goto :UACPrompt ) exit /b :isAdmin fsutil dirty query %systemdrive% >nul exit /b :run <YOUR BATCH SCRIPT HERE> exit /b :UACPrompt echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%/getadmin.vbs" echo UAC.ShellExecute "cmd.exe", "/c %~s0 %~1", "", "runas", 1 >> "%temp%/getadmin.vbs" "%temp%/getadmin.vbs" del "%temp%/getadmin.vbs" exit /B`


Haga un texto usando el bloc de notas o cualquier editor de texto que usted elija. Abra el bloc de notas, escriba este comando corto "cmd.exe" sin la cita y guárdelo como cmd.bat.

Haga clic en cmd.bat y elija "Ejecutar como administrador".


Para evitar que el script falle cuando el archivo de script reside en una unidad que no es del sistema (c :) y en un directorio con espacios.

Batch_Script_Run_As_Admin.cmd

@echo off if _%1_==_payload_ goto :payload :getadmin echo %~nx0: elevating self set vbs=%temp%/getadmin.vbs echo Set UAC = CreateObject^("Shell.Application"^) >> "%vbs%" echo UAC.ShellExecute "%~s0", "payload %~sdp0 %*", "", "runas", 1 >> "%vbs%" "%temp%/getadmin.vbs" del "%temp%/getadmin.vbs" goto :eof :payload ::ENTER YOUR CODE BELOW:: ::END OF YOUR CODE:: echo. echo...Script Complete.... echo. pause


Presione Ctrl + Mayús y haga doble clic en un acceso directo para ejecutar como un proceso elevado.

Funciona desde el menú de inicio también.


Puede utilizar un acceso directo que enlaza con el archivo por lotes. Simplemente ingrese a las propiedades para el acceso directo y seleccione avanzado, luego "ejecutar como administrador".

Luego simplemente oculte el archivo por lotes y ejecute el acceso directo.

De esta manera, incluso puede configurar su propio icono para el acceso directo.


Tal vez algo como esto:

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 )