350 Stimmen

Batch-Skript: Prüfung auf Administratorrechte

Wie prüfe ich, ob das aktuelle Batch-Skript über Administratorrechte verfügt?

Ich weiß, wie ich es dazu bringe, sich selbst mit runas aufzurufen, aber nicht, wie ich die Adminrechte prüfe. Die einzigen Lösungen, die ich gesehen habe, sind grobe Hackjobs oder die Verwendung externer Programme. Nun, eigentlich ist es mir egal, ob es ein Hackjob ist, solange es unter Windows XP und neueren Versionen funktioniert.

562voto

mythofechelon Punkte 3572

Ausgaben

blak3r / Rushyo Die Lösung funktioniert für alle Betriebssysteme außer Windows 8. Ausführen von AT unter Windows 8 führt zu:

The AT command has been deprecated. Please use schtasks.exe instead.

The request is not supported.

(siehe Bildschirmfoto #1) und gibt zurück %errorLevel% 1 .

Forschung

Also habe ich nach anderen Befehlen gesucht, für die erhöhte Berechtigungen erforderlich sind. rationallyparanoid.com hatte eine Liste mit einigen wenigen, also führte ich jeden Befehl auf den beiden entgegengesetzten Extremen der aktuellen Windows-Betriebssysteme (XP und 8) aus, in der Hoffnung, einen Befehl zu finden, dem der Zugriff auf beiden Betriebssystemen verweigert würde, wenn er mit Standardberechtigungen ausgeführt würde.

Schließlich habe ich eine gefunden - NET SESSION . A wahr Eine saubere, universelle Lösung, die nichts mit sich bringt:

  • die Erstellung von oder Interaktion mit Daten an sicheren Orten
  • Analyse der Daten, die von FOR Schleifen
  • Suchstrings für "Administrator"
  • mit AT (nicht kompatibel mit Windows 8) oder WHOAMI (mit Windows XP nicht kompatibel).

Jede davon hat ihre eigenen Probleme in Bezug auf Sicherheit, Benutzerfreundlichkeit und Übertragbarkeit.

Prüfung

Ich habe unabhängig bestätigt, dass dies funktioniert:

  • Windows XP, x86
  • Windows XP, x64
  • Windows Vista, x86
  • Windows Vista, x64
  • Windows 7, x86
  • Windows 7, x64
  • Windows 8, x86
  • Windows 8, x64
  • Windows 10 v1909, x64

(siehe Bildschirmfoto #2)

Durchführung/Verwendung

Um diese Lösung zu nutzen, gehen Sie einfach wie folgt vor:

@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

Erläuterung

NET SESSION ist ein Standardbefehl, um "Server-Computer-Verbindungen verwalten". Ohne Parameter verwendet, [zeigt es] Informationen über alle Sitzungen mit dem lokalen Computer an."

So, hier ist der grundlegende Prozess meiner gegebenen Implementierung:

  1. @echo off
    • Anzeige von Befehlen deaktivieren
  2. goto check_Permissions
    • Sprung zum :check_Permissions Codeblock
  3. net session >nul 2>&1
    • Befehl ausführen
    • Visuelle Ausgabe des Befehls ausblenden durch
      1. Umleitung der Standardausgabe (numerischer Handle 1 / STDOUT ) Strom zu nul
      2. Umleitung des Standardfehler-Ausgabestroms (numerisches Handle 2 / STDERR ) an das gleiche Ziel wie der numerische Handle 1
  4. if %errorLevel% == 0
    • Wenn der Wert des Exit-Codes ( %errorLevel% ) es 0 dann bedeutet dies, dass keine Fehler aufgetreten sind und daher lief der unmittelbar vorhergehende Befehl erfolgreich
  5. else
    • Wenn der Wert des Exit-Codes ( %errorLevel% ) ist nicht 0 dann bedeutet dies, dass Fehler aufgetreten sind und daher lief der unmittelbar vorhergehende Befehl erfolglos
  6. Je nachdem, welches Kriterium erfüllt ist, wird der Code zwischen den jeweiligen Klammern ausgeführt

Screenshots

Windows 8 AT %errorLevel% :

imgur

NET SESSION unter Windows XP x86 - Windows 8 x64 :

imgur

Danke, @Tilka, dass du deine akzeptierte Antwort in meine geändert hast :)

98voto

blak3r Punkte 15398

Die andere Lösung hat bei mir funktioniert, aber ich war mir nicht sicher, wie man sie umkehren kann, um das Gegenteil zu erreichen (wenn man kein Administrator ist).

Hier ist meine Lösung. Sie besteht aus zwei Fällen, einem WENN- und einem ELSE-Fall, und etwas Ascii-Grafik, um sicherzustellen, dass die Leute sie tatsächlich lesen :)

