148 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.

165voto

Frederic Chopin Points 96

Cette astuce ne nécessite qu'une seule commande : tapez net session dans l'invite de commande.

Si vous êtes PAS un administrateur vous obtenez un message de refus d'accès.

System error 5 has occurred.

Access is denied.

Si vous ÊTRE un administrateur vous obtenez un message différent, dont le plus courant est le suivant :

There are no entries in the list.

De MS Technet :

Utilisé sans paramètres, net session affiche des informations sur toutes les sessions de sessions avec l'ordinateur local.

69voto

Rushyo Points 3454

ADDENDUM : Pour Windows 8, cela ne fonctionnera pas ; voir cette excellente réponse au lieu de cela.


J'ai trouvé cette solution ici : http://www.robvanderwoude.com/clevertricks.php

AT > NUL
IF %ERRORLEVEL% EQU 0 (
    ECHO you are Administrator
) ELSE (
    ECHO you are NOT Administrator. Exiting...
    PING 127.0.0.1 > NUL 2>&1
    EXIT /B 1
)

En supposant que cela ne fonctionne pas et puisque nous parlons de Win7, vous pourriez utiliser ce qui suit dans Powershell si cela vous convient :

$principal = new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())
$principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)

Si ce n'est pas le cas (et probablement pas, puisque vous avez explicitement proposé des fichiers batch), vous pouvez écrire ce qui précède en .NET et renvoyer un code de sortie à partir d'un exe basé sur le résultat pour que votre fichier batch puisse l'utiliser.

32voto

Harry Johnston Points 11039

J'aime la suggestion de Rushyo d'utiliser l'AT, mais c'est une autre option :

whoami /groups | findstr /b BUILTIN\Administrators | findstr /c:"Enabled group" && goto :isadministrator

Cette approche vous permettrait également de faire la distinction entre un non-administrateur et un administrateur non élevé si vous le souhaitez. Les administrateurs non élevés disposent toujours de la fonction BUILTIN \Administrators dans la liste des groupes, mais il n'est pas activé.

Cependant, cela ne fonctionnera pas sur certains systèmes de langues autres que l'anglais. Essayez plutôt

whoami /groups | findstr /c:" S-1-5-32-544 " | findstr /c:" Enabled group" && goto :isadministrator

(Cela devrait fonctionner sous Windows 7, mais je ne suis pas sûr des versions antérieures).

30voto

geek_01 Points 405

A peu près ce que d'autres ont déjà dit, mais comme un one liner qui peut être mis au début d'une commande batch. (En général, après @echo off).

net.exe session 1>NUL 2>NUL || (Echo This script requires elevated rights. & Exit /b 1)

13voto

Martin Binder Points 546

La façon la plus simple de procéder sur Vista, Win 7 et les versions supérieures consiste à énumérer les groupes de jetons et à rechercher le niveau d'intégrité actuel (ou le côté des administrateurs, si seule l'appartenance à un groupe est importante) :

Vérifier si nous fonctionnons en mode élevé :

whoami /groups | find "S-1-16-12288" && Echo I am running elevated, so I must be an admin anyway ;-)

Vérifier si nous appartenons à des administrateurs locaux :

whoami /groups | find "S-1-5-32-544" && Echo I am a local admin

Vérifier si nous appartenons aux administrateurs de domaine :

whoami /groups | find "-512 " && Echo I am a domain admin

L'article suivant énumère les SID de niveau d'intégrité utilisés par Windows : http://msdn.microsoft.com/en-us/library/bb625963.aspx

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