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.

17voto

Anders Punkte 89514
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"&&(
 echo admin...
)

16voto

Vitim.us Punkte 18320

Ich habe zwei Möglichkeiten, den privilegierten Zugriff zu überprüfen. Beide sind sehr zuverlässig und für fast alle Windows-Versionen geeignet.

1. Verfahren

set guid=%random%%random%-%random%-%random%-%random%-%random%%random%%random%

mkdir %WINDIR%\%guid%>nul 2>&1
rmdir %WINDIR%\%guid%>nul 2>&1

IF %ERRORLEVEL%==0 (
    ECHO PRIVILEGED!
) ELSE (
    ECHO NOT PRIVILEGED!
)

Dies ist aufgrund seiner Einfachheit eine der zuverlässigsten Methoden, und es ist sehr unwahrscheinlich, dass sich das Verhalten dieses sehr primitiven Befehls ändert. Das ist nicht der Fall bei anderen eingebauten CLI-Tools wie Netzsitzung die durch Verwaltungs-/Netzwerkrichtlinien deaktiviert werden können, oder Befehle wie fsutils die die Ausgabe unter Windows 10 verändert hat.

* Funktioniert unter XP und höher

2. Verfahren

REG ADD HKLM /F>nul 2>&1

IF %ERRORLEVEL%==0 (
    ECHO PRIVILEGED!
) ELSE (
    ECHO NOT PRIVILEGED!
)

Manchmal möchte man die Benutzerplatte nicht anfassen, selbst wenn es so harmlos ist wie die Verwendung von fsutils oder c es nicht nachweisbar, aber es kann zu einem katastrophalen Fehler führen, wenn etwas schief geht. In diesem Szenario können Sie einfach die Registry auf Berechtigungen überprüfen.

Dazu können Sie versuchen, einen Schlüssel zu erstellen auf HKEY_LOCAL_MACHINE Bei Verwendung der Standardberechtigungen erhalten Sie Zugang verweigert und die ERRORLEVEL == 1 aber wenn Sie als Administrator ausgeführt werden, wird Folgendes gedruckt "Befehl erfolgreich ausgeführt" y ERRORLEVEL == 0 . Da der Schlüssel bereits existiert, hat er keine Auswirkungen auf die Registrierung. Dies ist wahrscheinlich der schnellste Weg, und die REG ist für eine lange Zeit da.

* Es ist nicht verfügbar auf vor NT (Win 9X).

* Funktioniert unter XP und höher


Arbeitsbeispiel

Ein Skript, das den Temp-Ordner löscht

@echo off
:main
    echo.
    echo. Clear Temp Files script
    echo.

    call :requirePrivilegies

    rem Do something that require privilegies

    echo. 
    del %temp%\*.*
    echo. End!

    pause>nul
goto :eof

:requirePrivilegies
    set guid=%random%%random%-%random%-%random%-%random%-%random%%random%%random%
    mkdir %WINDIR%\%guid%>nul 2>&1
    rmdir %WINDIR%\%guid%>nul 2>&1
    IF NOT %ERRORLEVEL%==0 (
        echo ########## ERROR: ADMINISTRATOR PRIVILEGES REQUIRED ###########
        echo # This script must be run as administrator to work properly!  #
        echo # Right click on the script and select "Run As Administrator" #
        echo ###############################################################
        pause>nul
        exit
    )
goto :eof

13voto

Philm Punkte 3139

Nicht nur prüfen, sondern automatisch Admin-Rechte ERHALTEN
aka Automatische UAC für Win 7/8/8.1 ff.
: Das folgende ist ein wirklich cooles Gerät mit einer weiteren Funktion: Dieses Batch-Snippet prüft nicht nur auf Admin-Rechte, sondern holt sie sich automatisch! (und testet vorher, ob es auf einem UAC-fähigen Betriebssystem läuft).

Mit diesem Trick brauchen Sie nicht mehr mit der rechten Maustaste auf Ihre Batch-Datei "mit Administratorrechten" zu klicken. Wenn Sie vergessen haben, die Datei mit erweiterten Rechten zu starten, wird automatisch die UAC aktiviert! Außerdem wird zunächst getestet, ob das Betriebssystem UAC benötigt/bereitstellt, so dass es sich z.B. für Win 2000/XP bis Win 8.1- getestet korrekt verhält.

