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?
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"
:--------------------------------------
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.
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"
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)\""
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.
@echo off
color 1f
Title Main
Goto start
:Start
runas /user:%username% executable.bat
pause
all code that runs as administrator
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.
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.