2012-07-17 31 views
17

Necesito ejecutar un archivo por lotes que necesita registrar una DLL. El registro DLL está fallando porque el archivo por lotes no está iniciando el símbolo del sistema como "administrador".Cómo crear un archivo por lotes para ejecutar cmd como administrador

¿Hay alguna manera de empezar el "Símbolo del sistema " como administrador a través del archivo por lotes.

Medio Ambiente: Win7/Vista

+1

http://technet.microsoft.com/en-us/library/bb490994 –

+0

Véase también [¿Cómo puedo auto-elevar mi archivo por lotes, por lo que solicita de los derechos de administrador de UAC si es necesario?] (http://stackoverflow.com/questions/7044985/how-can-i-auto-elevate-my-batch-file-so-that-it-requests-from-uac-admin -derechos) – GAThrawn

+0

@EdGreaves es ese enlace no a esta pregunta? – notyou

Respuesta

5

Puede que tenga que utilizar otro archivo por lotes primero en lanzar el segundo con derechos de administrador.

En el primer uso

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

Tras la lectura adicional, debe ser capaz de escribir la contraseña en el indicador. No puede canalizar la contraseña ya que esta característica se bloqueó por razones de seguridad.

Puede tener más suerte con psexec.

+0

Voy a tratar de implementar su solución, – JChan

+0

He intentado con el comando anterior, pero me pide una contraseña de administrador que no sabré. – JChan

+0

@JChan Parece que no puede completar automáticamente la contraseña, esta función se ha desactivado, consulte mi respuesta actualizada. –

7

(Esto se basa en @DarkXphenomenon's answer, que desafortunadamente tuvo algunos problemas.)

Es necesario incluir su código dentro de este contenedor:

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 

Este archivo por lotes hace funcionar por sí mismo como usuario elevados. Se añade dos parámetros en el código privilegiado:

  • palabra payload, para indicar esto es llamada carga útil, es decir, ya elevado. De lo contrario, solo abriría nuevos procesos una y otra vez.

  • vía de acceso de directorio donde se ha llamado al script principal. Debido al hecho de que Windows siempre aperturas elevadas cmd.exe en "% windir% \ system32", no hay manera fácil de saber cuál era la ruta original ( y retener capacidad de copiar la secuencia de comandos alrededor sin tocar código)

Nota: Desafortunadamente, por alguna razón shift no funciona para %*, así que si necesitas para pasar argumentos reales, usted tendrá que recurrir a la notación fea solía en el ejemplo ()), que también trae el límite de máximo de 9 argumentos

1

Puede usar un acceso directo que enlace al archivo por lotes. Simplemente vaya a las propiedades para el acceso directo y seleccione avanzado, luego "ejecutar como administrador".

Luego solo haga que el archivo por lotes esté oculto y ejecute el acceso directo.

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

+1

Mi casilla de verificación 'ejecutar como administrador' está deshabilitada. ¿Cómo puedo superarlo? –

+0

Hm, no estoy seguro. Eso es interesante. – user2549366

0

esto podría ser una solución, he hecho algo similar, pero este parece no funcionar por ejemplo, si la función necesaria requiere privilegios de administrador, debería pedirte que la reinicies 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 
1

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 
) 
22

Este script hace el truco! Solo péguelo 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.

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: 
+0

este código funciona para habilitar el servicio de actualización de Windows. Pero no funciona para deshabilitar el servicio de actualización de Windows 'sc stop wuauserv & sc config wuauserv start = disabled' – BlackFire

+0

Nota: este código ocasionalmente no funcionará si se ejecuta desde subdirectorios de una unidad diferente. Vea mi pregunta aquí: https://superuser.com/questions/1192426/batch-file-only-runs-properly-from-c-drive/1192427#1192427 – Blaine

3

Prensa Ctrl +Shift y haga doble clic en un acceso directo a correr como un proceso elevada.

Funciona desde el menú de inicio también.

3

Esto funciona para mí`en Windows 7 a 10 con parámetros y también inicia la aplicación o archivo desde cualquier lugar (incluido el navegador) y también accediendo al archivo desde cualquier lugar, Reemplazar (SU BATCH SCRIPT ancla HERE) con su código, esto 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` 
0

Como usuario 2549366 sugirió antes, "Puede utilizar 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.

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

-3

Haz un texto usando el bloc de notas o cualquier editor de texto de tu elección. 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 seleccione "ejecutar como administrador".

0

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 
2

Para evitar que el script falle cuando el archivo de script reside en un disco 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 
Cuestiones relacionadas