169 votes

Comment détecter si CMD s'exécute en tant qu'administrateur/possède des privilèges élevés ?

À l'intérieur d'un fichier batch, j'aimerais tester si je fonctionne avec des privilèges d'administrateur/élevés.

Le nom d'utilisateur ne change pas lorsque l'option "Exécuter en tant qu'administrateur" est sélectionnée, ce qui ne fonctionne donc pas.

S'il existait une commande universellement disponible, qui n'a aucun effet, mais qui nécessite des privilèges administratifs, je pourrais l'exécuter et vérifier un code d'erreur afin de tester les privilèges. Jusqu'à présent, je n'ai pas trouvé une telle commande. Les commandes que j'ai trouvées semblent renvoyer un code d'erreur unique et non spécifique, qui peut indiquer n'importe quoi, et elles sont susceptibles d'échouer pour diverses raisons.

Je ne m'intéresse qu'à Windows 7, mais la prise en charge des systèmes d'exploitation antérieurs serait appréciable.

1voto

user1 Points 75

Je sais que je suis vraiment en retard, mais voici ma première ligne pour déterminer le statut d'administrateur.

Il ne s'appuie pas sur le niveau d'erreur, mais uniquement sur les éléments suivants systeminfo :

for /f "tokens=1-6" %%a in ('"net user "%username%" | find /i "Local Group Memberships""') do (set admin=yes & if not "%%d" == "*Administrators" (set admin=no) & echo %admin%)

Il renvoie soit oui, soit non, en fonction du statut d'administrateur de l'utilisateur...

Il définit également la valeur de la variable "admin" pour qu'elle soit égale à oui ou non.

1voto

englebart Points 93

Fonctionne pour Win7 Enterprise et Win10 Enterprise

@if DEFINED SESSIONNAME (
    @echo.
    @echo You must right click to "Run as administrator"
    @echo Try again
    @echo.
    @pause
    @goto :EOF
)

1voto

kfsone Points 7375

Malheureusement, la mention "S-1-5-32-544", suggérée par d'autres, n'est pas une preuve d'élévation.

Windows 10 et versions ultérieures, une approche indépendante de la langue est utilisée :

whoami /groups | find "S-1-16-12288"

il s'agit du "niveau obligatoire élevé", qui est en fait escaladé.

Invite de commande normale :

C:\> whoami /groups | find "S-1-16-12288"
C:\>

Invite de commande de l'administrateur :

C:\> whoami /groups | find "S-1-16-12288"
Mandatory Label\High Mandatory Level                          Label            S-1-16-12288                                                                                                                                                     

C:\>

À utiliser dans un fichier .bat :

whoami /groups | find "S-1-16-12288" && set ELEVATED=true || set ELEVATED=false

Vous pouvez également l'utiliser à partir de powershell :

function is_elevated() {
  Param( [String] $ToGroup = "S-1-16-12288" )
  return [bool] ( whoami /groups | select-string $ToGroup )
}

par exemple :

PS> cd c:/temp
PS> set-content is-elevated.ps1 "return [bool] ( whoami /groups | sls S-1-16-12288 )"
PS> ./is-elevated.ps1
False
PS> start -verb runas powershell.exe
...
PS C:\Windows\system32> cd \temp
PS C:\temp> ./is-elevated.ps1
True

0voto

Samy Bencherif Points 116

Je ne sais pas exactement pourquoi, mais aucune des autres solutions proposées ici n'a fonctionné pour moi. J'ai donc pensé qu'il valait la peine de partager cela celui-ci de Super User a fait l'affaire.

0voto

mootmoot Points 111

Merci Torin Darkflight, Votre méthode est la seule qui fonctionne pour moi sous Windows 11. Voici un exemple de script développant votre post :

IF EXIST %SYSTEMROOT%\SYSTEM32\WDI\LOGFILES GOTO :Running_As_An_Admin
ECHO You are NOT an Administrator. This command requires admin rights. & Echo: & Echo Quitting......
@TIMEOUT /T 10
goto :QUIT
:Running_As_An_Admin
Echo Do Admin stuff here!!!

:QUIT

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X