Archivo por lotes con comandos para ejecutar como administrador y usuario estándar


9

Estoy tratando de escribir un archivo por lotes que necesita ejecutar algunos comandos con una cuenta de administrador local (iniciar / detener un servicio) y algunos comandos con el usuario conectado (copiar archivos del directorio de usuarios) y estoy teniendo problemas. He intentado los siguientes comandos:

runas con / savecred

runas /user:(PC name)\(admin username) /savecred "net stop \"(service name)\""
runas /user:(PC name)\(admin username) /savecred "sc stop \"(service name)\""

Cuando uso /savecredno se me solicita una contraseña. En cambio, una ventana de símbolo del sistema parpadea brevemente y desaparece. No puedo decir qué hay en esta ventana. El servicio no se detiene.

runas sin / savecred

runas /user:(PC name)\(admin username) "net stop \"(service name)\""
runas /user:(PC name)\(admin username) "sc stop \"(service name)\""

Estos comandos me solicitan una contraseña pero luego muestran el mismo comportamiento que los comandos anteriores: aparece brevemente una ventana de símbolo del sistema y el servicio no se detiene.

Idealmente, me gustaría guardar la contraseña para la sesión, ya que necesitaré ejecutar más comandos con los detalles.

¿Es esto posible y si es así, qué estoy haciendo mal?


agregue el comando "pausa" al final para detenerlo desde el cierre
— Martin

Ya tengo una pausa al final de mi archivo por lotes, pero los comandos están iniciando otro símbolo del sistema; no sé cómo detener esa desaparición.
— Stuart Leyland-Cole el

intente dirigir la salida a un archivo y vea si le imprime algo: "runas / user: (nombre de la PC) (nombre de usuario del administrador)" net stop \ "(nombre del servicio) \" ">> log.txt"
— Martin

Tengo que ejecutar el comando con la opción / savecred; de lo contrario, la solicitud de contraseña aparece en el archivo de registro. Si ejecuto, runas /user:(PC name)\(username) /savecred "net stop \"(service name)\"" >> log.txtno se envía nada al archivo de registro.
— Stuart Leyland-Cole

Consulte la página de depuración por lotes de Rob van der Woude: robvanderwoude.com/battech_debugging.php . Lo que es más importante, descargue LOGBATCH.BAT y ejecútelo como tal: LOGBATCH.BAT yourbatch.bat any_parameters_your_batch_needsy creará un archivo de registro que contiene cada comando / acción realizada por yourbatch.batHáganos saber lo que ve allí.
— JSanchez

Respuestas:


12

Puede agregar lo siguiente a su secuencia de comandos y lo obligará a ejecutarse de forma elevada. No es necesario descargar nada.

:: 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
    if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
    pushd "%CD%"
    CD /D "%~dp0"
:--------------------------------------

Todo lo que hace es imprimir Requesting administrative privileges...en la pantalla hasta que se agote el tiempo de espera.
— The Muffin Man

@The Muffin Man. Agregue sus comandos al final del archivo por lotes y los ejecutará después de la elevación.
— pelms

1
Este método es excelente. no requiere dependencias adicionales (como psexec).
— William


0

divide tu archivo por lotes en dos. La parte que desea ejecutar como admincmd pega en system32. La parte que desea ejecutar en cmd normal, péguela en la carpeta normal, y desde aquí llame al segundo archivo por lotes que hay system32. De esta manera, la segunda parte siempre se ejecuta en admincmd. Lo he intentado y funciona para mí.


0

Si no le importa el software de terceros, puede intentar ejecutar como contraseña runasspc. Guardará su contraseña en un archivo cifrado. La contraseña no necesita estar expuesta en el archivo por lotes.


0

El comando "Runas" no "sudo" su comando.

Para hacer esto desde un archivo por lotes, debe "elevar" los comandos que está generando. Descargue los scripts de Elevate Powertoy.

http://technet.microsoft.com/en-us/magazine/2008.06.elevation.aspx

Lanza tus comandos como:

runas /user:(PC name)\(admin username) /savecred "elevate.cmd net stop \"(service name)\""

o

runas /user:(PC name)\(admin username) /savecred "elevate sc stop \"(service name)\""

He probado los 3 comandos siguientes: runas /user:$PcName\$Username /savecred "elevate.cmd sc stop \"$ServiceName\"", runas /user:$PcName\$Username /savecred "elevate.cmd net stop \"$ServiceName\"", runas /user:$PcName\$Username /savecred "elevate.cmd net stop $ServiceName"y cada uno de ellos devuelve este error: ERROR de RUNAS: No se puede ejecutar - net stop elevate.cmd alfrescoTomcat -2147467259: Error no especificado
— Stuart Leyland-Cole

Archivo por lotes de 3 líneas que ejecutará el comando elevado: github.com/kasajian/pseudo
— zumalifeguard

0

Lo que uso es el siguiente código:

::#################################################################################################################################
:: Elevate this script                                                                                                            #
::#################################################################################################################################

(
    :: Check Admin rights and create VBS Script to elevate
    >nul fsutil 2>&1 || (

        :: Very little red console
        mode con cols=80 lines=3 
        color cf

        :: Message
        title Please wait...
        echo.
        echo                         Requesting elevated shell...

        :: Create VBS script
        echo Set UAC = CreateObject^("Shell.Application"^)>"%TEMP%\elevate.vbs"
        echo UAC.ShellExecute "%~f0", "%TEMP%\elevate.vbs", "", "runas", 1 >>"%TEMP%\elevate.vbs"
        if exist "%TEMP%\elevate.vbs" start /b >nul cscript /nologo "%TEMP%\elevate.vbs" 2>&1
        exit /b
    )

    :: Delete elevation script if exist
    if exist "%~1" >nul del /f "%~1" 2>&1
)

pushd "%~dp0"

.... your code ....

popd

Ponlo después de tu @echo off y comentarios.


0

Respuesta simplificada (además del usuario325534) si solo necesita comenzar a trabajar en algún directorio con acceso evevated:

@echo off

set MyWorkDir=D:\dev\

echo Requesting administrative privileges...

echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "cmd", "/C start /D %MyWorkDir% cmd", "", "runas", 1 >> "%temp%\getadmin.vbs"

"%temp%\getadmin.vbs"

0

Este código permite que el cmd solicite la contraseña del usuario. El usuario debe escribir su contraseña y luego executable.batse ejecutará como administrador

main.bat

@echo off
color 1f
Title Main
Goto start
:Start
runas /user:%username% executable.bat
pause

ejecutable.bat

all code that runs as administrator
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.