J'écris un fichier de commandes que je vais distribuer parmi les utilisateurs. Je dois exécuter des commandes avec des autorisations élevées. Ma solution initiale était d'utiliser:
runas /noprofile /user:Administrator SOME_COMMAND
Cependant, de nombreuses machines (y compris la mine) ont le compte d'administrateur caché inactif et ne disposer pas d'un mot de passe administrateur mis en place. Je ne peux pas non plus spécifier un autre nom d'utilisateur car différentes machines auront des utilisateurs différents. Existe-t-il un moyen de reproduire le "clic droit -> exécuter en tant qu'administrateur" Action via un fichier de commandes? Je ne me dérange pas que l'invite apparaisse, je ne veux tout simplement pas que l'utilisateur soit explicitement cliquant avec le bouton droit de la souris et exécuté en tant qu'administrateur.
Vous pouvez profiter de PowerShell, présent sur chaque système Windows moderne.
Divisez les commandes nécessitant une élévation dans un fichier de commandes distinct, par ex. elevated.bat
. Ensuite, quand il est temps de les exécuter, utilisez-le depuis votre script non élevé:
powershell -command "Start-Process elevated.bat -Verb runas"
Le -Verb runas
La partie est ce qui provoque l'invite d'élévation. Si le fichier de commandes d'origine est déjà exécuté en tant qu'administrateur ou si les invites UAC sont éteintes, le nouveau fichier sera élevé sans une invite.
Notez que le répertoire actuel du processeur de lots élevé commencera comme System32
. Si tel est un problème, vous pouvez utiliser cette version alternative pour le faire démarrer dans le même répertoire que le script non élevé:
powershell -command "Start-Process cmd -ArgumentList '/c %CD% && elevated.bat' -Verb runas"
Cela provoque la nouvelle instance cmd
au premier cd
dans le répertoire fourni par l'invite non admise %CD%
variable, puis exécutez le fichier de commandes souhaité.
Runadmin Vous permet d'exécuter un programme de la ligne de commande avec des droits élevés (il affichera l'UAC afin que l'utilisateur puisse entrer des informations d'identification).
Ce que j'utilise est le code suivant:
::#################################################################################################################################
:: Elevate this script #
::#################################################################################################################################
(
:: Check Admin rights and create VBS Script to elevate
>nul fsutil dirty query %SYSTEMDRIVE% 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 /wait >nul cscript /nologo "%TEMP%\elevate.vbs" 2>&1
:: Delete elevation script if exist
if exist "%TEMP%\elevate.vbs" >nul del /f "%TEMP%\elevate.vbs" 2>&1
exit /b
)
)
pushd "%~dp0"
.... your code ....
popd
Mettez-le après votre @echo Off et Remarques.