web-dev-qa-db-de.com

Batch-Skript: So überprüfen Sie, ob Administratorrechte vorhanden sind

Wie überprüfe ich, ob das aktuelle Stapelskript Administratorrechte hat?

Ich weiß, wie man sich selbst mit Runas aufruft, aber nicht, wie man nach Administratorrechten sucht. Die einzigen Lösungen, die ich gesehen habe, sind rohe Hack-Jobs oder die Verwendung externer Programme. Nun, eigentlich ist es mir egal, ob es ein Hackjob ist, solange er unter Windows XP und neuer funktioniert.

256
flacs

Probleme

blak3r / Rushyo 's Lösung funktioniert einwandfrei für alles außer Windows 8. Das 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 Screenshot 1) und gibt %errorLevel%1.

Forschung

Also habe ich nach anderen Befehlen gesucht, für die erhöhte Berechtigungen erforderlich sind. rationallyparanoid.com hatte eine Liste von ein paar, also habe ich jeden Befehl auf den beiden entgegengesetzten Extremen aktueller Windows-Betriebssysteme (XP und 8) ausgeführt, in der Hoffnung, einen Befehl zu finden, dem der Zugriff auf beide verweigert würde Betriebssysteme, die mit Standardberechtigungen ausgeführt werden.

Irgendwann habe ich einen gefunden - NET SESSION. A true, saubere, universelle Lösung, die Folgendes nicht beinhaltet:

  • die Erstellung von oder die Interaktion mit Daten an sicheren Orten
  • analysieren von Daten, die von FOR Schleifen zurückgegeben wurden
  • suchstrings für "Administrator"
  • mit AT (Windows 8 inkompatibel) oder WHOAMI (Windows XP inkompatibel)).

Jedes davon hat seine eigenen Sicherheits-, Benutzerfreundlichkeits- und Portabilitätsprobleme.

Testen

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

(siehe Screenshot 2)

Implementierung/Verwendung

Um diese Lösung zu verwenden, 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

Verfügbar hier, wenn Sie faul sind: https://dl.dropbox.com/u/27573003/Distribution/Binaries/check_Permissions.bat

Erläuterung

NET SESSION ist ein Standardbefehl für "Serververbindungen verwalten. Wird dieser Befehl ohne Parameter verwendet, werden Informationen zu allen Sitzungen mit dem lokalen Computer angezeigt."

Also, hier ist der grundlegende Prozess meiner gegebenen Implementierung:

  1. @echo off
    • Deaktivieren Sie die Anzeige von Befehlen
  2. goto check_Permissions
    • Springe zum :check_Permissions Codeblock
  3. net session >nul 2>&1
    • Führen Sie den Befehl aus
    • Visuelle Ausgabe des Befehls durch Verbergen
      1. Umleiten des Standardausgabestreams (numerisches Handle 1/STDOUT) nach nul
      2. Umleiten des Standardfehlerausgabestreams (numerisches Handle 2/STDERR) an dasselbe Ziel wie numerisches Handle 1
  4. if %errorLevel% == 0
    • Wenn der Wert des Exit-Codes (%errorLevel%) ist 0 dann bedeutet dies, dass keine Fehler aufgetreten sind und daher der unmittelbar vorhergehende Befehl erfolgreich ausgeführt wurde
  5. else
    • Wenn der Wert des Exit-Codes (%errorLevel%) ist nicht 0 dann bedeutet dies, dass Fehler aufgetreten sind und daher der unmittelbar vorhergehende Befehl erfolglos ausgeführt wurde
  6. Der Code in der jeweiligen Klammer wird abhängig davon ausgeführt, welches Kriterium erfüllt ist

Screenshots

Windows 8 AT%errorLevel% :

[imgur]

NET SESSION unter Windows XP x86 - Windows 8 x64 :

[imgur]

Vielen Dank, @ Tilka, dass Sie Ihre akzeptierte Antwort auf meine geändert haben. :)

431
mythofechelon

Die Anders-Lösung hat bei mir funktioniert, aber ich war mir nicht sicher, wie ich sie invertieren sollte, um das Gegenteil zu erreichen (als Sie kein Administrator waren).

Hier ist meine Lösung. Es gibt zwei Fälle, einen IF- und einen ELSE-Fall, und einige Ascii-Kunst, um sicherzustellen, dass die Leute ihn tatsächlich lesen. :)

Minimale Version

Rushyo hat diese Lösung hier gepostet: Wie erkennt man, ob CMD als Administrator ausgeführt wird/über erhöhte Berechtigungen verfügt?

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

