Vérifiez si l'invite de commandes actuelle a été lancée en tant qu'administrateur

21

Je cherche à écrire un script qui accepte les entrées de l'utilisateur, puis effectue des modifications à l'échelle du système. J'ai besoin que ce soit très générique, mais simplement, en haut, j'en ai besoin pour vérifier s'il est exécuté «en tant qu'administrateur». Si ce n'est pas le cas, je veux afficher un message pour leur dire que; si c'est le cas, je veux que ça continue. Existe-t-il un moyen constant de vérifier cela? Je ne cherche pas à démarrer une nouvelle session en tant qu'administrateur, je veux juste détecter si elle est actuellement exécutée en tant qu'administrateur

Canadian Luke REINSTATE MONICA
la source
@ g-man comment est-ce lié?
Canadian Luke REINSTATE MONICA
Cela demande également des commandes qui se comporteront différemment si elles sont exécutées en tant qu'administrateur ou non - ou du moins, elles les ont obtenues en tant que réponses.
G-Man dit `` Réintègre Monica '' le

Réponses:

16

Trouvé sur Stack Overflow :

@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
Alex
la source
Quelle était la raison de sa suppression?
Canadian Luke REINSTATE MONICA
Cela fonctionne, à la fois à partir du compte administrateur et lorsque je cours en tant qu'utilisateur limité, mais choisissez «Exécuter en tant qu'administrateur»
Canadian Luke REINSTATE MONICA
2
Même idée, mais en utilisant les opérateurs d'exécution conditionnelle: net session >nul 2>&1 && echo Success || echo Failure. Je trouve cette syntaxe compacte plus pratique.
dbenham
6
Cela nécessite l'exécution du service "Serveur".
ivan_pozdeev
8

Cela vérifie le niveau d'intégrité élevé. (fonctionne pour Windows Vista et supérieur)

@echo off

whoami /groups | find "S-1-16-12288" > nul

if %errorlevel% == 0 (
 echo Welcome, Admin
) else (
 echo Get lost, User
)
la semaine
la source
1
whoami n'est pas pris en charge dans xp mon awnser prend mieux en charge tous les systèmes d'exploitation de windows xp à windows 8
Alex
2
Cela fonctionne si je viens d'ouvrir l'invite de commande. Si j'exécute le CMD en tant qu'administrateur, cela montre quand même qu'il est exécuté en tant qu'utilisateur
Canadian Luke REINSTATE MONICA
2
@Alex La prise en charge de plusieurs systèmes d'exploitation est excellente, mais cette méthode est plus fiable car elle interroge directement les autorisations accordées à la session en cours au lieu de prendre l'absence d'un négatif moins fiable pour en déduire un positif.
Iszi
2
semaine, whoami / groupes a un cas de bord où vous obtenez les mauvaises informations. Voir stackoverflow.com/questions/4051883/…
zumalifeguard
1
@week whoamimanque sur XP.
ivan_pozdeev
4

