web-dev-qa-db-fra.com

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

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 des fichiers à partir du répertoire de l'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 de /savecred, je 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 suis pas capable de dire ce qu'il y a dans cette fenêtre. Le service n'est pas arrêté.

runas sans/savecred

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

Ces commandes me demandent un mot de passe mais présentent ensuite 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, j'aimerais 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, qu'est-ce que je fais mal?

8
Stuart Leyland-Cole

Vous pouvez ajouter les éléments suivants à votre script et le forcer à exécuter une exécution élevée. 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"
:--------------------------------------
11
user325534

Si un logiciel tiers ne vous dérange pas, vous pouvez essayer de l'exécuter en tant que mot de passe runasspc. Cela 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.

0
Sun

Réponse simplifiée (ajout à user325534) si vous devez seulement commencer à travailler dans certains répertoires avec un accès surélevé:

@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
lietus

La commande "Runas" ne "Sudo" pas votre commande.

Pour ce faire, à partir d'un fichier de commandes, vous devez "élever" les commandes que vous créez. 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)\""
0
surfasb

Ce code permet à la cmd de demander le mot de passe de l'utilisateur. L'utilisateur doit taper son mot de passe, puis le executable.bat sera 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
0
jfraber

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.

0
FifthAxiom

divisez votre fichier batch en deux. La partie que vous voulez exécuter en tant que admincmd paste dans system32. La partie que vous voulez exécuter dans cmd normal, collez-la dans un dossier normal, et à partir de là, appelez le deuxième fichier de commandes qui contient system32. Ainsi, la deuxième partie se déroule toujours admirablement. Je l'ai essayé et ça marche pour moi.

0
sudhi