web-dev-qa-db-fra.com

Script batch à exécuter en tant qu'administrateur

J'écris un programme de vérification client/serveur, mais il doit être exécuté en tant qu'administrateur.

Je souhaite que cette application s'exécute en mode silencieux sur mon réseau et mes utilisateurs, et je ne souhaite pas que l'invite "Exécuter en tant qu'administrateur" existe-t-il un code de début que je peux placer dans le fichier de commandes pour le faire exécuter automatiquement en tant qu'administrateur?

16

Des solutions qui n'ont pas fonctionné

Non: la solution - créer un raccourci [-> Compatibilité -> "exécuter ce programme en tant qu'administrateur"] ne fonctionne pas.

Cette option est grisée dans Windows 7. Même avec le contrôle de compte d'utilisateur désactivé

Non: le runas /env /user:domain\Administrator <program.exe/command you want to execute> est également insuffisant car il invite l'utilisateur à entrer le mot de passe administrateur.

Solution qui a fonctionné

Oui: Désactiver le contrôle de compte d'utilisateur -> Créer un travail à l'aide du planificateur de tâches, cela a fonctionné pour moi.

  • Créez un travail sous le planificateur de tâches et faites-le s'exécuter en tant qu'utilisateur disposant d'autorisations d'administrateur. 
  • Marquer explicitement: "Exécuter avec les privilèges les plus élevés"
  • Désactiver le contrôle de compte d'utilisateur afin qu'il n'y ait pas d'invite à exécuter cette tâche

Vous pouvez ensuite laisser le script activer le contrôle de compte d'utilisateur en modifiant le registre, si vous le souhaitez. Dans mon cas, ce script est exécuté une seule fois par la création d'une machine virtuelle Windows, où le contrôle de compte d'utilisateur est désactivé dans l'image.

Nous attendons toujours la meilleure approche pour un script exécuté en tant qu'administrateur sans trop de problèmes.

