321 votes

Batch script : comment vérifier les droits d'administrateur ?

Comment vérifier si le lot actuel script a des droits d'administrateur ?

Je sais comment faire pour qu'il s'appelle lui-même avec des runas mais pas comment vérifier les droits d'administrateur. Les seules solutions que j'ai vues sont des bidouillages grossiers ou l'utilisation de programmes externes. En fait, je me fiche de savoir s'il s'agit d'un piratage, tant que cela fonctionne sur Windows XP et les versions plus récentes.

2 votes

Après avoir changé le droit : [Comment demander un accès Administrateur dans un fichier batch][1] [1] : stackoverflow.com/questions/1894967/

0 votes

0 votes

531voto

mythofechelon Points 826

Questions

blak3r / Rushyo La solution de l'auteur fonctionne bien pour tout sauf pour Windows 8. Exécution de AT sur Windows 8 se traduit par :

The AT command has been deprecated. Please use schtasks.exe instead.

The request is not supported.

(voir capture d'écran #1) et retournera %errorLevel% 1 .

Recherche

J'ai donc cherché d'autres commandes qui nécessitent des autorisations élevées. rationallyparanoid.com avait une liste de quelques-unes, alors j'ai exécuté chaque commande sur les deux extrêmes opposés des systèmes d'exploitation Windows actuels (XP et 8) dans l'espoir de trouver une commande qui se verrait refuser l'accès sur les deux systèmes d'exploitation lorsqu'elle serait exécutée avec les autorisations standard.

Finalement, j'en ai trouvé un - NET SESSION . A vrai une solution propre et universelle qui n'implique pas.. :

  • la création ou l'interaction avec des données dans des lieux sécurisés
  • l'analyse des données renvoyées par FOR boucles
  • recherche des chaînes de caractères pour "Administrator".
  • en utilisant AT (incompatible avec Windows 8) ou WHOAMI (incompatible avec Windows XP).

Chacun d'entre eux a ses propres problèmes de sécurité, d'utilisation et de portabilité.

Essais

J'ai confirmé de manière indépendante que cela fonctionne sur :

  • Windows XP, x86
  • Windows XP, x64
  • Windows Vista, x86
  • Windows Vista, x64
  • Windows 7, x86
  • Windows 7, x64
  • Windows 8, x86
  • Windows 8, x64
  • Windows 10 v1909, x64

(voir capture d'écran n°2)

Mise en œuvre / Utilisation

Donc, pour utiliser cette solution, il suffit de faire quelque chose comme ceci :

@echo off
goto check_Permissions

:check_Permissions
    echo Administrative permissions required. Detecting permissions...

    net session >nul 2>&1
    if %errorLevel% == 0 (
        echo Success: Administrative permissions confirmed.
    ) else (
        echo Failure: Current permissions inadequate.
    )

    pause >nul

Disponible ici, si vous êtes paresseux : https://dl.dropbox.com/u/27573003/Distribution/Binaries/check_Permissions.bat

Explication

NET SESSION est une commande standard utilisée pour " gérer les connexions de l'ordinateur serveur. Utilisé sans paramètres, [il] affiche des informations sur toutes les sessions avec l'ordinateur local. "

Voici donc le processus de base de mon implémentation donnée :

  1. @echo off
    • Désactiver l'affichage des commandes
  2. goto check_Permissions
    • Sauter à la :check_Permissions bloc de code
  3. net session >nul 2>&1
    • Exécuter la commande
    • Cacher la sortie visuelle de la commande par
      1. Redirection de la sortie standard (poignée numérique 1 /) STDOUT ) vers nul
      2. Redirection du flux de sortie de l'erreur standard (poignée numérique 2/) STDERR ) vers la même destination que la poignée numérique 1
  4. if %errorLevel% == 0
    • Si la valeur du code de sortie ( %errorLevel% ) est 0 alors cela signifie que aucune erreur ne s'est produite et, par conséquent, la commande immédiatement précédente a exécuté avec succès
  5. else
    • Si la valeur du code de sortie ( %errorLevel% ) n'est pas 0 alors cela signifie que des erreurs se sont produites et, par conséquent, la commande immédiatement précédente a exécuté sans succès
  6. Le code entre les parenthèses respectives sera exécuté en fonction du critère qui est rempli

Captures d'écran

Windows 8 AT %errorLevel% :

imgur

NET SESSION sur Windows XP x86 - Windows 8 x64 :

imgur

Merci, @Tilka, d'avoir changé votre réponse acceptée pour la mienne :)

17 votes

+1 Superbe travail ! Bonne recherche. Votre post mérite d'être une nouvelle réponse acceptée.

13 votes

Cette solution fonctionne normalement très bien, mais si le service "Server" (LanmanServer) est arrêté, le code d'erreur pour "Server service has not been started" est le même que celui que vous obtenez pour "Access is denied", ce qui entraîne un faux négatif. En d'autres termes, dans certains cas, vous pouvez exécuter ce contrôle avec des privilèges administratifs et il renverra la même erreur que sans ces privilèges.

3 votes

@Lectrode J'ai posté une solution alternative qui n'a pas le même problème : stackoverflow.com/questions/4051883/

89voto

blak3r Points 5096

La solution d'Anders a fonctionné pour moi mais je ne savais pas comment l'inverser pour obtenir l'inverse (lorsque vous n'êtes pas un administrateur).