@echo off
REM Quick test for Windows generation: UAC aware or not ; all OS before NT4 ignored for simplicity
SET NewOSWith_UAC=YES
VER | FINDSTR /IL "5." > NUL
IF %ERRORLEVEL% == 0 SET NewOSWith_UAC=NO
VER | FINDSTR /IL "4." > NUL
IF %ERRORLEVEL% == 0 SET NewOSWith_UAC=NO

REM Test if Admin
CALL NET SESSION >nul 2>&1
IF NOT %ERRORLEVEL% == 0 (

    if /i "%NewOSWith_UAC%"=="YES" (
        rem Start batch again with UAC
        echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
        echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
        "%temp%\getadmin.vbs"
        del "%temp%\getadmin.vbs"
        exit /B
    )

    rem Program will now start again automatically with admin rights! 
    rem pause
    goto :eof
)

Das Snippet vereint einige gute Batch-Muster, insbesondere (1) den Admin-Test in diesem Thread von Ben Hooper und (2) die UAC-Aktivierung, die auf BatchGotAdmin gelesen und auf der Batch-Seite von robvanderwoude zitiert wurde (Respekt). (3) Für die OS-Identifikation durch "VER | FINDSTR-Muster" finde ich einfach keine Referenz).

(In Bezug auf einige sehr kleine Einschränkungen, wenn "NET SESSION" nicht funktioniert, wie in einer anderen Antwort erwähnt - fühlen Sie sich frei, einen anderen dieser Befehle einzufügen. Für mich sind das Ausführen im abgesicherten Modus von Windows oder das Herunterfahren spezieller Standarddienste und dergleichen keine wichtigen Anwendungsfälle - für einige Administratoren vielleicht schon).

9voto

Matt Punkte 23047

Im Batch-Skript Erhöhen.cmd (véase dieser Link ), die ich an folgende Adresse geschrieben habe Admin-Rechte erhalten Ich habe es auf folgende Weise gemacht:

@echo off

:checkPrivileges
  NET FILE 1>NUL 2>NUL
  if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges )

und der Rest des Skripts könnte wie folgt aussehen:

:getPrivileges
  rem need to get admin rights, check batch script Elevate.cmd to see how to do that
  echo You have no admin rights. Cannot continue.
  goto end

:gotPrivileges
  echo You have admin rights. Continuing...
  rem *** do your admin tasks here ***

:end
  pause

Dies ist getestet für Windows 7, 8, 8.1, 10 und sogar Windows XP und benötigt keine Ressourcen wie ein spezielles Verzeichnis, eine Datei oder einen Registrierungsschlüssel.

Sie nutzt die Tatsache, dass der Befehl NET FILE benötigt zur Ausführung Administratorrechte und gibt bei erfolgreicher Ausführung (und erkannten Administratorrechten) die Fehlerstufe 0 zurück, andernfalls eine Fehlerstufe > 0. Alle Meldungen werden durch 1>NUL 2>NULL .

Der Vorteil NET FILE ist, dass es nichts am System ändert, um Admin-Rechte zu erkennen (wie andere Lösungen, die versuchen, Admin-Rechte auszuloten, indem sie Registrierungsschlüssel oder Dateien/Verzeichnisse in geschützten Bereichen erstellen).

7voto

William Punkte 658

Der sauberste Weg, um mit einem CMD-Skript nach Admin-Rechten zu suchen, den ich gefunden habe, ist etwa so:

@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 CMD.exe-Builtins, sollte also sehr schnell sein. Sie prüft auch die tatsächlichen Fähigkeiten des Prozesses, anstatt nach SIDs oder Gruppenmitgliedschaften zu suchen, so dass die wirksam Erlaubnis getestet wird. Und das funktioniert schon bei Windows 2003 und XP. Normale Benutzerprozesse oder Prozesse ohne Berechtigungen schlagen bei der Verzeichnisprüfung fehl, während Admin-Prozesse oder Prozesse mit Berechtigungen erfolgreich sind.

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