Wie überprüfe ich, ob cygwin mintty / bash als Administrator ausgeführt wird?

15

Problemstellung: Was ist die eleganteste und robusteste Methode, um zu testen, ob die Cygwin- mintty bashSitzung "Als Administrator ausführen" lautet?

Warum gerade? Ich habe in der Regel mehrere minttyTerminals geöffnet, wenn ich Windows benutze ( minttykeine Registerkarten). Am umständlichsten ist es, wenn ich ein Terminalfenster finden muss, das ich durch Klicken mit der rechten Maustaste auf "Als Administrator ausführen" gestartet habe, wenn ich beispielsweise pingeine einmalige Aktion ausführen möchte . Ich möchte die "Als Administrator ausführen" -Eigenschaft der Terminalsitzung visuell anzeigen (indem ich die bashShell-Eingabeaufforderungsvariable PS1in meiner Startdatei ändere ~/.bashrc).

Einige schnelle mögliche Lösungen:

  1. Ich kann den Wert einiger Umgebungsvariablen vergleichen. Beim schnellen Betrachten der envAusgabe gibt es ziemlich viele Unterschiede. Es ist jedoch schwer zu sagen, welche Version in Bezug auf die Portabilität auf einen anderen Windows-Computer (möglicherweise mit einer anderen Windows-Version) am zuverlässigsten ist.
  2. id, id -Gnzeigt genauer gesagt verschiedene Gruppen, wenn sie als Administrator ausgeführt werden. In meinem Windows 7-Computer habe ich Administratorsund rootGruppen zur Liste hinzugefügt. Auch hier bin ich mir nicht sicher, ob dies tragbar ist.
  3. Ich könnte versuchen, eine Datei an einen Ort zu schreiben, der als normaler Benutzer fehlschlagen würde. Aber ich möchte keine Dateien an fremde Orte schreiben - dies könnte in einigen vorgestellten Szenarien potenziell destruktiv sein (z. B. fehlerhafte Speichermedien), und dies scheint für meinen Geschmack völlig unelegant.
  4. Ausführen eines Windows-Programms, das durch Rückgabestatus oder Ausgabe angibt, ob der Befehl "als Administrator" ausgeführt wird. Am besten wären einige mit analogem Zweck zu dem des UNIX- id(1)Befehls (aber nativ in Windows - oder Cygwin vorhanden, aber ohne zu weit geholte Übersetzung von Windows-Systemkonzepten in POSIX-emulierte Konzepte).

Bessere oder elegantere Vorschläge? Vielleicht bietet cygwin ein spezielles Kommandodienstprogramm an?

Update: 97% Duplikat von /programming/4051883/batch-script-how-to-check-for-admin-rights/ - der Unterschied ist nur hier, bashanstelle von (IMHO seltsam und archaisch) Windows cmd.exe. Bitte überprüfen Sie die Antworten und Kommentare dort.

FooF
quelle
Verwenden Sie die Option "Als Administrator ausführen", wenn Sie dies nicht tun, wird der Prozess nicht auf Administratorberechtigungen erhöht, selbst wenn ein Administratorkonto den Prozess startet. Erstellen Sie einfach eine Verknüpfung, damit dies immer getan wird.
Ramhound
1
Ich empfehle ConEmu auszuprobieren . Es verfügt über Registerkarten, kann Registerkarten als Administrator ausführen, die durch ein anderes Symbol in der Registerkartenleiste gekennzeichnet sind, und verwendet vor allem die Konsole hinter den Kulissen, damit native Windows-Anwendungen im Gegensatz zu Mintty korrekt darauf arbeiten.
Jan Hudec
2
@Ramhound Sie haben Recht, dass mein ursprüngliches Problem (das Administrator-Terminal-Fenster zu unterscheiden), das ich bereits in dieser Frage eingegrenzt hatte, gelöst werden konnte, indem eine Verknüpfung erstellt wird mintty, die 1. als Administrator ausgeführt wird, 2. eine andere Konfigurationsdatei mit unterschiedlicher Farbe verwendet Einstellungen und 3. verwendet ein alternatives Symbol. Wenn Sie der Öffentlichkeit beschreiben, wie dies zu erstellen ist, werde ich Sie positiv stimmen (es sei denn, Sie geben in Ihrer Antwort an, dass dies nicht innerhalb eines Skripts möglich ist :-).
FooF
1
@FooF - Nur weil Sie einen Prozess mit einem Benutzer auf Administratorebene ausführen, bedeutet dies nicht, dass der Prozess selbst eskaliert wurde. Windows setzt einen Prozess standardmäßig nur dann außer Kraft, wenn der Benutzer einer solchen Aktion zustimmt, daher die Funktion "Als Administrator ausführen" in Windows. Sie können auch ALLE Berechtigungen für JEDE gewünschte Gruppe bereitstellen, auch für die Foogewünschte Benutzergruppe.
Ramhound
1
@FooF - Denken Sie einfach, sudowas erforderlich ist, auch wenn Sie als Root-Benutzer ausgeführt werden.
Ramhound

Antworten:

9

Ich habe diese Funktion aus dem gleichen Grund geschrieben. Ich weiß nie, welche Shell Administratorrechte hat.

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

Es wurde aus dieser Antwort /programming//a/11995662/307968 für Windows Cmd Shell angepasst . Net Session gibt den Status 0 zurück, wenn Sie Administrator sind.

Jetzt muss ich nur noch meine Eingabeaufforderung oder vielleicht die Titelleistenfarbe ändern ....