Version, die Fehlermeldungen, Pausen und Exits 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.08.2012 Aktualisiert, um Windows 8 zu unterstützen. @BenHooper wies in seiner Antwort unten darauf hin. Bitte stimmen Sie seiner Antwort zu.

75
blak3r

Weitere Probleme

Wenn Sie versuchen, den Befehl net session Auszuführen, während der Serverdienst beendet ist, wird folgende Fehlermeldung Ihnen angezeigt, wie @Lectrode darauf hinweist:

The Server service is not started.

More help is available by typing NET HELPMSG 2114

In diesem Fall wird die Variable %errorLevel% Auf 2 Gesetzt.

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 ausgeführt werden XP und höher (32 und 64 Bit);
  • berührt weder die Registrierung noch eine Systemdatei oder einen Systemordner.
  • funktioniert unabhängig vom Gebietsschema des Systems;
  • liefert auch im abgesicherten Modus korrekte Ergebnisse.

Also habe ich eine Vanilla Windows XP= virtuelle Maschine gestartet und angefangen, die Liste der Anwendungen im Ordner C:\Windows\System32 Zu durchsuchen, um einige Ideen zu erhalten. Nach Versuchen und Fehlern ist dies der dirty (Wortspiel beabsichtigt) Ansatz, den ich mir ausgedacht habe:

fsutil dirty query %systemdrive% >nul

Der Befehl fsutil dirty Erfordert Administratorrechte und schlägt ansonsten fehl. %systemdrive% Ist eine - Umgebungsvariable , die den Laufwerksbuchstaben zurückgibt, auf dem das Betriebssystem installiert ist. Die Ausgabe wird nach nul umgeleitet und somit ignoriert. Die Variable %errorlevel% Wird nur bei erfolgreicher Ausführung auf 0 Gesetzt.

Folgendes steht in der Dokumentation:

Fsutil dirty

Fragt das Dirty-Bit eines Volumes ab oder legt es fest. Wenn das Dirty-Bit eines Volumes gesetzt ist, überprüft autochk das Volume automatisch auf Fehler, wenn der Computer das nächste Mal neu gestartet wird.

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 Volumes 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 hat ausstehende Änderungen.
  • Am Volume wurden Änderungen vorgenommen, und der Computer wurde heruntergefahren, bevor die Änderungen auf die Festplatte übertragen wurden.
  • Auf dem Volume wurde eine Beschädigung festgestellt.

Wenn das Dirty-Bit beim Neustart des Computers gesetzt ist, wird chkdsk ausgeführt, um die Integrität des Dateisystems zu überprüfen und Probleme mit dem Volume zu beheben.

Beispiele

Geben Sie Folgendes ein, um das fehlerhafte Bit auf Laufwerk C abzufragen:

fsutil dirty query C:

Weitere Nachforschungen

Die obige Lösung funktioniert zwar ab Windows XP), es lohnt sich jedoch hinzuzufügen, dass Windows 2000 und Windows PE (vorinstallierte Umgebung) nicht mit fsutil.exe Geliefert werden etwas anderes.

Bei meinen vorherigen Tests habe ich festgestellt, dass das Ausführen des Befehls sfc ohne Parameter entweder zu folgenden Ergebnissen führt:

  • ein Fehler, wenn Sie nicht genügend Berechtigungen hatten;
  • eine Liste der verfügbaren Parameter und deren Verwendung.

Das heißt: keine Parameter, keine Party. Die Idee ist, dass wir die Ausgabe analysieren und prüfen können, ob etwas anderes als ein Fehler vorliegt:

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

Die Fehlerausgabe wird zuerst an die Standardausgabe umgeleitet, die dann an den Befehl find weitergeleitet wird. An dieser Stelle müssen wir nach dem only -Parameter suchen, 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 umgeleitet wird.

Hier ist ein Auszug aus der Dokumentation:

Sfc

Überprüft und verifiziert die Integrität aller geschützten Systemdateien und ersetzt falsche Versionen durch korrekte Versionen.

Bemerkungen

Sie müssen als Mitglied der Gruppe Administratoren angemeldet sein, um sfc.exe ausführen zu können.

Beispielnutzung

Hier einige Beispiele zum 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
37
and31415

noch ein weg

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

Der Befehl fltmc ist auf jedem Windows-System verfügbar, seit XP). Dies sollte also ziemlich portabel sein.


