web-dev-qa-db-fra.com

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

Dans un fichier de commandes, j'aimerais vérifier si j'utilise des privilèges d'administrateur/élevé.

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

S'il existait une commande universellement disponible, sans effet, mais nécessitant des privilèges d'administration, je pourrais alors l'exécuter et rechercher un code d'erreur afin de tester les privilèges. Jusqu'ici, 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 quoi que ce soit, et elles sont susceptibles d'échouer pour diverses raisons.

Je ne me soucie que de Windows 7, bien que le support des systèmes d’exploitation antérieurs soit agréable.

85
Jeff

[~ # ~] addenda [~ # ~] : Sous Windows 8, cela ne fonctionnera pas. voir cette excellente réponse à la place.


Vous avez 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 que nous parlons de Win7, vous pouvez utiliser les éléments suivants 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 traitement par lots), vous pouvez écrire ce qui précède dans .NET et renvoyer un code de sortie d'un fichier exe basé sur le résultat que votre fichier de traitement doit utiliser.

57
Rushyo

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 message d'accès refusé.

De MS Technet :

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

71
Ambrose Leung

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\Administrateurs dans la liste des groupes, mais celle-ci n'est pas activée.

Toutefois, 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 sous Windows 7, mais je ne suis pas sûr des versions précédentes.)

25
Harry Johnston

Quasiment ce que d’autres ont mis avant, mais en tant que doublure unique pouvant ê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)
17
geek_01

Le moyen le plus simple de procéder sous Vista, à partir de Windows 7, est d'énumérer les groupes de jetons et de rechercher le niveau d'intégrité actuel (ou le sid des administrateurs, si seule l'appartenance à un groupe est importante):

Vérifiez si nous courons surélevé:

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

Vérifiez 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 aux administrateurs de domaine:

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

L'article suivant répertorie les niveaux d'intégrité utilisés par les fenêtres SID: http://msdn.Microsoft.com/en-us/library/bb625963.aspx

10
Martin Binder

Voici une légère modification de la réponse de Harry qui met l'accent sur le 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 certainement fonctionné pour moi et le principe semble être bon; de Chris Jackson de MSFT :

Lorsque vous exécutez une version élevée, votre jeton contient une entrée de contrôle d'accès appelée Etiquette obligatoire\Niveau obligatoire élevé.

7
Hugh

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 peut être fait ainsi:

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

J'ai lu beaucoup (la plupart?) Des réponses, puis développé un fichier chauve-souris qui fonctionne pour moi dans Win 8.1. Je pensais le 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

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

6
GeoffH

Une version "not-a-one-liner" 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
tivnet

Je sais que je suis vraiment en retard pour cette soirée, mais voici mon seul choix pour déterminer la taille de 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 retourne soit oui, soit non, selon le statut d'administrateur de l'utilisateur ...

Il définit également la valeur de la variable "admin" égale à oui ou non.

1
user1

Voici une méthode simple que j'ai utilisée sous Windows 7 à Windows 10. J'utilise simplement la commande "IF EXIST" pour rechercher le dossier Windows\System32\WDI\LogFiles. Le dossier WDI existe sur toutes les installations de Windows à partir de 7 minimum et nécessite des privilèges d'administrateur pour y accéder. Le dossier WDI contient toujours un dossier LogFiles. Ainsi, exécuter "IF EXIST" sur le dossier WDI\LogFiles retournera true si exécuté en tant qu'administrateur et false s'il n'est pas exécuté en tant qu'administrateur. Cela peut être utilisé dans un fichier de commandes pour vérifier le niveau de privilège et se brancher à la commande de votre choix en fonction de ce résultat.

Voici un extrait de 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 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 vous reporter à la mise en garde n ° 2 ci-dessous). Même dans ce cas, il suffit simplement de modifier le code pour rechercher un fichier/dossier commun différent nécessitant 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 existe cependant deux mises en garde concernant cette méthode:

  1. Désactiver le contrôle de compte d'utilisateur résoudra probablement 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 de cliquer sur "Continuer" lorsque vous y êtes invité ajoutera des droits d'accès permanents à ce compte d'utilisateur, rompant ainsi ma méthode. Si cela se produit, il peut être corrigé en supprimant le compte d'utilisateur des autorisations de sécurité du dossier WDI. Si, pour une raison quelconque, l'utilisateur DOIT pouvoir accéder au dossier WDI avec l'Explorateur Windows, vous devrez alors modifier le code pour vérifier un autre dossier (comme mentionné ci-dessus, créer le vôtre spécifiquement à cet effet peut constituer 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 oeuvre, compatible de la même manière avec toutes les versions de Windows 7, 8 et 10, et à condition que je garde à l'esprit les mises en garde mentionnées ci-dessus. été efficace à 100% pour moi.

0
Torin Darkflight