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
)