Eine weitere auf XP, 8.1, 7 Getestete Lösung (funktioniert leider nicht auf allen win10 Maschinen - siehe die Kommentare.) - es gibt eine bestimmte Variable =:: Wird nur angezeigt, wenn die Konsolensitzung keine Administratorrechte hat. Da es nicht so einfach ist, eine Variable zu erstellen, deren Name = Enthält, können Sie auf vergleichsweise zuverlässige Weise nach Administratorrechten suchen ( und ziemlich schnell, da es keine externen ausführbaren Dateien aufruft)

setlocal enableDelayedExpansion
set "dv==::"
if defined !dv! ( 
   echo has NOT admin permissions
) else (
   echo has admin permissions
)
17
npocmaka
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"&&(
 echo admin...
)
17
Anders

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
14
Lucretius

Nicht nur prüfen, sondern Adminrechte automatisch ERHALTEN
aka Automatic UAC for Win 7/8/8.1 ff.
: Das Folgende ist ein wirklich cooles Feature: Dieses Batch-Snippet prüft nicht nur auf Administratorrechte, sondern ruft diese automatisch ab! (und testet vorher, ob auf einem UAC-fähigen Betriebssystem gelebt wird.)

Mit diesem Trick brauchen Sie nicht länger mit der rechten Maustaste auf Ihre Batch-Datei "mit Administratorrechten" zu klicken. Wenn Sie vergessen haben, es mit erhöhten Rechten zu starten, wird die Benutzerkontensteuerung automatisch gestartet! Außerdem wird zuerst getestet, ob das Betriebssystem eine Benutzerkontensteuerung benötigt/bereitstellt, damit es sich korrekt verhält, z. für Win 2000/XP bis Win 8.1- getestet.

@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 führt einige gute Stapelmuster zusammen, insbesondere (1) den Admin-Test in diesem Thread von Ben Hooper und (2) die auf BatchGotAdmin gelesene und von robvanderwoude (respect) auf der Stapelseite zitierte UAC-Aktivierung. (3) Für die Betriebssystemidentifikation durch "VER | FINDSTR-Muster" finde ich den Verweis einfach nicht.)

(In Bezug auf einige sehr geringfügige Einschränkungen, wenn "NET SESSION" nicht wie in einer anderen Antwort angegeben funktioniert, können Sie einen anderen dieser Befehle einfügen. Für mich ist das Ausführen im abgesicherten Windows-Modus oder bei bestimmten Standarddiensten kein wichtiger Anwendungsfall.) - für manche Admins vielleicht doch.)

13
Philm

Ich habe zwei Möglichkeiten, um nach privilegierten Zugriffen zu suchen. Beide sind ziemlich zuverlässig und in fast jeder Windows-Version sehr portabel.

1. Methode

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. Dies ist nicht der Fall bei anderen integrierten CLI-Tools wie net session, die durch Administrator-/Netzwerkrichtlinien deaktiviert werden können, oder bei Befehlen wie fsutils, die die Ausgabe unter Windows 10 geändert haben .

* Funktioniert mit XP und höher

2. Methode

REG ADD HKLM /F>nul 2>&1

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

Manchmal gefällt Ihnen die Idee, die Benutzerfestplatte nicht zu berühren, auch wenn sie so harmlos ist wie die Verwendung von fsutils oder das Erstellen eines leeren Ordners. Sie ist nicht beweisbar, kann aber zu einem katastrophalen Fehler führen, wenn etwas schief geht. In diesem Szenario können Sie nur die Registrierung auf Berechtigungen überprüfen.

Dazu können Sie versuchen, einen Schlüssel auf HKEY_LOCAL_MACHINE zu erstellen, indem Sie die Standardberechtigungen verwenden, die Sie erhalten Zugriff verweigert und das ERRORLEVEL == 1, aber wenn Sie als Admin ausgeführt werden, wird "Befehl erfolgreich ausgeführt" und ERRORLEVEL == 0. Da der Schlüssel bereits vorhanden ist, hat er keine Auswirkungen auf die Registrierung. Dies ist wahrscheinlich der schnellste Weg und die REG ist schon lange da.

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

* Funktioniert mit XP und höher


Arbeitsbeispiel

Ein Skript, das den temporären 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
11
Vitim.us

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 Berechtigung effektiv 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.

6
William

Der folgende Befehl versucht, eine Datei im Windows-Verzeichnis zu erstellen. Wenn es erfolgreich ist, wird es entfernt.

