Comment vérifier si cygwin mintty / bash est exécuté en tant qu'administrateur?

15

Énoncé du problème: Quelle est la façon la plus élégante et la plus robuste de tester si la mintty bashsession Cygwin est "Exécuter en tant qu'administrateur"?

Pourquoi, plus précisément? J'ai généralement plusieurs minttyterminaux ouverts lorsque j'utilise Windows ( minttyn'a pas d'onglets). Le plus gênant, c'est quand j'ai besoin de trouver une fenêtre de terminal que j'ai démarrée en cliquant avec le bouton droit sur "Exécuter en tant qu'administrateur" lorsque, par exemple, je veux exécuter pingou une autre procédure unique. Je voudrais indiquer visuellement la «exécution en tant qu'administrateur» de la session de terminal (en changeant la bashvariable d'invite du shell PS1dans mon fichier de démarrage ~/.bashrc).

Quelques solutions potentielles rapides:

  1. Je peux comparer la valeur de certaines variables environnementales. En regardant rapidement la envsortie, il existe de nombreuses différences. Il est cependant difficile de dire lequel est le plus fiable en termes de portabilité vers une autre machine Windows (exécutant peut-être une version différente de Windows).
  2. id, id -Gnaffiche plus spécifiquement différents groupes s’ils sont exécutés en tant qu’administrateur. Dans ma machine Windows 7, j'ai des groupes Administratorset rootajoutés à la liste. Encore une fois, je ne suis pas sûr que ce soit portable.
  3. Je pourrais essayer d'écrire un fichier dans un emplacement qui échouerait en tant qu'utilisateur normal. Mais je ne veux pas écrire de fichiers dans des endroits étranges - cela pourrait dans certains scénarios imaginés être potentiellement destructeur (par exemple, un support de stockage défaillant) et cela semble tout à fait inélégant à mon goût.
  4. Exécution d'un programme Windows qui indiquera par état de retour ou sortie si la commande est exécutée "en tant qu'administrateur". Le mieux serait certains avec un but analogue à celui de la id(1)commande UNIX (mais existant nativement dans Windows - ou Cygwin, mais sans traduction trop poussée des concepts du système Windows en concepts émulés POSIX).

Des suggestions meilleures ou plus élégantes? Peut-être que cygwin fournit un utilitaire de commande dédié à cet effet?

Mise à jour: doublon de 97% de /programming/4051883/batch-script-how-to-check-for-admin-rights/ - la différence est juste ici en utilisant bashau lieu de (IMHO bizarre et archaïque) Windows cmd.exe. Veuillez vérifier les réponses et les commentaires là-bas.

FooF
la source
utilisez «exécuter en tant qu'administrateur» à moins que vous ne le fassiez, le processus n'est pas élevé aux autorisations d'administrateur même si un compte d'administrateur démarre le processus. Créez simplement un raccourci pour que cela soit toujours fait.
Ramhound
1
Je recommande d'essayer ConEmu . Il a des onglets, peut exécuter l'onglet en tant qu'administrateur indiqué par une icône différente dans la barre d'onglets et, surtout, utilise la console en arrière-plan afin que les applications Windows natives fonctionnent correctement, contrairement à Mintty.
Jan Hudec
2
@Ramhound Vous avez raison de dire que mon problème d'origine (distinguant la fenêtre du terminal administrateur) que j'avais déjà réduit à cette question pourrait être résolu en créant un raccourci pour minttycela 1. s'exécute en tant qu'administrateur, 2. utilise un fichier de configuration différent avec des couleurs différentes paramètres et 3. utilise une autre icône. Si vous décrivez au grand public comment créer ceci, je vous donnerai un upvote (à moins que vous ne disiez dans votre réponse que cela ne peut pas être fait dans un script :-).
FooF
1
@FooF - Ce n'est pas parce que vous exécutez un processus avec un utilisateur de niveau administrateur que le processus lui-même a été escaladé. Par défaut, Windows n'asservit un processus que si l'utilisateur approuve une telle action, d'où la fonction "exécuter en tant qu'administrateur" dans Windows. Vous pouvez également fournir TOUTES les autorisations à N'IMPORTE QUEL groupe que vous souhaitez, même le Foogroupe d'utilisateurs si vous le souhaitez.
Ramhound
1
@FooF - Pensez-y simplement comme sudoce qui est requis même si vous exécutez en tant qu'utilisateur root.
Ramhound

Réponses:

9

Je viens d'écrire cette fonction pour la même raison. Je ne sais jamais quel shell a des privilèges d'administrateur.

function isadmin()
{
    net session > /dev/null 2>&1
    if [ $? -eq 0 ]; then echo "admin"
    else echo "user"; fi
}

Il s'est adapté de cette réponse /programming//a/11995662/307968 pour le shell cmd de windows. Net Session renvoie l'état 0 si vous êtes administrateur.

Maintenant, je dois juste changer mon invite, ou peut-être la couleur de la barre de titre ....

Darrel Lee
la source
Belle trouvaille. Bien qu'il semble y avoir des cas marginaux où cela échoue également, si vous vérifiez les commentaires de stackoverflow.
FooF
Néanmoins, j'ai accepté cette réponse car elle pointe vers des discussions très complètes (la question stackoverflow et la réponse acceptée y ont actuellement des scores respectivement de 147 et 255).
FooF
Merci! Je l'utilise pour colorer sélectivement le nom d'utilisateur dans mon invite. Si la vente est élevée, je la colore en rouge, sinon vert. Utile pour garder une trace des coquilles surélevées si plusieurs fenêtres de terminal sont ouvertes.
HelloGoodbye
16