Minimale Version

Rushyo hat diese Lösung hier gepostet: Wie lässt sich feststellen, ob CMD als Administrator ausgeführt wird/erhöhte Berechtigungen hat?

NET SESSION >nul 2>&1
IF %ERRORLEVEL% EQU 0 (
    ECHO Administrator PRIVILEGES Detected! 
) ELSE (
    ECHO NOT AN ADMIN!
)

Version, die Fehlermeldungen, Pausen und Beendigungen hinzufügt

@rem ----[ This code block detects if the script is being running with admin PRIVILEGES If it isn't it pauses and then quits]-------
echo OFF
NET SESSION >nul 2>&1
IF %ERRORLEVEL% EQU 0 (
    ECHO Administrator PRIVILEGES Detected! 
) ELSE (
   echo ######## ########  ########   #######  ########  
   echo ##       ##     ## ##     ## ##     ## ##     ## 
   echo ##       ##     ## ##     ## ##     ## ##     ## 
   echo ######   ########  ########  ##     ## ########  
   echo ##       ##   ##   ##   ##   ##     ## ##   ##   
   echo ##       ##    ##  ##    ##  ##     ## ##    ##  
   echo ######## ##     ## ##     ##  #######  ##     ## 
   echo.
   echo.
   echo ####### ERROR: ADMINISTRATOR PRIVILEGES REQUIRED #########
   echo This script must be run as administrator to work properly!  
   echo If you're seeing this after clicking on a start menu icon, then right click on the shortcut and select "Run As Administrator".
   echo ##########################################################
   echo.
   PAUSE
   EXIT /B 1
)
@echo ON

Funktioniert unter WinXP --> Win8 (einschließlich 32/64-Bit-Versionen).

EDIT: 28.8.2012 Aktualisiert zur Unterstützung von Windows 8. @BenHooper hat dies in seiner Antwort unten erwähnt. Bitte bewerten Sie seine Antwort mit "Upvote".

59voto

and31415 Punkte 665

Weitere Themen

Wie von @Lectrode erwähnt, können Sie das Programm net session während der Serverdienst angehalten ist, erhalten Sie die folgende Fehlermeldung:

The Server service is not started.

More help is available by typing NET HELPMSG 2114

In diesem Fall ist die %errorLevel% wird die Variable auf 2 .

Hinweis Der Serverdienst wird im abgesicherten Modus (mit oder ohne Netzwerk) nicht gestartet.

Auf der Suche nach einer Alternative

Etwas, das:

  • kann sofort unter Windows XP und höher (32 und 64 Bit) ausgeführt werden;
  • berührt weder die Registrierung noch eine Systemdatei/einen Systemordner;
  • funktioniert unabhängig vom Gebietsschema des Systems;
  • liefert auch im abgesicherten Modus korrekte Ergebnisse.

Ich habe also eine virtuelle Maschine mit Windows XP gebootet und angefangen, durch die Liste der Anwendungen im Fenster C:\Windows\System32 Ordner, um ein paar Ideen zu bekommen. Nach vielen Versuchen und Irrtümern ist dies die schmutzig (Wortspiel beabsichtigt) Ansatz, den ich mir ausgedacht habe:

fsutil dirty query %systemdrive% >nul

En fsutil dirty erfordert zur Ausführung Administratorrechte und schlägt andernfalls fehl. %systemdrive% es un Umgebungsvariable der den Laufwerksbuchstaben zurückgibt, auf dem das Betriebssystem installiert ist. Die Ausgabe wird umgeleitet nach nul und wird daher ignoriert. Die %errorlevel% wird die Variable auf 0 nur bei erfolgreicher Ausführung.

Das steht in der Dokumentation:

Fsutil schmutzig

Fragt das Dirty Bit eines Datenträgers ab oder setzt es. Wenn das Dirty Bit eines Datenträgers gesetzt ist, autochk prüft das Volume beim nächsten Neustart des Computers automatisch auf Fehler.

Syntax

fsutil dirty {query | set} <VolumePath>

Parameter

query           Queries the specified volume's dirty bit.
set             Sets the specified volume's dirty bit.
<VolumePath>    Specifies the drive name followed by a colon or GUID.

Bemerkungen

Das Dirty Bit eines Datenträgers zeigt an, dass sich das Dateisystem möglicherweise in einem inkonsistenten Zustand befindet. Das Dirty Bit kann gesetzt werden, weil:

  • Der Band ist online, und es gibt noch Änderungen.
  • Es wurden Änderungen am Volume vorgenommen und der Computer wurde heruntergefahren, bevor die Änderungen auf dem Datenträger gespeichert wurden.
  • Auf dem Datenträger wurde eine Beschädigung festgestellt.

Wenn das Dirty Bit beim Neustart des Computers gesetzt ist, chkdsk läuft, um die Integrität des Dateisystems zu überprüfen und zu versuchen, etwaige Probleme mit dem Volume zu beheben.

Beispiele

Um das Dirty Bit auf Laufwerk C abzufragen, geben Sie ein:

fsutil dirty query C:

Weitere Forschung

Während die oben beschriebene Lösung ab Windows XP funktioniert, ist es wichtig hinzuzufügen, dass Windows 2000 und Windows PE (Preinstalled Environment) nicht mit fsutil.exe also müssen wir auf etwas anderes zurückgreifen.

Bei meinen früheren Tests habe ich festgestellt, dass die Ausführung der sfc Befehl ohne Parameter würde entweder zu:

  • eine Fehlermeldung, wenn Sie nicht genügend Berechtigungen haben;
  • eine Liste der verfügbaren Parameter und ihrer Verwendung.

Das heißt: keine Parameter, keine Partei . Die Idee ist, dass wir die Ausgabe parsen und prüfen können, ob wir etwas anderes als einen Fehler erhalten haben:

sfc 2>&1 | find /i "/SCANNOW" >nul

Die Fehlerausgabe wird zunächst auf die Standardausgabe umgeleitet, die dann an den find Befehl. An diesem Punkt müssen wir nach dem nur Parameter, der unterstützt in allen Windows-Versionen seit Windows 2000: /SCANNOW . Bei der Suche wird die Groß- und Kleinschreibung nicht berücksichtigt, und die Ausgabe wird verworfen, indem sie an nul .

Hier ist ein Auszug aus der Dokumentation:

Sfc

Scannt und prüft die Integrität aller geschützten Systemdateien und ersetzt fehlerhafte Versionen durch korrekte Versionen.

Bemerkungen

Sie müssen als Mitglied der Gruppe "Administratoren" angemeldet sein, um das Programm sfc.exe .

Verwendungsbeispiele

Hier sind einige Beispiele für das Einfügen und Ausführen:

Windows XP und höher

@echo off

call :isAdmin
if %errorlevel% == 0 (
echo Running with admin rights.
) else (
echo Error: Access denied.
)

pause >nul
exit /b

:isAdmin
fsutil dirty query %systemdrive% >nul
exit /b

Windows 2000 / Windows PE

@echo off

call :isAdmin
if %errorlevel% == 0 (
echo Running with admin rights.
) else (
echo Error: Access denied.
)

pause >nul
exit /b

:isAdmin
sfc 2>&1 | find /i "/SCANNOW" >nul
exit /b

Gilt für

  • Windows 2000

  • Windows XP

  • Windows Vista

  • Windows 7

  • Windows 8

  • Windows 8.1
    ---

  • Windows PE

23voto

npocmaka Punkte 52753

Zwei weitere Möglichkeiten - schnell und rückwärtskompatibel .

fltmc >nul 2>&1 && (
  echo has admin permissions
) || (
  echo has NOT admin permissions
)

fltmc Befehl ist auf jedem Windows-System seit XP verfügbar, so dass dies ziemlich portabel sein sollte.


Eine weitere wirklich schnelle Lösung, getestet an XP , 8.1 , 7 - es gibt eine bestimmte Variable =:: die nur angezeigt wird, wenn die Konsolensitzung keine Admin-Rechte hat, da es nicht so einfach ist, eine Variable zu erstellen, die = ist dem Namen nach ein relativ zuverlässiger Weg, um die Admin-Berechtigung zu prüfen (es ruft keine externen Programme auf, so dass es gut funktioniert)

setlocal enableDelayedExpansion
set "dv==::"
if defined !dv! ( 
   echo has NOT admin permissions
) else (
   echo has admin permissions
)

Wenn Sie dies direkt über die Befehlszeile, aber nicht über eine Batch-Datei verwenden möchten, können Sie dies tun:

set ^"|find "::"||echo has admin permissions

20voto

Lucretius Punkte 181

Alternative Lösung:

@echo off
pushd %SystemRoot%
openfiles.exe 1>nul 2>&1
if not %errorlevel% equ 0 (
    Echo here you are not administrator!
) else (
    Echo here you are administrator!
)
popd
Pause

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X