copy /b/y NUL %WINDIR%\06CF2EB6-94E6-4a60-91D8-AB945AE8CF38 >NUL 2>&1
if errorlevel 1 goto:nonadmin
del %WINDIR%\06CF2EB6-94E6-4a60-91D8-AB945AE8CF38 >NUL 2>&1
:admin
rem here you are administrator
goto:eof
:nonadmin
rem here you are not administrator
goto:eof

Beachten Sie, dass 06CF2EB6-94E6-4a60-91D8-AB945AE8CF38 eine GUID= ist, die heute generiert wurde, und angenommen wird, dass ein Konflikt mit einem vorhandenen Dateinamen unwahrscheinlich ist.

5
Benoit

Im Batch-Skript Elevate.cmd (siehe diesen Link ), an den ich geschrieben habe , um Administratorrechte zu erhalten , habe ich es folgendermaßen gemacht:

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

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

5
Matt

Die whoami/Gruppen funktionieren in einem Fall nicht. Wenn Sie die Benutzerkontensteuerung vollständig deaktiviert haben (nicht nur die Benachrichtigung deaktiviert), haben Sie und über eine Administrator-Eingabeaufforderung gestartet und dann Folgendes ausgegeben:

runas /trustlevel:0x20000 cmd

sie werden nicht mit erhöhten Rechten ausgeführt, geben jedoch Folgendes aus:

whoami /groups

ich werde sagen, dass du erhöht bist. Es ist falsch. Hier ist, warum es falsch ist:

Wenn IsUserAdmin ( https://msdn.Microsoft.com/en-us/library/windows/desktop/aa376389 (v = vs.85) .aspx ) in diesem Status ausgeführt wird, werden FALSE und zurückgegeben Die Benutzerkontensteuerung ist vollständig deaktiviert und GetTokenInformation gibt TokenElevationTypeDefault ( http://blogs.msdn.com/b/cjacks/archive/2006/10/24/modifying-the-mandatory-integrity-level-for-a- zurück. securable-object-in-windows-Vista.aspx ) dann läuft der Prozess nicht erhöht, sondern whoami /groups behauptet es ist.

der beste Weg, dies aus einer Batch-Datei heraus zu tun, ist:

net session >nul 2>nul
net session >nul 2>nul
echo %errorlevel%

Du solltest tun net session zweimal, denn wenn jemand zuvor ein at gemacht hat, erhalten Sie die falschen Informationen.

4
zumalifeguard

Einige Server deaktivieren Dienste, die für den Befehl "net session" erforderlich sind. Dies hat zur Folge, dass die Administratorprüfung immer besagt, dass Sie möglicherweise keine Administratorrechte haben.

2
Dan

Edit: copyitright hat darauf hingewiesen, dass dies unzuverlässig ist. Durch das Genehmigen des Lesezugriffs mit der Benutzerkontensteuerung wird dir der Erfolg ermöglicht. Ich habe ein bisschen mehr Skript, um eine andere Möglichkeit anzubieten, aber es ist nicht schreibgeschützt.

reg query "HKLM\SOFTWARE\Foo" >NUL 2>NUL && goto :error_key_exists
reg add "HKLM\SOFTWARE\Foo" /f >NUL 2>NUL || goto :error_not_admin
reg delete "HKLM\SOFTWARE\Foo" /f >NUL 2>NUL || goto :error_failed_delete
goto :success

:error_failed_delete
  echo Error unable to delete test key
  exit /b 3
:error_key_exists
  echo Error test key exists
  exit /b 2
:error_not_admin
  echo Not admin
  exit /b 1
:success
  echo Am admin

Alte Antwort unten

Warnung: unzuverlässig


Aufgrund einer Reihe anderer guter Antworten und der von and31415 vorgebrachten Punkte habe ich festgestellt, dass ich ein Fan von Folgendem bin:

dir "%SystemRoot%\System32\config\DRIVERS" 2>nul >nul || echo Not Admin

Wenige Abhängigkeiten und schnell.

2
Tyler Szabo
whoami /groups | find "S-1-16-12288" > nul
if not errorlevel 1 (
  echo ...  connected as admin
)
2
Totonga

PowerShell jemand?

param (
    [string]$Role = "Administrators"
)

#check for local role

$identity  = New-Object Security.Principal.WindowsIdentity($env:UserName)
$principal = New-Object Security.Principal.WindowsPrincipal($identity)

Write-Host "IsInRole('$Role'): " $principal.IsInRole($Role)

#enumerate AD roles and lookup

$groups = $identity::GetCurrent().Groups
foreach ($group in $groups) {
    $trans = $group.Translate([Security.Principal.NTAccount]);
    if ($trans.Value -eq $Role) {
       Write-Host "User is in '$Role' role"
    }
}
1
Ostati

Hinweis: Wenn Sie mit cacls nach\system32\config\system suchen, schlägt WOW64 IMMER fehl (z. B.% systemroot%\syswow64\cmd.exe/32-Bit-Total Commander), sodass Skripts, die in der 32-Bit-Shell im 64-Bit-System ausgeführt werden, für immer wiederholt werden ... Besser wäre es, nach Rechten im Prefetch-Verzeichnis zu suchen:

>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\Prefetch\"

Win XP bis 7 getestet, jedoch scheitert es in WinPE wie in Windows 7 install.wim gibt es weder ein solches Verzeichnis noch cacls.exe

Auch in winPE UND wow64 schlägt die Prüfung mit openfiles.exe fehl:

OPENFILES > nul

In Windows 7 wird es mit "1" mit der Information, dass "Zielsystem 32-Bit-Betriebssystem sein muss" errorlevel

Beide Prüfungen schlagen wahrscheinlich auch in der Wiederherstellungskonsole fehl.

Was funktioniert in Windows XP - 8 32/64 Bit, in WOW64 und in WinPE sind: Verzeichniserstellungstests (WENN der Administrator das Windows-Verzeichnis nicht mit Berechtigungen bombardiert hat) für alle ...) und