14
zenin
@echo off

 call :isAdmin

 if %errorlevel% == 0 (
    goto :run
 ) else (
    echo Requesting administrative privileges...
    goto :UACPrompt
 )

 exit /b

 :isAdmin
    fsutil dirty query %systemdrive% >nul
 exit /b

 :run
  <YOUR BATCH SCRIPT HERE>
 exit /b

 :UACPrompt
   echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
   echo UAC.ShellExecute "cmd.exe", "/c %~s0 %~1", "", "runas", 1 >> "%temp%\getadmin.vbs"

   "%temp%\getadmin.vbs"
   del "%temp%\getadmin.vbs"
  exit /B`
10
Anoop V U

c'est possible en utilisant la syntaxe:

RUNAS [/profile] [/env] [/netonly] /user:user Program

Key :
/profile Option to load the user's profile (registry)
/env Use current environment instead of user's.
/netonly Use the credentials specified only for remote connections.
/user Username in form USER@DOMAIN or DOMAIN\USER
(USER@DOMAIN is not compatible with /netonly)
Program The command to execute

exemple : 

runas /env /user:domain\Administrator <program.exe/command you want to execute>

Voici une solution de contournement:

  1. Crée un raccourci du fichier .bat
  2. Ouvre les propriétés du raccourci. Sous l'onglet de raccourci, cliquez sur advanced .
  3. Cochez "Exécuter en tant qu'administrateur"

L'exécution du raccourci exécutera votre script batch en tant qu'administrateur.

4
L01c

Vous avez plusieurs options.

  1. Si vous devez le faire en utilisant uniquement un fichier de commandes et des commandes natives, consultez Comment puis-je élever automatiquement mon fichier de commandes de sorte qu'il demande les droits d'administrateur de l'UAC si nécessaire? .

  2. Si des utilitaires tiers sont une option, vous pouvez utiliser un outil tel que Elevate . C'est un exécutable que vous appelez avec le programme que vous voulez exécuter en tant que paramètre élevé.
    Comme ceci: elevate net share ....

3
aphoria

J'ai légèrement modifié le script de Matt pour lui permettre de s'exécuter à partir d'un seul script (il suffit de l'ajouter au début de tout script nécessitant une invocation UAC), mais lisez ci-dessous le code pour une solution encore meilleure que celle que j'ai trouvée sur un Blog:

:: ### START UAC SCRIPT ###

if "%2"=="firstrun" exit
cmd /c "%0" null firstrun

if "%1"=="skipuac" goto skipuacstart

:checkPrivileges
NET FILE 1>NUL 2>NUL
if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges )

:getPrivileges
if '%1'=='ELEV' (shift & goto gotPrivileges)

setlocal DisableDelayedExpansion
set "batchPath=%~0"
setlocal EnableDelayedExpansion
ECHO Set UAC = CreateObject^("Shell.Application"^) > "%temp%\OEgetPrivileges.vbs"
ECHO UAC.ShellExecute "!batchPath!", "ELEV", "", "runas", 1 >> "%temp%\OEgetPrivileges.vbs"
"%temp%\OEgetPrivileges.vbs"
exit /B

:gotPrivileges

setlocal & pushd .

cd /d %~dp0
cmd /c "%0" skipuac firstrun
cd /d %~dp0

:skipuacstart

if "%2"=="firstrun" exit

:: ### END UAC SCRIPT ###

:: ### START OF YOUR OWN BATCH SCRIPT BELOW THIS LINE ###

Comme vous pouvez le constater, ma modification utilise deux arguments de fichier, ce qui n’est pas particulièrement élégant, mais fait le travail (et vous pouvez toujours les cacher à la fin en réservant les premiers arguments à l’aide d’emplacements fictifs). De plus, le script de AFAIK Matt ne prend pas en charge les espaces dans les chemins de fichiers et cette limitation s'applique également à ma modification de ce script. 

Ce problème semble être inhérent à la façon dont VBS gère ces chemins, mais sur le lien ci-dessous, il existe une solution encore meilleure basée sur VBS pour appeler un contrôle de compte d'utilisateur qui s'exécute à partir d'un seul script sans nécessiter de solution de contournement comme celle-ci, à l'aide des arguments de fichier et qui prend également en charge les espaces dans les chemins de fichiers:

http://pcloadletter.co.uk/2012/12/11/uac-elevation-for-batch-script/

Le script sur ce lien effectue des appels VBS légèrement différents, comme vous le remarquerez, ce qui, pour une raison quelconque, contourne le problème des espaces.

1
abvgd

Créez un raccourci et configurez-le pour qu'il soit toujours exécuté en tant qu'administrateur.

How-To Geek forum Créez un fichier de commandes pour exécuter cmd en tant qu'administrateur solution:

Créez un fichier de commandes dans un éditeur et nommez-le puis créez un raccourci vers celui-ci. Nameit.bat - raccourci. Cliquez ensuite avec le bouton droit sur Nameit.bat - raccourci -> Propriétés -> onglet Raccourci -> Avancé et cliquez sur Exécuter en tant qu’administrateur. Exécutez-le depuis le raccourci. 

1

Comme je n'ai pas encore trouvé de script simple, voici mes deux sous:

set ELEVATE_APP=Full command line without parameters for the app to run
set ELEVATE_PARMS=The actual parameters for the app
echo Set objShell = CreateObject("Shell.Application") >elevatedapp.vbs
echo Set objWshShell = WScript.CreateObject("WScript.Shell") >>elevatedapp.vbs
echo Set objWshProcessEnv = objWshShell.Environment("PROCESS") >>elevatedapp.vbs
echo objShell.ShellExecute "%ELEVATE_APP%", "%ELEVATE_PARMS%", "", "runas" >>elevatedapp.vbs
DEL elevatedapp.vbs
1
Nika Gerson Lohman

Vous pourriez le mettre comme élément de démarrage ... Les éléments de démarrage ne présentent pas d'invite à exécuter en tant qu'administrateur.

Voir cet article Raccourci de programme surélevé sans UAC rompt

0
sandrows

Ne perdez pas votre temps, utilisez cette commande d'une ligne pour exécuter la ligne de commande en tant qu'administrateur:

echo createobject("Shell.application").shellexecute "cmd.exe",,,"runas",1 > runas.vbs & start /wait runas.vbs & del /f runas.vbs

si vous voulez démarrer une application avec des privilèges d’administrateur, il vous suffit d’écrire le chemin d’accès pour cette application comme ce bloc-notes ++ dans mes fichiers de programme, par exemple:

echo createobject("Shell.application").shellexecute "%programfiles%\Notepad++\notepad++.exe",,,"runas",1 > runas.vbs & start /wait runas.vbs
0
hollopost

Ma solution, si vous n'avez pas besoin du fichier .bat, est de convertir le fichier de commandes en fichier .exe, vous pourrez alors configurer le programme en tant qu'administrateur.

0
Adam

Si toutes les réponses ci-dessus ne vous conviennent pas, vous pouvez utiliser autoIT pour exécuter votre fichier (ou autre) en tant qu'utilisateur spécifique avec ses informations d'identification. 

Exemple de script qui exécutera un programme utilisant les privilèges de cet utilisateur.

installAdmin()

Func installAdmin()
    ; Change the username and password to the appropriate values for your system.
    Local $sUserName = "xxxxx"
    Local $sPassword = "xxx"
    Local $sDirectory = "C:\ASD4VM\Download\"
    Local $sFiletoRun = "Inst_with_Privileges.bat"

    RunAsWait($sUserName, @ComputerName, $sPassword, 0, $sDirectory & $sFiletoRun)
EndFunc   ;==>Example

AutoIT peut être trouvé ici. -> Il utilise un format .ua3 compilé en un fichier .exe pouvant être exécuté.

0
Ruan