web-dev-qa-db-fra.com

Comment lancez-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 référentiel Bazaar que je gère. J'essaie d'exécuter le script avec des privilèges d'administration élevés depuis dans Windows Shell (cmd.exe) - comme si j'avais raison. -Cliquez dessus et choisi Exécuter en tant qu'administrateur , mais sans utiliser de méthode nécessitant l'utilisation de l'interface graphique.

55
jpaugh

Un hybride batch/WSH est capable d'appeler ShellExecute pour afficher la boîte de dialogue 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
38
Anders

Appuyez sur le bouton de démarrage. Dans le champ de recherche, tapez "cmd", puis appuyez sur Ctrl+Shift+Enter

57
slashdottir

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

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 engloutira l'option switch en cmd.

Notez également que le shell administratif (cmd.exe) démarre dans le dossier C:\Windows\System32. Ce n'est pas ce que je voulais, mais il é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 d'administrateur

L'utilisation de runas de cette manière nécessite l'activation du compte administratif, ce qui n'est pas le compte par défaut sous Windows 7 ou Vista. Cependant, ici est un excellent tutoriel sur la façon de l'activer, de trois manières différentes:

Je l’ai moi-même activé en ouvrant les outils d'administration , la politique de sécurité locale , puis naviguez vers Stratégies locales\Options de sécurité et modifiez la valeur des comptes : Statut du compte administratif stratégie sur Enabled, ce qui ne fait pas partie des trois manières présentées dans le lien.

Un moyen encore plus simple:

C:> Net User Administrator /active:yes
56
jpaugh
:: ------- 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
:: e.g., run Shell as admin
cmd /k

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

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

<!-- : --- Self-Elevating Batch Script ---------------------------
@whoami /groups | find "S-1-16-12288" > nul && goto :admin
set "ELEVATE_CMDLINE=cd /d "%~dp0" & call "%~f0" %*"
cscript //nologo "%~f0?.wsf" //job:Elevate & exit /b

-->
<job id="Elevate"><script language="VBScript">
  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"
</script></job>
:admin -----------------------------------------------------------

@echo off
echo Running as elevated user.
echo Script file : %~f0
echo Arguments   : %*
echo Working dir : %cd%
echo.
:: administrator commands here
:: e.g., run Shell as admin
cmd /k
10
Amr Ali

Je mettrais en place un raccourci vers CMD ou vers ce que vous voulez exécuter, puis définissez les propriétés du raccourci sur Requérir admin, puis exécutez le raccourci à partir de 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 qu'il n'est pas nécessaire d'activer le compte Administrateur.

De plus, si vous le faites en tant que tâche planifiée (pouvant être configurée à partir de code), il existe une option pour l'exécuter surélevée.

2
Kate Gregory

Tour de pipe simple, ||, avec quelques .vbs utilisés en haut de votre lot. Il va quitter Normal et redémarrer 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

Ça aussi del /Q le temp.vbs quand c'est fait.

2
strance

Bien que le code @ amr ALi soit génial, j’ai eu un cas où mon fichier chauve-souris contenait >< _, 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"
:--------------------------------------
2
Kapanther

Accédez à C:\windows\System32 et clic droit sur cmd.exe et exécuté 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 en faire de même pour le fichier de script ou utiliser l'option d'exécution du planificateur en tant qu'utilisateur différent pour exécuter le script.

0
Rasika