net session

und

reg add HKLM /F

prüft.

Ein weiterer Hinweis in einigen Fenstern XP (und wahrscheinlich auch in anderen Versionen, abhängig von den Einstellungen des Administrators), der von den Registrierungseinträgen abhängt, die direkt bat/cmd aus dem .vbs-Skript aufrufen, schlägt mit den Informationen bat/cmd fehl Dateien sind mit nichts verbunden ...

echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
cscript "%temp%\getadmin.vbs" //nologo

Das Aufrufen von cmd.exe mit dem Parameter bat/cmd file funktioniert dagegen OK:

echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "cmd.exe", "/C %~s0", "", "runas", 1 >> "%temp%\getadmin.vbs"
cscript "%temp%\getadmin.vbs" //nologo
1
user2902818

Buchstäblich Dutzende Antworten auf diese und verknüpfte Fragen sowie auf andere Fragen bei SE, die alle auf die eine oder andere Weise unzureichend sind, haben eindeutig gezeigt, dass Windows kein zuverlässiges integriertes Konsolendienstprogramm bietet. Also ist es Zeit, Ihre eigenen auszurollen.

Der folgende C-Code basiert auf Ermitteln, ob das Programm mit vollständigen Administratorrechten ausgeführt wird und funktioniert in Win2k +1, überall und in allen Fällen (UAC, Domänen, transitiven Gruppen ...) - weil es das gleiche wie das System selbst tut, wenn es Berechtigungen prüft. Es signalisiert das Ergebnis sowohl mit einer Meldung (die mit einem Schalter stumm geschaltet werden kann) als auch mit einem Beendigungscode.

Es muss nur einmal kompiliert werden, dann können Sie einfach den .exe Überall kopieren - es hängt nur von kernel32.dll Und advapi32.dll Ab (Ich habe eine Kopie hochgeladen) ).

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

1MSDN behauptet, dass es sich bei den APIs um XP + handelt, dies ist jedoch falsch. CheckTokenMembershipist 2k + und der andere ist noch älter . Der letzte Link enthält auch eine viel kompliziertere Methode, die auch unter NT funktionieren würde.

1
ivan_pozdeev

Hier ist noch eine, die du der Liste hinzufügen kannst ;-)

