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

101

À partir d'un fichier de commandes, je voudrais tester si j'exécute avec des privilèges d'administrateur / élevés.

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

S'il y avait une commande universellement disponible, qui n'a aucun effet, mais nécessite des privilèges administratifs, alors 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 pourrait indiquer n'importe quoi, et elles sont sujettes à l'échec pour diverses raisons.

Je ne me soucie que de Windows 7, même si la prise en charge des systèmes d'exploitation antérieurs serait bien.

Jeff
la source
Un hack serait d'essayer et de faire echo > somefiledans un répertoire qui nécessiterait des privilèges d'administrateur. cela produirait un fichier comme effet secondaire, mais vous pourriez vérifier les collisions et créer un nom de fichier unique comme solution de contournement.
Marc B
1
[vous pouvez trouver un lot auto-élévateur ici] [1] [1]: stackoverflow.com/questions/4051883/…
Amr Ali
1
@npocmaka la question que vous avez liée est en fait le double de celle-ci;) (2013 vs 2011)
Matthieu

Réponses:

62

ADDENDA : pour Windows 8, cela ne fonctionnera pas; voyez plutôt cette excellente réponse .


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 pouvez 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 de commandes), vous pouvez écrire ce qui précède dans .NET et renvoyer un code de sortie à partir d'un exe basé sur le résultat pour votre fichier de commandes à utiliser.

Rushyo
la source
4
La commande AT est parfaite! Votre Google-fu est supérieur à mon Google-fu. ;-)
Jeff
2
+1 @Rushyo, j'ai un peu étendu votre solution et l'ai publiée ici car c'est celle que j'ai rencontrée à l'origine. Merci! stackoverflow.com/questions/4051883/…
blak3r
16
ATne fonctionne pas sous Windows 8, mais j'ai trouvé une meilleure solution. Je l'ai posté comme réponse à une autre question, ici: stackoverflow.com/questions/4051883/… .
mythofechelon
4
Je recommande whoami / groups | findstr / b BUILTIN \ Admin | findstr / c: "Groupe activé" && echo "J'ai un administrateur!" - travailler sur 95, 98, 2000, xp, vista, 7, 8! (D'après le commentaire "J'aime la suggestion de Rushyo d'utiliser AT ...")
barwnikk
1
J'aime le pingremplacer manquant sleep:)
Matthieu
96

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

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

System error 5 has occurred.

Access is denied.

Si vous êtes un administrateur , vous recevez un message différent, le plus courant étant:

There are no entries in the list.

De MS Technet :

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

Ambrose Leung
la source
C'est fonctionnellement identique à la réponse de Rushyo, qui a utilisé la commande AT.
Jeff
12
Sur Windows 8.1, cela est préférable à AT, car AT est obsolète. Utiliser la réponse de Rushyo mais remplacer AT par net session ou net.exe fonctionne parfaitement pour moi.
kayleeFrye_onDeck
Cela semble le moyen le plus simple de le faire à l'invite de commande (qui est cependant différent du fichier de commandes).
enderland
2
There are no entries in the list.
Imprime
1
dans un fichier batch, utilisez quelque chose comme ça:net session >nul 2>&1 || (echo not admin&goto :eof)
anilech
27

J'aime la suggestion de Rushyo d'utiliser 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 administrateur non-administrateur et un administrateur non élevé si vous le souhaitez. Les administrateurs non élevés ont toujours BUILTIN \ Administrators dans la liste des groupes, mais ce n'est pas activé.

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

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

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

Harry Johnston
la source
1
En version polonaise, j'ai: BUILTIN \ Administratorzy, donc, je recommande: whoami / groups | findstr / b BUILTIN \ Admin | findstr / c: "Groupe activé" && goto: isadministrator
barwnikk
@barwnikk, je recommande de whoami/groupsscanner les lignes manuellement. Cela ne prendrait pas trop de temps et la commande s'inscrit dans votre cerveau.
Pacerier
@Pacerier: le but de la question est de détecter l'élévation dans un fichier batch . Si une personne est sur la ligne de commande, il lui suffit de regarder le titre de la fenêtre, qui démarre toujours "Administrateur:" si vous êtes élevé.
Harry Johnston
@HarryJohnston, Wow ne s'en est pas rendu compte. Le titre «Administrateur» apparaît-il pour toutes les versions de Windows?
Pacerier
@Pacerier: toutes les versions actuelles (à partir de Vista).
Harry Johnston
24

À peu près ce que d'autres ont mis avant, mais comme une seule ligne qui peut être placée au début d'une commande batch. (Eh bien, généralement après @echo off.)

net.exe session 1>NUL 2>NUL || (Echo This script requires elevated rights. & Exit /b 1)
geek_01
la source
2
Ceci est la version à jour et elle cache bien la sortie non pertinente de net.exe
andersand
2
Fonctionne bien sur Windows 10.
James Pack
A très bien fonctionné, il suffit de modifier la fin de & Timeout / t 10 & Exit / b 1) afin que dans un fichier batch la fenêtre ne disparaisse pas instantanément.
WhoIsRich
12

