Überprüfen Sie, ob die aktuelle Eingabeaufforderung als Administrator gestartet wurde

21

Ich möchte ein Skript schreiben, das Benutzereingaben aufnimmt und dann systemweite Änderungen vornimmt. Ich möchte, dass dies sehr allgemein ist, aber ganz oben muss überprüft werden, ob es als "Administrator" ausgeführt wird. Wenn dies nicht der Fall ist, möchte ich eine Meldung anzeigen, um ihnen dies mitzuteilen. Wenn es so ist, möchte ich, dass es weitergeht. Gibt es eine ständige Möglichkeit, dies zu überprüfen? Ich möchte keine neue Sitzung als Administrator starten, sondern nur feststellen, ob sie derzeit als Administrator ausgeführt wird

Der Kanadier Luke REINSTATE MONICA
quelle
Verwandte Themen
G-Man sagt, dass Monica
@ g-man wie hängt das zusammen?
Kanadier Luke REINSTATE MONICA
Es werden auch Befehle angefordert, die sich anders verhalten, wenn sie als Administrator ausgeführt werden oder nicht - oder zumindest als Antworten.
G-Man sagt, dass Monica

Antworten:

16

Gefunden bei 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
quelle
Was war der Grund, warum es gelöscht wurde?
Kanadier Luke REINSTATE MONICA
Dies funktioniert, beide aus dem Administrator - Konto, und wenn ich als Benutzer mit eingeschränkten Rechten laufen, aber wählen Sie ‚Als Administrator ausführen‘
Canadian Luke wieder einstellen MONICA
2
Gleiche Idee, aber mit der bedingten Ausführung Operatoren: net session >nul 2>&1 && echo Success || echo Failure. Ich finde diese kompakte Syntax praktischer.
Dbenham
6
Dies setzt voraus, dass der "Server" -Dienst ausgeführt wird.
ivan_pozdeev
8

Dies prüft auf eine hohe Integritätsstufe. (funktioniert für Windows Vista und höher)

@echo off

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

if %errorlevel% == 0 (
 echo Welcome, Admin
) else (
 echo Get lost, User
)
Woche
quelle
1
whoami wird in xp nicht unterstützt meine awnser ist besser unterstützt alle Betriebssysteme von Windows XP bis Windows 8
Alex
2
Dies funktioniert, wenn ich nur die Eingabeaufforderung öffne. Wenn ich den CMD als Administrator ausführe, wird trotzdem
angezeigt
2
@Alex Unterstützung für mehr Betriebssysteme ist großartig, aber diese Methode ist zuverlässiger, da sie die Berechtigungen für die aktuelle Sitzung direkt abfragt, anstatt das Fehlen eines weniger zuverlässigen Negativs zu akzeptieren, um auf ein positives zu schließen.
Iszi
2
Woche, whoami / Gruppen hat einen Randfall, wo Sie die falschen Informationen erhalten. Siehe stackoverflow.com/questions/4051883/…
zumalifeguard
1
Unter whoamiXP fehlt @week .
ivan_pozdeev
4

Viele, viele Antworten auf diese und mehrere andere Fragen in SE ( 1 , 2 , 3, um nur einige zu nennen), die alle auf die eine oder andere Weise unzureichend sind, haben deutlich gezeigt, dass Windows kein zuverlässiges integriertes Dienstprogramm bietet . Also ist es Zeit, Ihre eigenen auszurollen.

Ohne weitere schmutzige Hacks:

Kompilieren Sie das folgende Programm (Anweisungen folgen) oder erhalten Sie eine vorkompilierte Kopie . Dies muss nur einmal gemacht werden, dann können Sie das .exeüberall kopieren (zB neben der Sysinternals Suite ).

Der Code funktioniert in Win2k + 1 sowohl mit als auch ohne UAC-, Domänen- und transitiven Gruppen, da er beim Überprüfen von Berechtigungen auf die gleiche Weise wie das System selbst verwendet wird. chkadmindruckt "Admin" oder "Non-admin" und setzt den Exit-Code auf 0 bzw. 1. Die Ausgabe kann mit dem /qSchalter unterdrückt werden.

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;
}

Führen Sie zum Kompilieren in der Windows SDK-Eingabeaufforderung Folgendes aus:

cl /Ox chkadmin.c

(Wenn Sie VS2012 + verwenden, sind weitere Anpassungen erforderlich, wenn Sie auf 2k / XP abzielen müssen. )


Die Methode wurde mit freundlicher Genehmigung von /programming/4230602/detect-if-program-is-running-with-full-administrator-rights/4230908#4230908 erstellt

1 MSDN behauptet, dass es sich bei den APIs um XP + handelt, dies ist jedoch falsch. CheckTokenMembership ist 2k + und der andere ist noch älter .

ivan_pozdeev
quelle
3

Die sauberste Möglichkeit, mithilfe eines CMD-Skripts, das ich gefunden habe, nach Administratorrechten zu suchen, ist in etwa wie folgt:

@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

Diese Methode verwendet nur integrierte CMD.exe-Dateien, daher sollte sie sehr schnell sein. Es überprüft auch die tatsächlichen Funktionen des Prozesses, anstatt nach SIDs oder Gruppenmitgliedschaften zu suchen, sodass die effektive Berechtigung getestet wird. Dies funktioniert bereits unter Windows 2003 und XP. Normale Benutzerprozesse oder nicht erhöhte Prozesse schlagen beim Verzeichnis-Test fehl, wenn Admin-Prozesse oder Prozesse mit erhöhten Rechten erfolgreich sind.

Dieser Test schlägt fehl , wenn das Everyone, BUILTIN\Usersoder andere ähnliche Gruppe Leseberechtigung für Systemprofile gegeben. Zugegeben, dies ist eine andere Nicht-Standardkonfiguration als auf Computern, die als Windows-Domänencontroller konfiguriert sind und die Lese- / Ausführungsrechte für 'NT-AUTORITÄT \ Authentifizierte Benutzer' für Systemprofile gewähren.

Wilhelm
quelle
> Vergewissern Sie sich, dass VERIFY deaktiviert ist. > verifizieren /? Sagt cmd.exe, ob überprüft werden soll, ob Ihre Dateien korrekt auf eine Festplatte geschrieben wurden. ÜBERPRÜFEN [EIN | AUS] Geben Sie VERIFY ohne Parameter ein, um die aktuelle Einstellung von VERIFY anzuzeigen. Wie hilft dieser Befehl dem Skript?
Kanadier Luke REINSTATE MONICA
3
@Canadian Luke, Bei einigen eingebauten Befehlen wird die Fehlerstufe nicht gelöscht, wenn kein Fehler vorliegt. So gewöhnten sich die Leute an, Fehler mit Hacks wie verify. Ich neige dazu, cd .(cd space dot) zu verwenden, das errorlevel auf 0 setzt, keine Ausgabe erzeugt und auch nützlich ist, um eine Datei mit der Länge Null über zu erstellen cd . >somefile. Das heißt, ich habe 'dir' unter Windows 2000, XP, Vista, 2003, 2008, 2012, 7, 8 und 10 getestet 'dir'. Daher bin ich mir nicht sicher, warum William 'verify' verwendet hat, um zuerst die Fehlerebene zu löschen.
user3347790