(versuche eine Dateierstellung im Systemverzeichnis

CD.>"%SystemRoot%\System32\Drivers\etc\_"
MODE CON COLS=80 LINES=25

IF EXIST "%SystemRoot%\System32\Drivers\etc\_" (

  DEL "%SystemRoot%\System32\Drivers\etc\_"

  ECHO Has Admin privileges

) ELSE (

  ECHO No Admin privileges

)

Das MODE CON initialisiert den Bildschirm neu und unterdrückt alle Texte/Fehler, wenn keine Schreibberechtigung für den Systemspeicherort vorliegt.

1
script'n'code

Ich denke, der einfachste Weg ist, das Systemdatum zu ändern (das erfordert Administratorrechte):

date %date%
if errorlevel 1 (
   echo You have NOT admin rights
) else (
   echo You have admin rights
)

Wenn %date% Variable kann den Wochentag enthalten, holen Sie sich einfach das Datum aus dem letzten Teil des DATE Befehls:

for /F "delims=" %%a in ('date ^<NUL') do set "today=%%a" & goto break
:break
for %%a in (%today%) do set "today=%%a"
date %today%
if errorlevel 1 ...
0
Aacini
@echo off
ver
set ADMDIR=C:\Users\Administrator
dir %ADMDIR% 1>nul 2>&1
echo [%errorlevel%] %ADMDIR%
if "%errorlevel%"=="0" goto main
:: further checks e.g. try to list the contents of admin folders
:: wherever they are stored on older versions of Windows
echo You need administrator privileges to run this script: %0
echo Exiting...
exit /b

:main
echo Executing with Administrator privileges...
0
cmd

Net User %username% >nul 2>&1 && echo admin || echo not admin

0
heretic
@echo off
:start
set randname=%random%%random%%random%%random%%random%
md \windows\%randname% 2>nul
if %errorlevel%==0 (echo You're elevated!!!
goto end)
if %errorlevel%==1 (echo You're not elevated :(:(
goto end)
goto start
:end
rd \windows\%randname% 2>nul
pause >nul

Ich werde den Code Zeile für Zeile erklären:

@echo off

Benutzer werden mit viel mehr als 1 Zeilen ohne dies verärgert sein.

:start

Punkt, an dem das Programm beginnt.

set randname=%random%%random%%random%%random%%random%

Legen Sie den Dateinamen des zu erstellenden Verzeichnisses fest.

md \windows\%randname% 2>nul

Erstellt das Verzeichnis auf <DL>:\Windows (ersetzen Sie <DL> durch Laufwerksbuchstaben).

if %errorlevel%==0 (echo You're elevated!!!
goto end)

Wenn die Umgebungsvariable ERRORLEVEL Null ist, wird eine Erfolgsmeldung ausgegeben.
Gehen Sie bis zum Ende (fahren Sie nicht weiter fort).

if %errorlevel%==1 (echo You're not elevated :(:(
goto end)

Wenn ERRORLEVEL eins ist, wird eine Echo-Fehlermeldung ausgegeben und bis zum Ende weitergegangen.

goto start

Wenn der Dateiname bereits vorhanden ist, erstellen Sie den Ordner neu (andernfalls wird das Symbol goto end Kommando lässt das nicht laufen).

:end

Geben Sie den Endpunkt an

rd \windows\%randname% 2>nul

Entfernen Sie das erstellte Verzeichnis.

pause >nul

Pause, damit der Benutzer die Nachricht sehen kann.

Anmerkung: Das >nul und 2>nul filtern die Ausgabe dieser Befehle.

0
EKons

Alternative: Verwenden Sie ein externes Dienstprogramm, das für diesen Zweck entwickelt wurde, z. B. IsAdmin.exe (uneingeschränkte Freeware).

Ausgangscodes:

0 - Aktueller Benutzer, der nicht Mitglied der Administratorgruppe ist

1 - Aktueller Benutzer, Mitglied der Administratoren und mit erhöhten Rechten

2 - Aktueller Benutzer, Mitglied der Administratoren, jedoch nicht mit erhöhten Rechten

0
Bill_Stewart

Ich habe einen Benutzer gefunden, der net session Verwenden kann, obwohl er kein Administrator ist. Ich habe nicht nach dem Warum gesucht. Meine Problemumgehung besteht darin, zu testen, ob der Benutzer einen Ordner im Windows-Ordner erstellen kann.

Hier ist mein Code:

::::::: :testadmin function START :::::::
:: this function tests if current user is admin.  results are returned as "true" or "false" in %isadmin%
:: Test "%isadmin" after calling this function
:: Usage: "call :testadmin"
echo Your script entered the :testadmin function by error.  Usage: "call :testadmin"
pause
exit /b
:testadmin

 rd %windir%\local_admin_test > nul 2> nul
 md %windir%\local_admin_test > nul 2> nul
 if [%errorlevel%]==[0] set isadmin=true
 if not [%errorlevel%]==[0] set isadmin=false
 rd %windir%\local_admin_test > nul 2> nul

 if [%isadmin%]==[true] (
   echo User IS admin.
 )
 if not [%isadmin%]==[true] (
   echo User IS NOT admin.
   timeout 30
   :: or use "pause" instead of "timeout"
   exit /b
 )
exit /b
:::::: :testadmin function END ::::::
0
Grallen