Voici ma solution. Elle comporte deux cas, un cas SI et un cas ELSE, et un peu d'art ascii pour s'assurer que les gens la lisent vraiment :)

Version minimale

Rushyo a posté cette solution ici : Comment détecter si CMD s'exécute en tant qu'administrateur ou a des privilèges élevés ?

NET SESSION >nul 2>&1
IF %ERRORLEVEL% EQU 0 (
    ECHO Administrator PRIVILEGES Detected! 
) ELSE (
    ECHO NOT AN ADMIN!
)

Version qui ajoute un message d'erreur, des pauses et des sorties.

@rem ----[ This code block detects if the script is being running with admin PRIVILEGES If it isn't it pauses and then quits]-------
echo OFF
NET SESSION >nul 2>&1
IF %ERRORLEVEL% EQU 0 (
    ECHO Administrator PRIVILEGES Detected! 
) ELSE (
   echo ######## ########  ########   #######  ########  
   echo ##       ##     ## ##     ## ##     ## ##     ## 
   echo ##       ##     ## ##     ## ##     ## ##     ## 
   echo ######   ########  ########  ##     ## ########  
   echo ##       ##   ##   ##   ##   ##     ## ##   ##   
   echo ##       ##    ##  ##    ##  ##     ## ##    ##  
   echo ######## ##     ## ##     ##  #######  ##     ## 
   echo.
   echo.
   echo ####### ERROR: ADMINISTRATOR PRIVILEGES REQUIRED #########
   echo This script must be run as administrator to work properly!  
   echo If you're seeing this after clicking on a start menu icon, then right click on the shortcut and select "Run As Administrator".
   echo ##########################################################
   echo.
   PAUSE
   EXIT /B 1
)
@echo ON

Fonctionne sur WinXP --> Win8 (y compris les versions 32/64 bits).

EDIT : 8/28/2012 Mise à jour pour la prise en charge de Windows 8. @BenHooper l'a signalé dans sa réponse ci-dessous. Merci d'upvoter sa réponse.

1 votes

AT ne fonctionne pas sous Windows 8, mais j'ai trouvé une meilleure solution. Je l'ai postée comme réponse ici, en fait : stackoverflow.com/questions/4051883/ (ou vous pouvez simplement faire défiler vers le bas, peu importe).

0 votes

Tu pourrais remplacer le "Rushyo a posté cette solution ici" par ton commentaire sur moi maintenant que tu utilises ma solution :)

0 votes

Cela ne fonctionne pas pour le groupe Admins du domaine ajouté au groupe Administrateurs dans la machine locale et la connexion avec l'utilisateur Admin du domaine.

53voto

and31415 Points 175

Plus de problèmes

Comme l'a souligné @Lectrode, si vous essayez d'exécuter l'option net session alors que le service du serveur est arrêté, vous recevez le message d'erreur suivant :

The Server service is not started.

More help is available by typing NET HELPMSG 2114

Dans ce cas, le %errorLevel% La variable sera définie comme suit 2 .

Nota Le service Serveur n'est pas démarré en mode sans échec (avec ou sans réseau).

A la recherche d'une alternative

Quelque chose qui :

  • peut être exécuté tel quel sur Windows XP et les versions ultérieures (32 et 64 bits) ;
  • ne touche pas le registre ni aucun fichier/dossier du système ;
  • fonctionne indépendamment de la locale du système ;
  • donne des résultats corrects même en mode sans échec.

J'ai donc démarré une machine virtuelle Windows XP de type vanille et j'ai commencé à faire défiler la liste des applications dans la fenêtre de l'ordinateur. C:\Windows\System32 dossier, j'essaie de trouver des idées. Après des essais et des erreurs, voici le sale (jeu de mots) que j'ai trouvée :

fsutil dirty query %systemdrive% >nul

