Fichier batch avec commandes à exécuter en tant qu'administrateur et utilisateur standard

9

J'essaie d'écrire un fichier de commandes qui doit exécuter certaines commandes à l'aide d'un compte d'administrateur local (démarrer / arrêter un service) et certaines commandes à l'aide de l'utilisateur connecté (copier les fichiers du répertoire utilisateur) et je rencontre des problèmes. J'ai essayé les commandes suivantes:

runas avec / savecred

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

Lors de l'utilisation, /savecredje ne suis pas invité à entrer un mot de passe. Au lieu de cela, une fenêtre d'invite de commande clignote brièvement et disparaît. Je ne peux pas dire ce qui est dans cette fenêtre. Le service n'est pas arrêté.

runas sans / sauvegardé

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

Ces commandes m'invitent à saisir un mot de passe, mais présentent le même comportement que les commandes ci-dessus - une fenêtre d'invite de commande apparaît brièvement et le service n'est pas arrêté.

Idéalement, je voudrais enregistrer le mot de passe pour la session car je devrai exécuter plus de commandes avec les détails.

Est-ce possible et si oui, que fais-je de mal?

Stuart Leyland-Cole
la source
ajouter la commande "pause" à la fin pour l'arrêter cfrom fermeture
Martin
J'ai déjà une pause à la fin de mon fichier de commandes, mais les commandes lancent une autre invite de commandes - je ne sais pas comment arrêter cette disparition.
Stuart Leyland-Cole
essayez de diriger la sortie vers un fichier et voyez s'il y imprime quelque chose: "runas / user: (nom du PC) (nom d'utilisateur admin)" net stop \ "(nom du service) \" ">> log.txt"
Martin
Je dois exécuter la commande avec l'option / savecred sinon l'invite pour le mot de passe apparaît dans le fichier journal. Si je lance runas /user:(PC name)\(username) /savecred "net stop \"(service name)\"" >> log.txtrien n'est sorti dans le fichier journal.
Stuart Leyland-Cole
Consultez la page de débogage par lots de Rob van der Woude: robvanderwoude.com/battech_debugging.php . Plus important encore, téléchargez LOGBATCH.BAT et exécutez-le en tant que tel: LOGBATCH.BAT yourbatch.bat any_parameters_your_batch_needsil créera un fichier journal contenant toutes les commandes / actions effectuées par yourbatch.batFaites-nous savoir ce que vous y voyez.
JSanchez

Réponses:

12

Vous pouvez ajouter ce qui suit à votre script et cela le forcera à s'exécuter en mode élevé. Pas besoin de télécharger quoi que ce soit.

:: 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"
:--------------------------------------
user325534
la source
Tout cela ne fait qu'imprimer Requesting administrative privileges...à l'écran jusqu'à ce qu'il expire.
The Muffin Man
@L'homme aux muffins. Ajoutez vos commandes à la fin du fichier de commandes et il les exécutera après l'élévation.
pelms
1
cette méthode est excellente. il ne nécessite aucune dépendance supplémentaire (comme psexec).
William
Entré dans une boucle infinie avec ce script ...
JackTheKnife
0

divisez votre fichier batch en deux. La partie que vous souhaitez exécuter en tant que collage admincmd sur system32. La partie que vous souhaitez exécuter en cmd normal le colle dans le dossier normal, et à partir d'ici, appelez le deuxième fichier de commandes, qui est le système32. De cette façon, la deuxième partie s'exécute toujours en admincmd. Je l'ai essayé et ça marche pour moi.

sudhi
la source
0

Si cela ne vous dérange pas les logiciels tiers, vous pouvez essayer d' exécuter en tant que mot de passe runasspc. Il enregistrera votre mot de passe dans un fichier crypté. Le mot de passe n'a pas besoin d'être exposé dans le fichier de commandes.

Soleil
la source
0

La commande "Runas" ne fera pas "sudo" votre commande.

Pour ce faire à partir d'un fichier batch, vous devez "élever" les commandes que vous générez. Téléchargez les scripts Elevate Powertoy.

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

Lancez vos commandes en tant que:

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

ou

runas /user:(PC name)\(admin username) /savecred "elevate sc stop \"(service name)\""
surfasb
la source
J'ai essayé les 3 commandes suivantes: 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"et chacun d'eux renvoie cette erreur: erreur RUNAS: Impossible d'exécuter - net stop elevate.cmd alfrescoTomcat -2147467259: Erreur non spécifiée
Stuart Cole-Leyland
Fichier batch de 3 lignes qui exécutera la commande élevée: github.com/kasajian/pseudo
zumalifeguard
0

Ce que j'utilise est le code suivant:

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

Mettez-le après votre @echo et vos remarques.

FifthAxiom
la source
0

Réponse simplifiée (en plus de user325534) si vous avez seulement besoin de commencer à travailler dans un répertoire avec un accès amélioré:

@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
la source
0

Ce code permet au cmd de demander le mot de passe utilisateur. L'utilisateur doit saisir son mot de passe, puis le executable.batsera exécuté en tant qu'administrateur

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
jfraber
la source