Le moyen le plus simple de le faire sur Vista, Win 7 et les versions ultérieures consiste à énumérer les groupes de jetons et à rechercher le niveau d'intégrité actuel (ou le sid des administrateurs, si seule l'appartenance au groupe est importante):

Vérifiez si nous courons en hauteur:

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

Vérifiez si nous appartenons aux administrateurs locaux:

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

Vérifiez si nous appartenons aux administrateurs de domaine:

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

L'article suivant répertorie les SID de niveau d'intégrité que Windows utilise: http://msdn.microsoft.com/en-us/library/bb625963.aspx

Martin Binder
la source
whoami / groups a un cas extrême où vous obtenez de mauvaises informations. Voir stackoverflow.com/questions/4051883/…
zumalifeguard
7

Voici une légère modification de la réponse de Harry qui se concentre sur un statut élevé; J'utilise ceci au début d'un fichier install.bat:

set IS_ELEVATED=0
whoami /groups | findstr /b /c:"Mandatory Label\High Mandatory Level" | findstr /c:"Enabled group" > nul: && set IS_ELEVATED=1
if %IS_ELEVATED%==0 (
    echo You must run the command prompt as administrator to install.
    exit /b 1
)

Cela a vraiment fonctionné pour moi et le principe semble être solide; de Chris Jackson de MSFT :

Lorsque vous exécutez avec élévation de privilèges, votre jeton contient un ACE appelé Étiquette obligatoire \ Niveau obligatoire élevé.

Hugh
la source
whoami / groups a un cas extrême où vous obtenez de mauvaises informations. Voir stackoverflow.com/questions/4051883/…
zumalifeguard
7

la solution:

at >nul
if %ErrorLevel% equ 0 ( echo Administrator ) else ( echo NOT Administrator )

ne fonctionne pas sous Windows 10

pour toutes les versions de Windows peuvent être le faire:

openfiles >nul 2>&1
if %ErrorLevel% equ 0 ( echo Administrator ) else ( echo NOT Administrator )
ipAlex
la source
6

J'ai lu la plupart (la plupart?) Des réponses, puis j'ai développé un fichier chauve-souris qui fonctionne pour moi dans Win 8.1. Je pensais que je le partagerais.

setlocal
set runState=user
whoami /groups | findstr /b /c:"Mandatory Label\High Mandatory Level" > nul && set runState=admin
whoami /groups | findstr /b /c:"Mandatory Label\System Mandatory Level" > nul && set runState=system
echo Running in state: "%runState%"
if not "%runState%"=="user" goto notUser
  echo Do user stuff...
  goto end
:notUser
if not "%runState%"=="admin" goto notAdmin
  echo Do admin stuff...
  goto end
:notAdmin
if not "%runState%"=="system" goto notSystem
  echo Do admin stuff...
  goto end
:notSystem
echo Do common stuff...
:end

J'espère que quelqu'un trouvera cela utile :)

GeoffH
la source
whoami / groups a un cas extrême où vous obtenez de mauvaises informations. Voir stackoverflow.com/questions/4051883/…
zumalifeguard
Merci pour ça! L'autre solution "whoami" n'a pas fonctionné pour moi sur Windows 8.1. Celui-ci l'a fait.
Ryan
1

