Comment exécutez-vous une commande en tant qu’administrateur à partir de la ligne de commande Windows?

J’ai un petit script qui exécute le processus de construction et d’installation sous Windows pour un repository Bazaar que je gère. J’essaie d’exécuter le script avec des privilèges d’administration élevés depuis le shell Windows (cmd.exe) – comme si j’avais cliqué avec le bouton droit et choisi Exécuter en tant qu’administrateur , mais sans utiliser aucune méthode nécessitant l’utilisation de l’interface graphique.

Un hybride batch / WSH peut appeler ShellExecute pour afficher le dialog d’élévation UAC …

@if (1==1) @if(1==0) @ELSE @echo off&SETLOCAL ENABLEEXTENSIONS >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"||( cscript //E:JScript //nologo "%~f0" @goto :EOF ) echo.Performing admin tasks... REM call foo.exe @goto :EOF @end @ELSE ShA=new ActiveXObject("Shell.Application") ShA.ShellExecute("cmd.exe","/c \""+WScript.ScriptFullName+"\"","","runas",5); @end 

Tout ce que vous avez à faire est d’utiliser la commande runas pour exécuter votre programme en tant qu’administrateur (avec un avertissement).

 runas /user:Administrator "cmdName parameters" 

Dans mon cas, c’était

 runas /user:Administator "cmd.exe /C %CD%\installer.cmd %CD%" 

Notez que vous devez utiliser des guillemets, sinon la commande runas va englober l’option switch à cmd.

Notez également que le shell d’administration (cmd.exe) démarre dans le dossier C: \ Windows \ System32. Ce n’est pas ce que je voulais, mais c’était assez facile de transmettre le chemin actuel à mon installateur et de le référencer en utilisant un chemin absolu.

Avertissement: Activer le compte administrateur

L’utilisation de runas de cette manière nécessite que le compte administratif soit activé, ce qui n’est pas le cas par défaut sous Windows 7 ou Vista. Cependant, voici un excellent tutoriel sur la manière de l’activer, de trois manières différentes:

Je l’ai moi-même activé en ouvrant Outils d’administration , Stratégie de sécurité locale , puis en accédant à Stratégies locales \ Options de sécurité et en modifiant la valeur de la stratégie Comptes: Statut du compte administratif sur Activé, qui ne figure pas dans le lien.

Un moyen encore plus simple:

 C:> net user Administrator /active:yes 

Appuyez sur le bouton de démarrage. Dans la zone de recherche, tapez “cmd”, puis appuyez sur Ctrl + Maj + Entrée

 :: ------- Self-elevating.bat -------------------------------------- @whoami /groups | find "S-1-16-12288" > nul && goto :admin set "ELEVATE_CMDLINE=cd /d "%~dp0" & call "%~f0" %*" findstr "^:::" "%~sf0">temp.vbs cscript //nologo temp.vbs & del temp.vbs & exit /b ::: Set objShell = CreateObject("Shell.Application") ::: Set objWshShell = WScript.CreateObject("WScript.Shell") ::: Set objWshProcessEnv = objWshShell.Environment("PROCESS") ::: strCommandLine = Trim(objWshProcessEnv("ELEVATE_CMDLINE")) ::: objShell.ShellExecute "cmd", "/c " & strCommandLine, "", "runas" :admin ------------------------------------------------------------- @echo off echo Running as elevated user. echo Script file : %~f0 echo Arguments : %* echo Working dir : %cd% echo. :: administrator commands here :: eg, run shell as admin cmd /k 

Pour une démo: self-elevating.bat “chemin avec des espaces” arg2 3 4 “autre argument long”

Et ceci est une autre version qui ne nécessite pas de créer un fichier temporaire.

   :admin ----------------------------------------------------------- @echo off echo Running as elevated user. echo Script file : %~f0 echo Arguments : %* echo Working dir : %cd% echo. :: administrator commands here :: eg, run shell as admin cmd /k 

Je définirais un raccourci vers CMD ou vers l’object que vous souhaitez exécuter, puis définissez les propriétés du raccourci pour qu’il requirejs admin, puis exécutez le raccourci depuis votre fichier de commandes. Je n’ai pas testé pour confirmer qu’il respectera les propriétés, mais je pense que c’est plus élégant et ne nécessite pas d’activer le compte administrateur.

Aussi, si vous le faites en tant que tâche planifiée (qui peut être configurée à partir du code), il existe une option pour l’exécuter en haut.

Bien que le code de @amr ali fût génial, j’avais une instance où mon fichier de chauve-souris contenait > < signes, et cela les étouffait pour une raison quelconque.

J'ai trouvé ça à la place. Il suffit de tout mettre avant votre code, et cela fonctionne parfaitement.

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

Accédez à C:\windows\System32 et cliquez avec le bouton droit sur cmd.exe et exécutez-le en tant qu’administrateur. Travaillé pour moi sur Windows 7.

Si vous essayez d’exécuter un script avec des privilèges élevés, vous pouvez faire la même chose pour le fichier script ou utiliser l’exécution du planificateur en tant qu’option utilisateur différente pour exécuter le script.

Astuce simple, || , avec quelques .vbs utilisés en haut de votre lot. Il sortira régulièrement et redémarrera en tant qu’administrateur.

 @AT>NUL||echo set shell=CreateObject("Shell.Application"):shell.ShellExecute "%~dpnx0",,"%CD%", "runas", 1:set shell=nothing>%~n0.vbs&start %~n0.vbs /realtime& timeout 1 /NOBREAK>nul& del /Q %~n0.vbs&cls&exit 

Il supprime également les temp.vbs quand il est fini de l’utiliser.