Comment vérifier si le script de commandes actuel a des droits d'administrateur?
Je sais comment le faire appeler lui-même avec des runas mais pas comment vérifier les droits d'administrateur. Les seules solutions que j'ai vues sont des tâches de piratage grossières ou l'utilisation de programmes externes. Eh bien, en fait, je ne me soucie pas si c'est un travail de piratage tant qu'il fonctionne sur Windows XP et plus récent.
windows
batch-file
cmd
admin
flacs
la source
la source
Réponses:
Problèmes
La solution de blak3r / Rushyo fonctionne très bien pour tout sauf Windows 8. L'exécution
AT
sur Windows 8 se traduit par:(voir capture d'écran n ° 1) et reviendra
%errorLevel%
1
.Recherche
Donc, je suis allé chercher d'autres commandes qui nécessitent des autorisations élevées. rationallyparanoid.com en avait une liste, j'ai donc exécuté chaque commande sur les deux extrémités opposées 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 est exécutée avec des autorisations standard.
Finalement, j'en ai trouvé un -
NET SESSION
. Une vraie solution, propre et universelle qui n'implique pas:FOR
bouclesAT
(Windows 8 incompatible) ouWHOAMI
(Windows XP incompatible).Chacun d'eux a ses propres problèmes de sécurité, de convivialité et de portabilité.
Essai
J'ai indépendamment confirmé que cela fonctionne sur:
(voir capture d'écran n ° 2)
Mise en œuvre / utilisation
Donc, pour utiliser cette solution, faites simplement quelque chose comme ceci:
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 aux ordinateurs du serveur. Utilisée sans paramètres, [elle] affiche des informations sur toutes les sessions avec l'ordinateur local."Voici donc le processus de base de mon implémentation donnée:
@echo off
goto check_Permissions
:check_Permissions
bloc de codenet session >nul 2>&1
STDOUT
flux de sortie standard (poignée numérique 1 / ) versnul
STDERR
) vers la même destination que la poignée numérique 1if %errorLevel% == 0
%errorLevel%
) est0
alors cela signifie qu'aucune erreur ne s'est produite et, par conséquent, la commande précédente immédiate s'est exécutée avec succèselse
%errorLevel%
) n'est pas,0
cela signifie que des erreurs se sont produites et, par conséquent, la commande précédente immédiate s'est exécutée sans succèsCaptures d'écran
Windows 8
AT
%errorLevel%
:NET SESSION
sous Windows XP x86 - Windows 8 x64 :Merci, @Tilka, d'avoir changé votre réponse acceptée par la mienne. :)
la source
net session
avec succès (ERRORLEVEL = 0) - mais il n'a pas de droits d'administrateur. L'utilisationopenfiles
(voir la réponse de Lucretius ci-dessous) n'a pas ce problème.La solution d'Anders a fonctionné pour moi, mais je ne savais pas comment l'inverser pour obtenir le contraire (lorsque vous n'étiez pas administrateur).
Voici ma solution. Il a deux cas, un cas IF et ELSE, et un art ascii pour s'assurer que les gens le lisent réellement. :)
Version minimale
Rushyo a posté cette solution ici: Comment détecter si CMD fonctionne en tant qu'administrateur / a des privilèges élevés?
Version qui ajoute des messages d'erreur, des pauses et des sorties
Fonctionne sur WinXP -> Win8 (y compris les versions 32/64 bits).
EDIT: 28/08/2012 Mise à jour pour prendre en charge Windows 8. @BenHooper l'a souligné dans sa réponse ci-dessous. Veuillez voter pour sa réponse.
la source
AT
ne fonctionne pas sur Windows 8, mais j'ai trouvé une meilleure solution. Je l'ai posté comme réponse ici, en fait: stackoverflow.com/questions/4051883/… (ou vous pouvez simplement faire défiler vers le bas, peu importe).Plus de problèmes
Comme indiqué par @Lectrode, si vous essayez d'exécuter la
net session
commande alors que le service serveur est arrêté, vous recevez le message d'erreur suivant:Dans ce cas, la
%errorLevel%
variable sera définie sur2
.Remarque Le service serveur n'est pas démarré en mode sans échec (avec ou sans réseau).
Vous cherchez une alternative
Quelque chose que:
J'ai donc démarré une machine virtuelle Windows XP vanille et j'ai commencé à faire défiler la liste des applications dans le
C:\Windows\System32
dossier, en essayant de trouver des idées. Après les essais et les erreurs, voici l'approche sale (jeu de mots) que j'ai trouvée:La
fsutil dirty
commande nécessite des droits d'administrateur pour s'exécuter et échouera sinon.%systemdrive%
est une variable d'environnement qui renvoie la lettre de lecteur sur laquelle le système d'exploitation est installé. La sortie est redirigée versnul
, donc ignorée. La%errorlevel%
variable sera définie0
uniquement sur une exécution réussie.Voici ce que dit la documentation:
De plus amples recherches
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 fournis
fsutil.exe
, nous devons donc recourir à autre chose.Lors de mes tests précédents, j'ai remarqué que l'exécution de la
sfc
commande sans aucun paramètre entraînerait:C'est-à-dire: pas de paramètres, 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:
La sortie d'erreur est d'abord redirigée vers la sortie standard, qui est ensuite redirigée vers la
find
commande. À ce stade , nous devons chercher le seul paramètre qui est pris en charge dans toutes les versions de Windows depuis Windows 2000:/SCANNOW
. La recherche est insensible à la casse et la sortie est ignorée en la redirigeant versnul
.Voici un extrait de la documentation:
Exemple d'utilisation
Voici quelques exemples de collage-exécution:
Windows XP et versions ultérieures
Windows 2000 / Windows PE
S'applique à
---
la source
SFC
chèque pour tous les systèmes, vous devez être un peu créatif. Pour une raison quelconque, commencer avec Windows 8 neSFC
produit que des caractères uniques. Pour analyser correctement 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 sur Windows 2000 à Windows 2012 R2. D'un autre côté, je préfère FINDSTR car il traite généralement les choses plus rapidement que FIND.fsutil
solution mais, d'après ce que je peux voir, elle semble beaucoup plus flexible que ma solution. Bien que pas aussi élégant, peut-être. ;) Je suis heureux de voir qu'entre nous, nous obtenons une excellente solution de détection d'administrateur, simple et flexible. :)fsutil dirty query >nul
lorsque cela est élevé, cela renvoie du texte d'aide et% errorlevel% = 0fsutil dirty query >nul
, maisfsutil dirty query %systemdrive% >nul
fonctionne toujoursdeux autres façons - rapide et rétrocompatible.
fltmc
La commande est disponible sur tous les systèmes Windows depuis XP, donc cela devrait être assez portable.Une solution plus vraiment rapide testé sur
XP
,8.1
,7
- il y a une variable spécifique=::
qui est présenté uniquement si la session de la console n'a pas administrateur privileges.As il est pas si facile de créer variable qui contient=
dans son nom c'est une façon relativement fiable pour vérifier admin autorisation (il n'appelle pas d'exécutables externes donc il fonctionne bien)Si vous souhaitez l'utiliser directement via la ligne de commande, mais pas à partir d'un fichier de commandes, vous pouvez utiliser:
la source
=::
variable soit plutôt un bug - elle représente un lecteur inexistant, donc elle a probablement été corrigée dans win10.=::
est défini pour les CMD non administrateur sur Windows 10 1709. Quoi qu'il en soit, ce n'est pas un moyen fiable, vous pouvez facilement le forcer à être défini même sur les sessions CMD d'administration:subst :: c:\ & for %a in (::) do %a & set,
la source
solution alternative:
la source
openfiles
et de vérifier ERRORLEVEL.openfiles.exe
cela ne fonctionne pas dans WinPE, donc le script retournera toujours que l'utilisateur n'est pas administrateur.1>
et2>&1
sont expliqués sur microsoft.com/resources/documentation/windows/xp/all/proddocs/… .nul
fait référence au périphérique nulNon seulement vérifiez, mais OBTENEZ automatiquement les droits d'administrateur
aka Automatic UAC for Win 7/8 / 8.1 ff. : Ce qui suit est vraiment cool avec une autre fonctionnalité: Cet extrait de lot vérifie non seulement les droits d'administrateur, mais les obtient automatiquement! (et tests avant, si vous utilisez un système d'exploitation compatible UAC.)
Avec cette astuce, vous n'avez pas besoin de plus de temps pour cliquer avec le bouton droit sur votre fichier de commandes "avec les droits d'administrateur". Si vous avez oublié, pour le démarrer avec des droits élevés, UAC apparaît automatiquement! De plus, au début, il est testé, si le système d'exploitation a besoin / fournit l'UAC, il se comporte donc correctement, par exemple pour Win 2000 / XP jusqu'à Win 8.1 - testé.
L'extrait fusionne quelques bons modèles de lots, en particulier (1) le test d'administration dans ce fil par Ben Hooper et (2) l'activation UAC lue sur BatchGotAdmin et citée sur le site de lots par robvanderwoude (respect). (3) Pour l'identification du système d'exploitation par "VER | FINDSTR pattern", je ne trouve tout simplement 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 certains administrateurs, ils le sont peut-être.)
la source
start
- il ouvre le script dans une nouvelle fenêtre. Si vous voulez voir les résultats - ajoutez unpause
à la fin de votre script. De plus, il est difficile de détecter quand nous «restons» élevés et quand il y a une répétition. Vous pouvez utiliser un argument de ligne de commande pour cela: github.com/tgandor/meats/blob/master/lang_lawyer/cmd/…J'ai deux façons de vérifier l'accès privilégié, les deux sont assez fiables et très portables sur presque toutes les versions de Windows.
1. Méthode
* Fonctionne sur XP et versions ultérieures
2. Méthode
* Fonctionne sur XP et versions ultérieures
Exemple de travail
Un script qui efface le dossier temporaire
Afficher l'extrait de code
la source
Dans le script batch Elevate.cmd (voir ce lien ), que j'ai écrit pour obtenir les droits d'administrateur , je l'ai fait de la manière suivante:
Ceci est testé pour Windows 7, 8, 8.1, 10 et même Windows XP et ne nécessite aucune ressource telle qu'un répertoire spécial, un fichier ou une clé de registre.
la source
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:
Cette méthode utilise uniquement les modules internes 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 les SID ou les appartenances aux groupes, de sorte que l' autorisation effective est 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 les processus élevés réussissent.
la source
Ce qui suit essaie de créer un fichier dans le répertoire Windows. S'il réussit, il le supprimera.
Notez que 06CF2EB6-94E6-4a60-91D8-AB945AE8CF38 est un GUID qui a été généré aujourd'hui et il est supposé improbable d'entrer en conflit avec un nom de fichier existant.
la source
was generated today and it is assumed to be improbable to conflict with an existing filename.
sauf si deux personnes utilisent ce codeLes whoami / groupes ne fonctionnent pas dans un cas. Si vous avez totalement désactivé l'UAC (pas seulement la notification désactivée), et que vous êtes parti d'une invite d'administrateur , puis avez émis:
vous exécuterez non élevé, mais en émettant:
dira que vous êtes élevé. C'est faux. Voici pourquoi c'est faux:
Lors de l'exécution dans cet état, si IsUserAdmin ( https://msdn.microsoft.com/en-us/library/windows/desktop/aa376389(v=vs.85).aspx ) renvoie FALSE et UAC est entièrement désactivé et GetTokenInformation renvoie TokenElevationTypeDefault ( http://blogs.msdn.com/b/cjacks/archive/2006/10/24/modifying-the-mandatory-integrity-level-for-a-securable-object-in-windows-vista.aspx ), le processus ne fonctionne pas de manière élevée, mais le
whoami /groups
prétend.vraiment, la meilleure façon de le faire à partir d'un fichier batch est:
Vous devriez le faire
net session
deux fois parce que si quelqu'un a fait uneat
main avant, vous obtiendrez des informations erronées.la source
whoami /groups
ne fournit pas de fausses informations. C'est juste que celarunas /trustlevel
vous place dans un endroit inattendu: courir sans privilèges d'administrateur mais avec un niveau d'intégrité élevé. Vous pouvez le confirmer avec Process Explorer. (Cela peut être un bogue dansrunas
mais ce n'est pas le caswhoami
.)runas /trustlevel
Lorsque vous êtes un administrateur local et que l'UAC est désactivé, émettre cette commande runas à partir d'une invite d'administration vous mettra dans un contexte de sécurité "utilisateur de base". Dans ce mode, vous ne pouvez pas effectuer d'opérations d'administration. Essayez "net session", ou fsutil "ou tout autre utilitaire qui nécessite un accès administrateur. Cependant," whoami / groups "vous indique que vous êtes élevé. Si vous ne l'êtes pas. Le fait que l'appel à GetTokenInformation renvoie" TokenElevationTypeDefault "l'indique.la source
whoami
n'est pas pris en charge dans Windows XP.Certains serveurs désactivent les services requis par la commande "net session". Il en résulte que la vérification de l'administrateur indique toujours que vous ne disposez pas des droits d'administrateur lorsque vous en avez.
la source
Edit: copyitright a souligné que ce n'est pas fiable. L'approbation de l'accès en lecture avec UAC permettra à dir de réussir. J'ai un peu plus de script pour offrir une autre possibilité, mais ce n'est pas en lecture seule.
Ancienne réponse ci-dessous
Avertissement: peu fiable
Sur la base d'un certain nombre d'autres bonnes réponses ici et de points soulevés par and31415, j'ai constaté que je suis un fan des éléments suivants:
Peu de dépendances et rapide.
la source
Remarque: La vérification avec cacls de \ system32 \ config \ system échouera TOUJOURS dans WOW64, (par exemple à partir de% systemroot% \ syswow64 \ cmd.exe / 32 bits Total Commander) afin que les scripts qui s'exécutent dans un shell 32 bits dans un système 64 bits soient bouclés pour toujours ... Mieux vaut vérifier les droits sur le répertoire Prefetch:
Win XP à 7 testé, mais il échoue dans WinPE comme dans Windows 7 install.wim il n'y a pas de tel dir ni cacls.exe
Également dans winPE ET wow64 échoue la vérification avec openfiles.exe:
Dans Windows 7, le niveau d'erreur sera "1" avec des informations indiquant que "le système cible doit être un système d'exploitation 32 bits".
La vérification échouera probablement également dans la console de récupération.
Ce qui fonctionne dans Windows XP - 8 32/64 bits, dans WOW64 et dans WinPE, ce sont: les tests de création de répertoires (si l'administrateur n'a pas tapis le répertoire Windows bombardé avec des autorisations pour tout le monde ...) et
et
chèques.
De plus, une note de plus dans certaines fenêtres XP (et d'autres versions probablement aussi, selon le bricolage de l'administrateur) en fonction des entrées de registre appelant directement bat / cmd à partir du script .vbs échouera avec des informations selon lesquelles les fichiers bat / cmd ne sont associés à rien ...
En revanche, appeler cmd.exe avec le paramètre du fichier bat / cmd fonctionne correctement:
la source
Des dizaines de réponses dans cette question et des questions connexes et ailleurs dans SE, qui sont toutes déficientes de cette manière ou d'une autre, ont clairement montré que Windows ne fournit pas un utilitaire de console intégré fiable. Il est donc temps de déployer le vôtre.
Le code C suivant, basé sur Détecter si le programme s'exécute avec les droits d'administrateur complets , fonctionne dans Win2k + 1 , n'importe où et dans tous les cas (UAC, domaines, groupes transitifs ...) - car il fait la même chose que le système lui-même lorsqu'il vérifie les autorisations. Il signale le résultat à la fois avec un message (qui peut être désactivé avec un interrupteur) et un code de sortie.
Il ne doit être compilé qu'une seule fois, alors vous pouvez simplement copier le
.exe
partout - cela ne dépendkernel32.dll
que deadvapi32.dll
(j'ai téléchargé une copie ).chkadmin.c
:1 MSDN prétend que les API sont XP + mais c'est faux.
CheckTokenMembership
est 2k + et l'autre est encore plus ancien . Le dernier lien contient également un moyen beaucoup plus compliqué qui fonctionnerait même dans NT.la source
PowerShell quelqu'un?
la source
En voici un autre à ajouter à la liste ;-)
(essayez de créer un fichier à l'emplacement du système)
Le
MODE CON
réinitialise l'écran et supprime tout texte / erreur lorsqu'il n'est pas autorisé à écrire dans l'emplacement système.la source
Alternative: utilisez un utilitaire externe conçu à cet effet, par exemple IsAdmin.exe (logiciel gratuit sans restriction).
Codes de sortie:
0 - L'utilisateur actuel n'est pas membre du groupe Administrateurs
1 - Membre utilisateur actuel des administrateurs et exécutant élevé
2 - Membre utilisateur actuel des administrateurs, mais ne fonctionnant pas avec des droits élevés
la source
la source
Je vais expliquer le code ligne par ligne:
Les utilisateurs seront ennuyés par plus de 1 lignes sans cela.
Point où le programme démarre.
Définissez le nom de fichier du répertoire à créer.
Crée le répertoire
<DL>:\Windows
(remplacez <DL> par une lettre de lecteur).Si la variable d'environnement ERRORLEVEL est nulle, le message de réussite d'écho.
Allez à la fin (ne poursuivez pas).
Si ERRORLEVEL en est un, faites écho au message d'échec et passez à la fin.
Dans le cas où le nom de fichier existe déjà, recréez le dossier (sinon la
goto end
commande ne laissera pas cela s'exécuter).Spécifiez le point d'arrivée
Supprimez le répertoire créé.
Faites une pause pour que l'utilisateur puisse voir le message.
Remarque : Les
>nul
et2>nul
filtrent la sortie de ces commandes.la source
net user %username% >nul 2>&1 && echo admin || echo not admin
la source
admin
Je pense que la manière la plus simple est d'essayer de changer la date du système (qui nécessite des droits d'administrateur):
Si la
%date%
variable peut inclure le jour de la semaine, obtenez simplement la date de la dernière partie de laDATE
commande:la source
:(
J'ai trouvé un utilisateur qui peut utiliser
net session
même s'il n'est pas administrateur. Je n'ai pas cherché pourquoi. Ma solution consiste à tester si l'utilisateur peut créer un dossier dans le dossier Windows.Voici mon code:
la source
Une collection des quatre méthodes apparemment les plus compatibles de cette page. Le premier est vraiment génial. Testé à partir de XP. Confus cependant, il n'y a pas de commande standard disponible pour vérifier les droits d'administrateur. Je suppose qu'ils se concentrent simplement sur PowerShell maintenant, ce qui est vraiment inutile pour la plupart de mon propre travail.
J'ai appelé le lot «exit-if-not-admin.cmd» qui peut être appelé à partir d'autres lots pour s'assurer qu'ils ne continuent pas l'exécution si les droits d'administrateur requis ne sont pas accordés.
la source
Voici mes 2 centimes valent:
J'avais besoin d'un lot à exécuter dans un environnement de domaine pendant le processus de connexion utilisateur, dans un environnement de «salle de travail», en voyant les utilisateurs adhérer à une politique de «verrouillage» et à une vue restreinte (principalement distribuée via des ensembles d'objets de stratégie de groupe).
Un ensemble de GPO de domaine est appliqué avant qu'un script de connexion lié à un utilisateur AD La création d'un script de connexion de GPO soit trop permanente car le "nouveau" profil des utilisateurs n'a pas été créé / chargé / ou prêt à temps pour appliquer une "suppression et / ou Épinglez la barre des tâches et les éléments du menu Démarrer vbscript + ajoutez des fichiers locaux.
Par exemple: L'environnement de profil "utilisateur par défaut" proposé nécessite un raccourci ".URL" (.lnk) placé dans le "% ProgramData% \ Microsoft \ Windows \ Menu Démarrer \ Programmes * MyNewOWA.url *", et le "C: Emplacements \ Users \ Public \ Desktop \ * MyNewOWA.url * ", entre autres éléments
Les utilisateurs ont plusieurs machines au sein du domaine, où seuls ces PC «d'atelier» définis nécessitent ces politiques.
Ces dossiers nécessitent des droits "Admin" pour être modifiés, et bien que l '"Utilisateur du domaine" fasse partie du groupe "Admin" local - l'UAC était le prochain défi.
Trouvé diverses adaptations et fusionné ici. J'ai également des utilisateurs avec des appareils BYOD qui nécessitaient d'autres fichiers avec des problèmes de perm. Je n'ai pas testé sur XP (un peu trop vieux un OS), mais le code est présent, j'adorerais revenir en arrière.
Les PC de domaine doivent être régis autant que possible par des ensembles de GPO. Les machines de groupe de travail / autonomes peuvent être régies par ce script.
Rappelez-vous, une invite UAC apparaîtra au moins une fois avec un PC de groupe de travail BYOD (dès que la première élévation à «Admin perms» est requise), mais comme la politique de sécurité locale est modifiée pour une utilisation administrative à partir de ce moment, le les pop-ups disparaîtront.
Un PC de domaine doit avoir la stratégie GPO "ConsentPromptBehaviorAdmin" définie dans votre stratégie "Lock-down" "déjà" créée - comme expliqué dans la section "RÉFÉRENCES" du script.
Encore une fois, lancez l'importation secedit.exe du fichier '.inf' par défaut si vous êtes bloqué sur l'ensemble du débat "Vers UAC ou Pas vers UAC" :-).
btw: @boileau Vérifiez votre échec sur:
En exécutant uniquement "% SYSTEMROOT% \ system32 \ cacls.exe" ou "% SYSTEMROOT% \ system32 \ config \ system" ou les deux à partir de l'invite de commande - élevé ou non, vérifiez le résultat dans tous les cas.
la source
Une autre façon de procéder.
la source