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?

Stuart Leyland-Cole
fuente
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"
:--------------------------------------
usuario325534
fuente
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
Me metí
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í.

sudhi
fuente
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.

Dom
fuente
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)\""
surfasb
fuente
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.

Quinto axioma
fuente
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"
lietus
fuente
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
jfraber
fuente