La réponse définitive à cette question provient de la liste de diffusion Cygwin . Un processus s'exécute avec des droits d'administrateur si l'utilisateur qui l'a démarré fait partie du groupe 544 (Administrateurs). D'après le commentaire ci-dessous de Cromax, il semble que le groupe 114 (compte local et membre du groupe Administrateur) soit également parfois présent. Le test pour ces deux groupes est

id -G | grep -qE '\<(114|544)\>'

Par exemple,

id -G | grep -qE '\<(114|544)\>' && echo admin || echo user

Dans le passé, vous deviez également vérifier le groupe 0, le groupe racine dans / etc / group. Mais / etc / group n'est plus installé dans Cygwin, et devrait généralement être supprimé s'il est présent, il n'est donc plus recommandé de vérifier également le groupe 0. Juste le groupe 544.

Andrew Schulman
la source
1
Merci d'avoir posé la question dans la liste de diffusion Cygwin. :-) Ravi de savoir que les identifiants de groupe (émulés / traduits) restent constants entre les systèmes.
FooF
Bien sûr ... Je voulais me connaître, et les gens là-bas le savent .
Andrew Schulman
1
Malheureusement, cela ne fonctionne pas dans Mingw / Msys. La réponse de Steven le fait, mais uniquement sur Windows 7.
sparrowt
1
Je viens d'essayer cela (sur W7) et cela n'a pas fonctionné, mais j'ai remarqué que si l'utilisateur de Windows est connecté en tant qu'administrateur, alors quand Cygwin est exécuté en tant qu'administrateur, il y a un autre groupe qui apparaît dans idla sortie de, à savoir 114 (compte local et membre du groupe Administrateur). Donc l'expression régulière devrait être mise à jour pour:id -G | grep -qE '\<(114|544)\>' && echo admin || echo user
Cromax
Merci. Je ne l'ai pas vu moi-même, mais je vois que le groupe 114 semble être un groupe Administrateurs, il semble donc raisonnable de le vérifier aussi. J'ai révisé la réponse.
Andrew Schulman
7

J'utilise la valeur de retour du programme Windows at. J'ai également recréé la fonctionnalité du caractère spécial PROMPTING \$.

# Set a white $ initially
eStyle='\[\e[0m\]$'

# If 'at' succeeds, use a red # instead
at &> /dev/null && eStyle='\[\e[0;31m\]#\[\e[0m\]'  # Use # in red

PS1='\n\[\e[0;32m\]\u@\h \[\e[0;33m\]\w\[\e[0m\]\n'"$eStyle "

Exemples

Steven
la source
En supposant qu'il n'y a pas d'équivalent de idcommande UNIX dans Windows, j'accepte cela comme une réponse correcte. Au moins l'exécution de la atcommande sans aucun argument ne semble pas avoir d'effets secondaires. Je vais .bashrcdésormais utiliser cette méthode dans mon dossier! Merci pour le hack.
FooF
1
ne semble pas fonctionner sur windows8.1
zzapper
1
@zzapper Veuillez être plus précis. Que se passe-t-il / ne se produit-il pas? Messages d'erreur?
Steven
4
id renvoie les mêmes valeurs, at est déconseillé, utilisez schtasks.exe à la place, mais cela fonctionne, qu'il soit administrateur ou non
zzapper
2

id -G | grep -qE '\<(544|0)\>'ne semblait pas fonctionner pour moi, car ma sortie n'avait ni <> ni 544 même lorsqu'elle était élevée. Cependant, étant donné que l'élévation est requise pour écrire %WINDIR%\system32, j'ai utilisé cela pour tester l'élévation avec une fonction shell:

is_elevated() { 
   [[ $(uname -o) -eq "Cygwin" ]] || return 1
   touch $WINDIR/system32/.cyg_elevated &> /dev/null
}

Lorsqu'il est appliqué à l'excellente idée de Steven d'un caractère de hachage rouge:

is_elevated && PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\[\e[0;31m\]#\[\e[0m\] '
Josh
la source
1

Faites quelque chose que seul l'administrateur peut faire et testez le succès ou l'échec: -

if touch c:/Users/.x ; then  echo 'ok'  ; fi

ou

touch c:/Users/.x && echo ok

ou

touch c:/Users/.x && \rm c:/Users/.x && echo ok

ou

touch c:/Users/.x  &> /dev/null && \rm c:/Users/.x && echo you are admin
zzapper
la source
1

Dans Msys sur Windows, essayez ceci (j'ai trouvé que la réponse acceptée ne fonctionnait pas dans Msys)

at &> /dev/null && echo "Running as admin" || echo "NOT running as admin"

Cela repose sur le code retour de atzéro uniquement lors de l'exécution en tant qu'administrateur.

moineau
la source
1
Cela semble la même méthode que @Steven a donné dans la réponse précédente (qui ne semble pas fonctionner sur Windows 8.1 selon un commentaire - à moins que MSYS "at" ne soit en quelque sorte). Alors que la question portait sur Cygwin, il est intéressant de comparer avec des MSYS similaires. Merci pour la contribution.
FooF du
Oui très similaire. Cependant, je me suis retrouvé sur cette question en essayant de l'utiliser pour archiver un script (Win7, Msys) plutôt que de définir le style d'invite bash, donc j'ai pensé que cela pourrait être utile à quelqu'un d'autre faisant de même
sparrowt
Je suis d'accord sur l'utilité.
FooF