El fsutil dirty nécessite des droits d'administrateur pour être exécutée, et échouera sinon. %systemdrive% est un variable d'environnement qui renvoie la lettre du lecteur où le système d'exploitation est installé. La sortie est redirigée vers nul et donc ignorée. Le site %errorlevel% La variable sera définie comme suit 0 uniquement en cas d'exécution réussie.

Voici ce que dit la documentation :

Fsutil sale

Interroge ou définit le dirty bit d'un volume. Lorsque le bit sale d'un volume est activé, autochk vérifie automatiquement l'absence d'erreurs dans le volume lors du prochain redémarrage de l'ordinateur.

Syntaxe

fsutil dirty {query | set} <VolumePath>

Paramètres

query           Queries the specified volume's dirty bit.
set             Sets the specified volume's dirty bit.
<VolumePath>    Specifies the drive name followed by a colon or GUID.

Remarques

Le bit sale d'un volume indique que le système de fichiers peut être dans un état incohérent. Le bit sale peut être activé parce que :

  • Le volume est en ligne et il comporte des modifications en suspens.
  • Des modifications ont été apportées au volume et l'ordinateur a été éteint avant que les modifications ne soient enregistrées sur le disque.
  • Une corruption a été détectée sur le volume.

Si le bit sale est activé lorsque l'ordinateur redémarre, chkdsk s'exécute pour vérifier l'intégrité du système de fichiers et pour tenter de résoudre tout problème lié au volume.

Exemples

Pour interroger le bit sale du lecteur C, tapez :

fsutil dirty query C:

Recherches complémentaires

Bien que la solution ci-dessus fonctionne à partir de Windows XP, il convient d'ajouter que Windows 2000 et Windows PE (environnement préinstallé) ne sont pas livrés avec le système d'exploitation. fsutil.exe donc nous devons recourir à autre chose.

Lors de mes précédents tests, j'ai remarqué que l'exécution de la sfc sans aucun paramètre aurait pour résultat soit :

  • une erreur, si vous n'aviez pas assez de privilèges ;
  • une liste des paramètres disponibles et leur utilisation.

C'est-à-dire : aucun paramètre, pas de fête . L'idée est que nous pouvons analyser la sortie et vérifier si nous avons obtenu autre chose qu'une erreur :

sfc 2>&1 | find /i "/SCANNOW" >nul

La sortie d'erreur est d'abord redirigée vers la sortie standard, qui est ensuite acheminée vers l'interface de l'utilisateur. find commandement. A ce stade, nous devons chercher le sólo qui est supporté dans toutes les versions de Windows depuis Windows 2000 : /SCANNOW . La recherche est insensible à la casse, et la sortie est rejetée en la redirigeant vers nul .

Voici un extrait de la documentation :

Sfc

Analyse et vérifie l'intégrité de tous les fichiers système protégés et remplace les versions incorrectes par des versions correctes.

Remarques

Vous devez être connecté en tant que membre du groupe Administrateurs pour exécuter le programme sfc.exe .

Exemple d'utilisation

Voici quelques exemples de collage :

Windows XP et ultérieur

@echo off

call :isAdmin
if %errorlevel% == 0 (
echo Running with admin rights.
) else (
echo Error: Access denied.
)

pause >nul
exit /b

:isAdmin
fsutil dirty query %systemdrive% >nul
exit /b

Windows 2000 / Windows PE

@echo off

call :isAdmin
if %errorlevel% == 0 (
echo Running with admin rights.
) else (
echo Error: Access denied.
)

pause >nul
exit /b

:isAdmin
sfc 2>&1 | find /i "/SCANNOW" >nul
exit /b

S'applique à

  • Windows 2000

  • Windows XP

  • Windows Vista

  • Windows 7

  • Windows 8

  • Windows 8.1
    ---

  • Windows PE

1 votes

+1 Excellentes solutions. La solution SFC en particulier semble être une vérification fiable pour tous les systèmes d'exploitation en question. Si je rencontre des problèmes en utilisant l'une ou l'autre de ces solutions, je les signalerai ici.

1 votes

Pour quiconque souhaite utiliser le SFC vérifier pour tous les systèmes, il faut être un peu créatif. Pour une raison quelconque, à partir de Windows 8 SFC ne produit que des caractères uniques. Afin d'analyser avec succès la sortie, vous devez effectuer les opérations suivantes : setlocal enabledelayedexpansion for /f "tokens=* delims=" %%s in ('sfc 2^>^&1^|MORE') do @set "output=!output!%%s" echo "%output%"|findstr /I /C:"/scannow">nul 2>&1 (3 lignes distinctes). Cela devrait fonctionner sous Windows 2000 jusqu'à Windows 2012 R2. Soit dit en passant, je préfère FINDSTR parce qu'il traite généralement les choses plus rapidement que FIND.