Je sais que je suis vraiment en retard à cette fête, mais voici ma seule doublure pour déterminer l'administration.

Il ne repose pas sur le niveau d'erreur, mais uniquement sur 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 oui ou non, selon le statut administrateur de l'utilisateur ...

Il définit également la valeur de la variable «admin» sur oui ou non en conséquence.

utilisateur1
la source
Cela ne fonctionnera que si l'utilisateur est un membre direct du groupe local Administrateurs. Si l'utilisateur est membre d'un groupe de domaine (par exemple, "Admins du domaine") qui est membre du groupe Administrateurs, cela ne fonctionnera pas.
Harry Johnston
1

Si vous exécutez en tant qu'utilisateur avec des droits d'administrateur, la variable d'environnement SessionName ne sera PAS définie et vous ne disposez toujours pas des droits d'administrateur lors de l'exécution d'un fichier de commandes.

Vous devez utiliser la commande "net session" et rechercher un code de retour d'erreur de "0" pour vérifier les droits d'administrateur.

Exemple; - la première déclaration d'écho est le caractère de cloche net session >nul 2>&1 if not %errorlevel%==0 (echo echo You need to start over and right-click on this file, echo then select "Run as administrator" to be successfull. echo.&pause&exit)

Wolfgang
la source
0

Voici une méthode simple que j'ai utilisée sur Windows 7 à Windows 10. En gros, j'utilise simplement la commande "IF EXIST" pour vérifier le dossier Windows \ System32 \ WDI \ LogFiles. Le dossier WDI existe sur chaque installation de Windows à partir d'au moins 7 et il nécessite des privilèges d'administrateur pour y accéder. Le dossier WDI contient toujours un dossier LogFiles. Ainsi, l'exécution de "IF EXIST" sur le dossier WDI \ LogFiles renverra true si elle est exécutée en tant qu'administrateur et false si elle n'est pas exécutée en tant qu'administrateur. Cela peut être utilisé dans un fichier de commandes pour vérifier le niveau de privilège et passer aux commandes de votre choix en fonction de ce résultat.

Voici un bref extrait de code d'exemple:

IF EXIST %SYSTEMROOT%\SYSTEM32\WDI\LOGFILES GOTO GOTADMIN
(Commands for running with normal privileges)

:GOTADMIN
(Commands for running with admin privileges)

Gardez à l'esprit que cette méthode suppose que les autorisations de sécurité par défaut n'ont pas été modifiées sur le dossier WDI (ce qui est peu probable dans la plupart des situations, mais veuillez consulter la mise en garde n ° 2 ci-dessous). Même dans ce cas, il s'agit simplement de modifier le code pour rechercher un fichier / dossier commun différent qui nécessite un accès administrateur (System32 \ config \ SAM peut être un bon candidat alternatif), ou vous pouvez même créer le vôtre spécifiquement pour cela objectif.

Il y a cependant deux mises en garde concernant cette méthode:

  1. La désactivation de l'UAC le brisera probablement par le simple fait que tout serait exécuté en tant qu'administrateur de toute façon.

  2. Tenter d'ouvrir le dossier WDI dans l'Explorateur Windows, puis cliquer sur "Continuer" lorsque vous y êtes invité ajoutera des droits d'accès permanents pour ce compte d'utilisateur, cassant ainsi ma méthode. Si cela se produit, il peut être résolu en supprimant le compte d'utilisateur des autorisations de sécurité du dossier WDI. Si, pour une raison quelconque, l'utilisateur DOIT être en mesure d'accéder au dossier WDI avec l'Explorateur Windows, vous devrez alors modifier le code pour vérifier un dossier différent (comme mentionné ci-dessus, créer le vôtre spécifiquement à cette fin peut être un bon choix) .

Donc, certes, ma méthode n'est pas parfaite car elle peut être cassée, mais c'est une méthode relativement rapide, facile à mettre en œuvre, est également compatible avec toutes les versions de Windows 7, 8 et 10, et à condition que je reste conscient des mises en garde mentionnées. été efficace à 100% pour moi.

Torin Vol noir
la source
0

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
)
englebart
la source