Comment exécuter une commande en tant qu'administrateur à partir de la ligne de commande de Windows?

j'ai un petit script qui exécute le processus de construction et d'installation sur Windows pour un dépôt Bazaar que je gère. J'essaie d'exécuter le script avec des privilèges administratifs élevés de dans le shell Windows (cmd.exe)--comme si j'avais bien fait-j'ai cliqué dessus et choisi exécuter en tant qu'administrateur , mais sans utiliser aucune méthode qui nécessite l'utilisation de l'interface graphique.

52
demandé sur Peter Mortensen 2011-05-10 05:13:50

8 réponses

un hybride batch/WSH est capable d'appeler ShellExecute pour afficher le 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
33
répondu Anders 2011-05-11 19:47:15

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

notez Également que l'administration de shell (cmd.exe) démarre dans la C:\Windows\System32 dossier. Ce n'est pas ce que je voulais, mais c'était facile assez pour passer dans le chemin courant de mon installateur, et le référencer en utilisant un chemin absolu.

avertissement: activer le compte administrateur

utiliser runas de cette façon nécessite que le compte administratif soit activé, ce qui n'est pas le cas par défaut sur Windows 7 ou Vista. Cependant, ici est un excellent tutoriel sur la façon de l'activer, de trois façons différentes:

Je l'ai moi-même permis en ouvrant Outils administratifs , Politique de sécurité locale , puis naviguer sur politiques locales\Options de sécurité et changer la valeur de la comptes: État du compte administratif politique pour Activé, qui n'est aucune des trois façons indiquées dans le lien.

un chemin encore plus facile:

C:> net user Administrator /active:yes
49
répondu jpaugh 2018-05-11 19:43:14

Appuyez sur le bouton démarrer. Dans la boîte de recherche, tapez "cmd", puis appuyez sur Ctrl + Shift + Entrée

47
répondu slashdottir 2015-10-23 07:02:28
:: ------- 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: auto-élévatrices.chauve-souris "en chemin avec des espaces" arg2 3 4 "un autre argument"

Et c'est une autre version qui ne nécessite pas la création d'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
répondu Amr Ali 2014-11-23 09:15:50

je mettrais en place un raccourci, soit vers CMD soit vers la chose que vous voulez lancer, puis définirais les propriétés du raccourci pour require admin, et ensuite lancer le raccourci à partir de votre fichier batch. Je n'ai pas testé pour confirmer qu'il respectera les propriétés, mais je pense qu'il est plus élégant et ne nécessite pas l'activation du compte administrateur.

aussi si vous le faites comme une tâche programmée (qui peut être configurée à partir du code) il y a une option pour l'exécuter surélevé.

2
répondu Kate Gregory 2011-05-11 13:12:42

bien que le code de @amr ali était génial, j'ai eu un cas où mon fichier bat contenait des signes > < , et il s'est étouffé sur eux pour une raison quelconque.

j'ai trouvé ça à la place. Mettez tout ça avant votre code, et ça marche 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
répondu Kapanther 2017-12-11 18:16:18

Simple tuyau truc, || , avec quelques-uns .vbs utilisé en haut de votre lot. Elle va quitter régulière 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

Elle aussi del /Q le temp.vbs quand c'est fait à l'aide.

1
répondu strance 2017-12-11 18:15:25

naviguez vers C:\windows\System32 et faites un clic droit sur cmd.exe et exécutez en tant qu'administrateur. Il travaillait 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 de script ou utiliser l'exécution de l'ordonnanceur comme une option d'utilisateur différente pour exécuter le script.

0
répondu Rasika 2011-05-10 01:31:19