Darrel Lee
quelle
Schöner Fund. Es scheint jedoch Randfälle zu geben, in denen dies ebenfalls fehlschlägt, wenn Sie die Stackoverflow-Kommentare überprüfen.
FooF
Trotzdem habe ich diese Antwort akzeptiert, da sie auf umfangreiche Diskussionen hindeutet (die Stapelüberlauf-Frage und die akzeptierte Antwort haben derzeit Punktzahlen von 147 bzw. 255).
FooF
Vielen Dank! Ich benutze dies, um den Benutzernamen in meiner Eingabeaufforderung selektiv einzufärben. Wenn der Verkauf erhöht ist, färbe ich ihn rot, ansonsten grün. Nützlich, um festzustellen, welche Schalen angehoben sind, wenn viele Terminalfenster geöffnet sind.
HelloGoodbye
16

Die endgültige Antwort auf diese Frage stammt aus der Cygwin-Mailingliste . Ein Prozess wird mit Administratorrechten ausgeführt, wenn der Benutzer, der ihn gestartet hat, Teil der Gruppe 544 (Administratoren) ist. Auch aus dem folgenden Kommentar von Cromax geht hervor, dass Gruppe 114 (lokales Konto und Mitglied der Administratorgruppe) manchmal ebenfalls vorhanden ist. Der Test für diese beiden Gruppen ist

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

Beispielsweise,

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

In der Vergangenheit mussten Sie auch nach Gruppe 0, der Stammgruppe in / etc / group, suchen. Aber / etc / group ist nicht mehr in Cygwin installiert und sollte normalerweise entfernt werden, wenn es vorhanden ist. Es wird daher nicht mehr empfohlen , auch nach Gruppe 0 zu suchen. Nur Gruppe 544.

Andrew Schulman
quelle
1
Vielen Dank für Ihre Anfrage in der Cygwin-Mailingliste. :-) Schön zu wissen, dass die (emulierten / übersetzten) Gruppen-IDs zwischen den Systemen konstant bleiben.
FooF
Klar ... ich wollte mich selbst kennenlernen, und die Leute dort wissen es .
Andrew Schulman
1
Leider funktioniert das in Mingw / Msys nicht. Stevens Antwort funktioniert, obwohl nur unter Windows 7.
14.
1
Ich habe das gerade versucht (auf W7) und es hat nicht funktioniert, aber ich habe bemerkt, dass, wenn der Benutzer von Windows als Administrator angemeldet ist, wenn Cygwin als Administrator ausgeführt wird, es eine andere Gruppe gibt, die Pop-In id-Ausgabe, nämlich 114 (lokales Konto und Mitglied der Administratorgruppe). Daher sollte der reguläre Ausdruck folgendermaßen aktualisiert werden:id -G | grep -qE '\<(114|544)\>' && echo admin || echo user
Cromax
Vielen Dank. Ich habe das selbst nicht gesehen, aber ich sehe, dass Gruppe 114 anscheinend eine Administratorengruppe ist, daher erscheint es sinnvoll, auch danach zu suchen. Ich habe die Antwort überarbeitet.
Andrew Schulman
7

Ich benutze den Rückgabewert des Windows-Programms at. Ich habe auch die Funktionalität des Sonderzeichens PROMPTING neu erstellt \$.

# 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 "

Beispiele

Steven
quelle
Unter der Annahme, dass es unter idWindows kein Äquivalent zum UNIX- Befehl gibt, akzeptiere ich dies als richtige Antwort. Zumindest atscheint das Ausführen des Befehls ohne Argumente keine Nebenwirkungen zu haben. Ich werde diese Methode .bashrcab sofort in meiner Datei verwenden! Danke für den Hack.
FooF
1
scheint nicht unter Windows
8.1
1
@zzapper Bitte genauer angeben. Was passiert / passiert nicht? Fehlermeldungen?
Steven
4
id gibt dieselben Werte zurück, at ist veraltet, verwende stattdessen schtasks.exe, aber das funktioniert, egal ob admin oder nicht
zzapper
2

id -G | grep -qE '\<(544|0)\>'schien nicht für mich zu funktionieren, da meine Ausgabe weder <> noch 544 hatte, selbst wenn sie erhöht war. Da jedoch zum Schreiben eine Elevation erforderlich ist %WINDIR%\system32, habe ich diese verwendet, um die Elevation mit einer Shell-Funktion zu testen:

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

Wenn man es auf Stevens exzellente Idee eines roten Hash-Charakters anwendet:

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

Tun Sie etwas, das nur der Administrator tun und auf Erfolg oder Misserfolg testen kann:

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

oder

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

oder

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

oder

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

In Msys unter Windows versuchen Sie dies (ich fand, dass die akzeptierte Antwort in Msys nicht funktionierte)

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

Dies setzt voraus, dass der Rückkehrcode atnur dann Null ist, wenn Sie als Administrator ausgeführt werden.

Spatz
quelle
1
Dies scheint die gleiche Methode zu sein, die @Steven in der vorherigen Antwort angegeben hat (was laut einem Kommentar nicht unter Windows 8.1 zu funktionieren scheint - es sei denn, MSYS "at" ist irgendwie). Obwohl die Frage Cygwin betraf, ist es interessant, sie mit ähnlichen MSYS zu vergleichen. Danke für den Beitrag.
FooF
Sehr ähnlich ja. Ich bin jedoch auf diese Frage gestoßen und habe versucht, ein Skript (Win7, Msys) einzuchecken, anstatt den Bash-Eingabeaufforderungsstil festzulegen. Daher dachte ich, dass dies für jemanden von Nutzen sein könnte, der dasselbe tut
sparrowt am
Ich stimme der Nützlichkeit zu.
FooF