0 votes

Bon travail, @and31415 ! Je n'ai pas personnellement testé votre fsutil Je n'ai pas encore trouvé de solution mais, d'après ce que je peux voir, elle semble beaucoup plus flexible que ma solution. Mais pas aussi élégante, peut-être ;) Je suis heureux de voir qu'à nous deux, nous sommes en train de mettre au point une solution excellente, facile et flexible pour la détection des administrateurs :)

17voto

Anders Points 34448
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"&&(
 echo admin...
)

1 votes

Il semble que dans certains cas, le test échoue toujours, même après avoir été élevé. Dans mon cas, lorsque le script a été appelé par mon application.

13voto

Philm Points 659

Non seulement vérifier mais OBTENIR des droits d'administration automatiquement
aka UAC automatique pour Win 7/8/8.1 ff.
: Le suivant est vraiment cool avec une fonctionnalité supplémentaire : Cet extrait de lot ne vérifie pas seulement les droits d'administrateur, mais les obtient automatiquement ! (et teste avant, si vous vivez sur un OS compatible UAC).

Avec cette astuce, vous n'avez plus besoin de faire un clic droit sur votre fichier batch "avec des droits d'administrateur". Si vous avez oublié de le lancer avec des droits élevés, l'UAC s'affiche automatiquement ! En outre, au début, il est testé, si le système d'exploitation a besoin / fournit UAC, de sorte qu'il se comporte correctement, par exemple pour Win 2000/XP jusqu'à Win 8.1- testé.

@echo off
REM Quick test for Windows generation: UAC aware or not ; all OS before NT4 ignored for simplicity
SET NewOSWith_UAC=YES
VER | FINDSTR /IL "5." > NUL
IF %ERRORLEVEL% == 0 SET NewOSWith_UAC=NO
VER | FINDSTR /IL "4." > NUL
IF %ERRORLEVEL% == 0 SET NewOSWith_UAC=NO

REM Test if Admin
CALL NET SESSION >nul 2>&1
IF NOT %ERRORLEVEL% == 0 (

    if /i "%NewOSWith_UAC%"=="YES" (
        rem Start batch again with UAC
        echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
        echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
        "%temp%\getadmin.vbs"
        del "%temp%\getadmin.vbs"
        exit /B
    )

    rem Program will now start again automatically with admin rights! 
    rem pause
    goto :eof
)

Le snippet fusionne quelques bons motifs batch ensemble, en particulier (1) le test admin dans ce fil de discussion par Ben Hooper et (2) l'activation UAC lue sur BatchGotAdmin et citée sur le site batch par robvanderwoude (respect). (3) Pour l'identification de l'OS par "VER | FINDSTR pattern" je ne trouve pas la référence).

(Concernant certaines restrictions très mineures, lorsque "NET SESSION" ne fonctionne pas, comme mentionné dans une autre réponse, n'hésitez pas à insérer une autre de ces commandes. Pour moi, le fonctionnement en mode sans échec de Windows ou la désactivation de services standard spéciaux et autres ne sont pas des cas d'utilisation importants - pour certains administrateurs, ils le sont peut-être).

0 votes

C'est génial ! Notez une chose - l'appeler depuis le Visual Basic fonctionne comme suit start - il ouvre le script dans une nouvelle fenêtre. Si vous voulez voir les résultats, ajoutez une balise pause à la fin de votre script. De plus, il est difficile de détecter, quand on "reste" élevé, et quand il y a une réexécution. Vous pouvez utiliser un argument de ligne de commande pour cela : github.com/tgandor/meats/blob/master/lang_lawyer/cmd/

0 votes

@Philm : Et si l'UAC exige que l'utilisateur entre son mot de passe ? Je suppose que ce code ne leur donnera pas automatiquement les droits d'administration sans que l'utilisateur ait à entrer son mot de passe au préalable ;-)

0 votes

@copyitright. Non, bien sûr que non. Mais que le mot de passe soit nécessaire ou non n'est pas une différence ici : Ce que je voulais dire par "automatiquement" est bien sûr, que le script déclenche Windows pour DEMANDER automatiquement les droits, pas plus. Sans une construction comme celle-ci, le lot script échouerait, s'il était lancé par un double clic ou similaire. Pour éviter cela, l'utilisateur devrait savoir à l'avance que le script nécessite des droits élevés et devrait le démarrer comme cela.

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