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

de l'intérieur d'un fichier batch, je voudrais tester si je suis en cours d'exécution avec administrateur/privilèges élevés.

le nom d'utilisateur ne change pas lorsque" exécuter en tant qu'administrateur " est sélectionné, de sorte que cela ne fonctionne pas.

S'il y avait une commande disponible universellement, qui n'a pas d'effet, mais nécessite des privilèges administratifs, alors je pourrais exécuter cela 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 seul code d'erreur non spécifique, qui pourrait indiquer n'importe quoi, et elles sont sujettes à l'Échec pour une variété de raisons.

je ne se soucient de Windows 7, bien que le soutien des systèmes d'exploitation antérieurs, ce serait bien.

72
demandé sur Jeff 2011-11-02 22:50:12

12 réponses

ADDENDUM : Pour Windows 8 cela ne fonctionnera pas; voir cette excellente réponse à la place.


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 c'est approprié:

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

51
répondu Rushyo 2015-08-06 15:53:05

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

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

From MS Technet :

utilisé sans paramètres, net session affiche des informations sur tous sessions avec l'ordinateur local.

57
répondu Ambrose Leung 2017-06-12 22:13:37

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 élevé et un administrateur Non élevé si vous le souhaitez. Les administrateurs Non-elevés ont encore BUILTIN\Administrators dans la liste des groupes, mais elle n'est pas activée.

cependant, cela ne fonctionnera pas sur certains systèmes non anglophones. Au lieu de cela, essayez

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 précédentes.)

23
répondu Harry Johnston 2015-06-18 22:16:58

la façon la plus facile de faire cela sur Vista, Win 7 et au-dessus est d'énumérer les groupes token et de rechercher le niveau d'intégrité actuel (ou les administrateurs sid, si seulement la membership de groupe est importante):

vérifier si nous sommes surélevés:

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érifiez si nous appartenons à des admins de domaine:

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

l'article suivant liste le niveau d'intégrité utilisé par les fenêtres de SIDs: http://msdn.microsoft.com/en-us/library/bb625963.aspx

8
répondu Martin Binder 2013-07-23 07:30:29

voici une légère modification de la réponse de Harry qui se concentre sur le statut élevé; je l'utilise au début d'une installation.fichier 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 certainement fonctionné pour moi et le principe semble être sain; de MSF's Chris Jackson :

lorsque vous exécutez élevé, votre jeton contient un as appelé obligatoire Label\haut niveau obligatoire.

7
répondu Hugh 2012-08-13 17:54:19

à peu près ce que d'autres ont mis avant, mais comme un liner qui peut être mis au début d'une commande de lot. (Bien, généralement après @echo off.)

net.exe session 1>NUL 2>NUL || (Echo This script requires elevated rights. & Exit /b 1)
7
répondu geek_01 2016-08-09 17:35:21

je lis beaucoup (la plupart?) des réponses, puis développé un fichier bat qui fonctionne pour moi dans Win 8.1. J'ai pensé partager.

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

Espère que quelqu'un trouve cela utile :)

6
répondu GeoffH 2014-12-31 06:37:07

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 faire ainsi:

openfiles >nul 2>&1
if %ErrorLevel% equ 0 ( echo Administrator ) else ( echo NOT Administrator )
3
répondu ipAlex 2017-07-26 13:24:56

Un "pas-a-one-liner", version de https://stackoverflow.com/a/38856823/2193477

@echo off
net.exe session 1>NUL 2>NUL || goto :not_admin
echo SUCCESS
goto :eof

:not_admin
echo ERROR: Please run as a local administrator.
exit /b 1
2
répondu tivnet 2018-01-17 17:21:59

je sais que je suis vraiment en retard à cette fête, Mais voici mon seul liner pour déterminer admin-hood.

il ne s'appuie pas sur le niveau d'erreur, juste 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%)

renvoie oui ou non, selon le statut d'administrateur de l'utilisateur...

il fixe également la valeur de la variable" admin " à oui ou non en conséquence.

1
répondu user1 2013-05-11 04:34:12

Je ne sais pas pourquoi, mais aucune des autres solutions ici n'a fonctionné pour moi. Donc j'ai pensé qu'il pourrait être intéressant de partager que celui-ci de Super Utilisateur a fait le tour.

1
répondu Samy Bencherif 2017-03-20 10:04:20

Voici une méthode simple que j'ai utilisée sur Windows 7 à Windows 10. Fondamentalement, 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 de 7, et il nécessite des privilèges d'administrateur pour y accéder. Le dossier WDI a toujours un dossier LogFiles à l'intérieur. Ainsi, exécuter "if EXIST" dans le dossier WDI\LogFiles retournera true s'il est exécuté en tant qu'administrateur, et false s'il n'est pas exécuté en tant qu'administrateur. Ceci peut être utilisé dans un lot fichier pour vérifier le niveau de privilège, et de la direction générale selon les commandes que vous désirez en fonction de ce résultat.

voici un bref extrait du code 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 permissions de sécurité par défaut n'ont pas été modifiées sur le dossier WDI (ce qui est peu probable de se produire dans la plupart des situations, mais s'il vous plaît voir la mise en garde #2 ci-dessous). Même dans ce cas, il suffit de modifier le code pour vérifier un autre commune fichier / dossier qui nécessite un accès administrateur (System32\config\SAM peut être un bon candidat alternatif), ou vous pouvez même créer votre propre spécifiquement à cette fin.

il y a cependant deux mises en garde à propos de cette méthode:

  1. désactiver UAC va probablement briser par le simple fait que tout serait exécuté en tant qu'administrateur de toute façon.

  2. essayer d'ouvrir le dossier WDI sous Windows Explorer puis cliquer sur "Continuer" lorsqu'on vous le demande va ajouter des droits d'accès permanents pour ce compte d'utilisateur, brisant ainsi ma méthode. Si cela se produit, il peut être corrigé en retirant le compte utilisateur des permissions de sécurité du dossier WDI. Si pour une raison quelconque l'utilisateur doit être en mesure d'accéder au dossier WDI avec Windows Explorer, alors vous devez modifier le code pour vérifier un dossier différent (comme mentionné ci-dessus, la création de votre propre spécifiquement à cette fin peut être un bon choix).

donc, il est vrai que ma méthode n'est pas parfaite puisqu'elle peut être cassée, mais c'est une méthode relativement rapide qui est 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 a été 100% efficace pour moi.

0
répondu Torin Darkflight 2018-10-06 04:01:11