De nombreuses réponses à cette question et à plusieurs autres questions dans SE ( 1 , 2 , 3 pour n'en nommer que quelques-unes), qui sont toutes déficientes de cette manière ou d'une autre, ont clairement montré que Windows ne fournit pas un utilitaire intégré fiable. . Il est donc temps de déployer le vôtre.

Sans autres hacks sales:

Compilez le programme suivant (les instructions suivent) ou obtenez une copie précompilée . Cela ne doit être fait qu'une seule fois, puis vous pouvez copier le .exepartout (par exemple aux côtés de la suite Sysinternals ).

Le code fonctionne dans Win2k + 1 , avec et sans UAC, domaine, groupes transitifs, peu importe - car il utilise la même manière que le système lui-même lorsqu'il vérifie les autorisations. chkadminimprime "Admin" ou "Non-admin" et définit le code de sortie sur 0 ou 1, respectivement. La sortie peut être supprimée avec le /qcommutateur.

chkadmin.c:

#include <malloc.h>
#include <stdio.h>
#include <windows.h>
#pragma comment (lib,"Advapi32.lib")

int main(int argc, char** argv) {
    BOOL quiet = FALSE;
    DWORD cbSid = SECURITY_MAX_SID_SIZE;
    PSID pSid = _alloca(cbSid);
    BOOL isAdmin;

    if (argc > 1) {
        if (!strcmp(argv[1],"/q")) quiet=TRUE;
        else if (!strcmp(argv[1],"/?")) {fprintf(stderr,"Usage: %s [/q]\n",argv[0]);return 0;}
    }

    if (!CreateWellKnownSid(WinBuiltinAdministratorsSid,NULL,pSid,&cbSid)) {
        fprintf(stderr,"CreateWellKnownSid: error %d\n",GetLastError());exit(-1);}

    if (!CheckTokenMembership(NULL,pSid,&isAdmin)) {
        fprintf(stderr,"CheckTokenMembership: error %d\n",GetLastError());exit(-1);}

    if (!quiet) puts(isAdmin ? "Admin" : "Non-admin");
    return !isAdmin;
}

Pour compiler, exécutez dans l'invite de commande du SDK Windows:

cl /Ox chkadmin.c

(si vous utilisez VS2012 +, d' autres ajustements sont nécessaires si vous devez cibler 2k / XP )


La méthode est une gracieuseté de /programming/4230602/detect-if-program-is-running-with-full-administrator-rights/4230908#4230908

1 MSDN prétend que les API sont XP + mais c'est faux. CheckTokenMembership est 2k + et l'autre est encore plus ancien .

ivan_pozdeev
la source
3

La façon la plus simple de vérifier les privilèges d'administrateur à l'aide d'un script CMD, que j'ai trouvée, est quelque chose comme ceci:

@echo off

REM  Calling verify with no args just checks the verify flag,
REM   we use this for its side effect of setting errorlevel to zero
verify >nul

REM  Attempt to read a particular system directory - the DIR
REM   command will fail with a nonzero errorlevel if the directory is
REM   unreadable by the current process.  The DACL on the
REM   c:\windows\system32\config\systemprofile directory, by default,
REM   only permits SYSTEM and Administrators.
dir %windir%\system32\config\systemprofile >nul 2>nul

REM  Use IF ERRORLEVEL or %errorlevel% to check the result
if not errorlevel 1 echo has Admin privs
if     errorlevel 1 echo has only User privs

Cette méthode utilise uniquement les extensions CMD.exe, elle devrait donc être très rapide. Il vérifie également les capacités réelles du processus plutôt que de rechercher des SID ou des appartenances à des groupes, afin que l' autorisation effective soit testée. Et cela fonctionne aussi loin que Windows 2003 et XP. Les processus utilisateur normaux ou les processus sans niveau échouent à la sonde d'annuaire, où en tant qu'administrateur ou processus élevés réussissent.

Ce test échoue si le Everyone , BUILTIN\Usersou un autre groupe similaire est donné l' autorisation de lecture à systemprofile. Certes, il s'agit d'une configuration non standard autre que sur les machines configurées en tant que contrôleurs de domaine Windows qui accordent des droits de lecture / exécution 'NT AUTHORITY \ Authenticated Users' à systemprofile.

William
la source
> vérifiez que VERIFY est désactivé. > vérifier /? Indique à cmd.exe s'il faut vérifier que vos fichiers sont correctement écrits sur un disque. VERIFY [ON | OFF] Tapez VERIFY sans paramètre pour afficher le réglage VERIFY actuel. Comment cette commande aide-t-elle le script?
Canadian Luke REINSTATE MONICA
3
@Canadian Luke, Certaines commandes intégrées n'effacent pas le niveau d'erreur s'il n'y a pas d'erreur. Ainsi, les gens ont pris l'habitude de supprimer le niveau d'erreur à l'aide de hacks tels que verify. J'ai tendance à utiliser cd .(point d'espace cd) qui définit le niveau d'erreur à 0, ne produit aucune sortie et est également utile pour créer un fichier de longueur nulle via cd . >somefile. Cela dit, j'ai testé 'dir' sur Windows 2000, XP, Vista, 2003, 2008, 2012, 7, 8 et 10. Pour tous ces 'dir' effacera le niveau d'erreur à 0 en cas de succès s'il avait été défini avant le 'dir'. Ainsi, je ne sais pas pourquoi william a utilisé «vérifier» pour effacer d'abord le niveau d'erreur.
user3347790