File batch con comandi da eseguire come amministratore e utente standard


9

Sto provando a scrivere un file batch che deve eseguire alcuni comandi utilizzando un account amministratore locale (avvio / arresto di un servizio) e alcuni comandi utilizzando l'utente che ha effettuato l'accesso (copia dei file dalla directory dell'utente) e sto riscontrando problemi. Ho provato i seguenti comandi:

rune con / savecred

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

Quando si utilizza /savecrednon mi viene richiesta una password. Invece una finestra del prompt dei comandi lampeggia brevemente e scompare. Non sono in grado di dire cosa c'è in questa finestra. Il servizio non è stato arrestato.

rune senza / salvate

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

Questi comandi mi richiedono una password ma presentano lo stesso comportamento dei comandi precedenti: viene visualizzata brevemente una finestra del prompt dei comandi e il servizio non viene arrestato.

Idealmente, vorrei salvare la password per la sessione in quanto avrò bisogno di eseguire più comandi con i dettagli.

È possibile e, in caso affermativo, cosa sto facendo di sbagliato?


aggiungi il comando "pause" alla fine per fermarlo cfrom chiusura
Martin

Ho già una pausa alla fine del mio file batch, ma i comandi stanno avviando un altro prompt dei comandi: non so come fermarlo.
Stuart Leyland-Cole,

prova a indirizzare l'output su un file e vedi se gli stampa qualcosa: "runas / user: (nome PC) (nome utente admin)" net stop \ "(nome servizio) \" ">> log.txt"
Martin

Devo eseguire il comando con l'opzione / savecred altrimenti il ​​prompt per la password appare nel file di registro. Se corro, runas /user:(PC name)\(username) /savecred "net stop \"(service name)\"" >> log.txtnon viene emesso nulla nel file di registro.
Stuart Leyland-Cole,

Dai un'occhiata alla pagina di debug in batch di Rob van der Woude: robvanderwoude.com/battech_debugging.php . Ancora più importante, scaricare LOGBATCH.BAT ed eseguirlo come tale: LOGBATCH.BAT yourbatch.bat any_parameters_your_batch_needse creerà un file di registro contenente tutti i comandi / azioni eseguiti da yourbatch.batFacci sapere cosa vedi lì.
JSanchez,

Risposte:


12

Puoi aggiungere quanto segue al tuo script e questo lo costringerà a funzionare in modo elevato. Non è necessario scaricare nulla.

:: 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"
:--------------------------------------

Tutto ciò che fa è stampare Requesting administrative privileges...sullo schermo fino al timeout.
The Muffin Man,

@ The Muffin Man. Aggiungi i tuoi comandi alla fine del file batch e li eseguirà dopo l'elevazione.
pelms

1
questo metodo è eccellente. non richiede dipendenze aggiuntive (come psexec).
William,

Sono entrato in un ciclo infinito con quella sceneggiatura ...
JackTheKnife il

0

dividere il file batch in due. La parte che si desidera eseguire come admincmd incolla su system32. La parte che vuoi eseguire nel normale cmd lo incolla in una cartella normale e da qui chiama il secondo file batch che è system32. In questo modo la seconda parte viene sempre eseguita in admincmd. L'ho provato e funziona per me.


0

Se non ti dispiace software di terze parti, puoi provare a eseguirlo come password runasspc. Salverà la tua password in un file crittografato. La password non deve essere esposta nel file batch.


0

Il comando "Runas" non "sudo" il tuo comando.

Per fare questo da un file batch, devi "elevare" i comandi che stai generando. Scarica gli script di Elevate Powertoy.

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

Avvia i tuoi comandi come:

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)\""

Ho provato i seguenti 3 comandi: 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"e ciascuno di essi restituisce questo errore: RUNAS ERRORE: impossibile eseguire - net stop elevate.cmd alfrescoTomcat -2147467259: errore non specificato
Stuart Leyland-Cole

File batch a 3 righe che eseguirà il comando elevato: github.com/kasajian/pseudo
zumalifeguard

0

Quello che uso è il seguente codice:

::#################################################################################################################################
:: 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

Mettilo dopo il tuo @echo off e le osservazioni.


0

Risposta semplificata (aggiunta a user325534) se è necessario iniziare a lavorare solo in alcune directory con accesso 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

Questo codice consente al cmd di richiedere la password dell'utente. L'utente deve digitare la propria password e quindi executable.batverrà eseguito come amministratore

main.bat

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

executable.bat

all code that runs as administrator
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.