Wie erkenne ich, ob CMD als Administrator ausgeführt wird / über erhöhte Berechtigungen verfügt?

101

In einer Batchdatei möchte ich testen, ob ich mit Administrator- / erhöhten Berechtigungen ausgeführt werde.

Der Benutzername ändert sich nicht, wenn "Als Administrator ausführen" ausgewählt ist, sodass dies nicht funktioniert.

Wenn es einen universell verfügbaren Befehl gäbe, der keine Auswirkung hat, aber Administratorrechte erfordert, könnte ich diesen ausführen und nach einem Fehlercode suchen, um auf Berechtigungen zu testen. Bisher habe ich einen solchen Befehl nicht gefunden. Die Befehle, die ich gefunden habe, scheinen einen einzelnen, unspezifischen Fehlercode zurückzugeben, der auf alles hinweisen kann, und sie sind aus verschiedenen Gründen fehleranfällig.

Ich interessiere mich nur für Windows 7, obwohl die Unterstützung früherer Betriebssysteme nett wäre.

Jeff
quelle
Ein Hack wäre, zu versuchen, echo > somefilein ein Verzeichnis zu gelangen, für das Administratorrechte erforderlich sind. Es würde eine Datei als Nebeneffekt erzeugen, aber Sie könnten nach Kollisionen suchen und einen eindeutigen Dateinamen als Problemumgehung erstellen.
Marc B
1
[Eine selbsthebende Charge finden Sie hier] [1] [1]: stackoverflow.com/questions/4051883/…
Amr Ali
1
@npocmaka die Frage, die Sie verlinkt haben, ist eigentlich das Duplikat dieser;) (2013 vs. 2011)
Matthieu

Antworten:

62

ADDENDUM : Für Windows 8 funktioniert dies nicht. sehen Sie stattdessen diese ausgezeichnete Antwort .


Diese Lösung finden Sie hier: http://www.robvanderwoude.com/clevertricks.php

AT > NUL
IF %ERRORLEVEL% EQU 0 (
    ECHO you are Administrator
) ELSE (
    ECHO you are NOT Administrator. Exiting...
    PING 127.0.0.1 > NUL 2>&1
    EXIT /B 1
)

Angenommen, das funktioniert nicht und da es sich um Win7 handelt, können Sie in Powershell Folgendes verwenden, wenn dies geeignet ist:

$principal = new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())
$principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)

Wenn nicht (und wahrscheinlich auch nicht, da Sie explizit Batch-Dateien vorgeschlagen haben), können Sie das oben Genannte in .NET schreiben und einen Exit-Code von einer Exe zurückgeben, der auf dem Ergebnis für Ihre Batch-Datei basiert.

Rushyo
quelle
4
Der AT-Befehl ist perfekt! Ihr Google-Fu ist meinem Google-Fu überlegen. ;-)
Jeff
2
+1 @Rushyo, ich habe Ihre Lösung ein wenig erweitert und hier veröffentlicht, da dies die ist, auf die ich ursprünglich gestoßen bin. Vielen Dank! stackoverflow.com/questions/4051883/…
blak3r
16
ATfunktioniert nicht unter Windows 8, aber ich habe eine bessere Lösung gefunden. Ich habe es als Antwort auf eine andere Frage hier gepostet : stackoverflow.com/questions/4051883/… .
Mythosofechelon
4
Ich empfehle whoami / groups | findstr / b BUILTIN \ Admin | findstr / c: "Aktivierte Gruppe" && echo "Ich habe einen Administrator!" - arbeite an 95, 98, 2000, xp, vista, 7, 8! (Aus dem Kommentar "Ich mag Rushyos Vorschlag, AT zu verwenden ...")
barwnikk
1
Ich mag pinges, fehlende zu ersetzen sleep:)
Matthieu
96

Dieser Trick erfordert nur einen Befehl: Geben Sie net sessionin die Eingabeaufforderung ein.

Wenn Sie KEIN Administrator sind , erhalten Sie eine Nachricht, dass der Zugriff verweigert wird.

System error 5 has occurred.

Access is denied.

Wenn Sie ein Administrator sind , erhalten Sie eine andere Nachricht. Die häufigste ist:

There are no entries in the list.

Von MS Technet :

Bei Verwendung ohne Parameter zeigt net session Informationen zu allen Sitzungen mit dem lokalen Computer an.

Ambrose Leung
quelle
Das ist funktional identisch mit Rushyos Antwort, die den AT-Befehl verwendet hat.
Jeff
12
Unter Windows 8.1 wird dies AT vorgezogen, da AT veraltet ist. Die Verwendung von Rushyos Antwort, aber das Ersetzen von AT durch net session oder net.exe session funktioniert perfekt für mich.
KayleeFrye_onDeck
Dies scheint der einfachste Weg zu sein, dies an der Eingabeaufforderung zu tun (was sich jedoch von der Batchdatei unterscheidet).
Enderland
2
There are no entries in the list.
Druckt
1
Verwenden Sie in einer Batch-Datei etwa net session >nul 2>&1 || (echo not admin&goto :eof)
Folgendes
27

Ich mag Rushyos Vorschlag, AT zu verwenden, aber dies ist eine andere Option:

whoami /groups | findstr /b BUILTIN\Administrators | findstr /c:"Enabled group" && goto :isadministrator

Mit diesem Ansatz können Sie auch zwischen einem Nicht-Administrator und einem nicht erhöhten Administrator unterscheiden, wenn Sie dies möchten. Nicht erhöhte Administratoren haben noch BUILTIN \ Administrators in der Gruppenliste, aber es ist nicht aktiviert.

Dies funktioniert jedoch nicht auf einigen nicht englischen Sprachsystemen. Versuchen Sie es stattdessen

whoami /groups | findstr /c:" S-1-5-32-544 " | findstr /c:" Enabled group" && goto :isadministrator

(Dies sollte unter Windows 7 funktionieren, bei früheren Versionen bin ich mir jedoch nicht sicher.)

Harry Johnston
quelle
1
In der polnischen Version habe ich: BUILTIN \ Administratorzy, daher empfehle ich: whoami / groups | findstr / b BUILTIN \ Admin | findstr / c: "Aktivierte Gruppe" && gehe zu: isadministrator
barwnikk
@barwnikk, ich empfehle whoami/groupsund scanne dann die Zeilen manuell. Würde nicht zu lange dauern und der Befehl passt in dein Gehirn.
Pacerier
@Pacerier: Der Punkt der Frage ist, die Höhe in einer Batch-Datei zu erkennen . Wenn sich eine Person in der Befehlszeile befindet, muss sie sich nur den Fenstertitel ansehen, der immer "Administrator:" startet, wenn Sie erhöht sind.
Harry Johnston
@ HarryJohnston, Wow hat das nicht bemerkt. Wird der Titel "Administrator" für alle Windows-Versionen angezeigt?
Pacerier
@ Pacerier: alle aktuellen Versionen (ab Vista).
Harry Johnston
24

Ziemlich genau das, was andere zuvor geschrieben haben, aber als Einzeiler, der am Anfang eines Stapelbefehls gesetzt werden kann. (Nun, normalerweise nach @echo aus.)

net.exe session 1>NUL 2>NUL || (Echo This script requires elevated rights. & Exit /b 1)
geek_01
quelle
2
Dies ist die aktuelle Version und es verbirgt die irrelevante Ausgabe von net.exe schön
andersand
2
Funktioniert gut unter Windows 10.
James Pack
Hat super funktioniert, habe nur das Ende auf & Timeout / t 10 & Exit / b 1) optimiert, damit das Fenster in einer Batch-Datei nicht sofort verschwindet.
WhoIsRich
12

Der einfachste Weg, dies unter Vista, Win 7 und höher zu tun, besteht darin, Token-Gruppen aufzulisten und nach der aktuellen Integritätsstufe zu suchen (oder nach der Seite des Administrators, wenn nur die Gruppenmitgliedschaft wichtig ist):

Überprüfen Sie, ob wir erhöht laufen:

whoami /groups | find "S-1-16-12288" && Echo I am running elevated, so I must be an admin anyway ;-)

Überprüfen Sie, ob wir zu lokalen Administratoren gehören:

whoami /groups | find "S-1-5-32-544" && Echo I am a local admin

Überprüfen Sie, ob wir zu Domain-Administratoren gehören:

whoami /groups | find "-512 " && Echo I am a domain admin

Der folgende Artikel listet die Integritätsstufe auf, die SIDs von Windows verwenden: http://msdn.microsoft.com/en-us/library/bb625963.aspx

Martin Binder
quelle
whoami / groups hat einen Randfall, in dem Sie die falschen Informationen erhalten. Siehe stackoverflow.com/questions/4051883/…
zumalifeguard
7

Hier ist eine kleine Modifikation von Harrys Antwort, die sich auf einen erhöhten Status konzentriert. Ich verwende dies am Anfang einer install.bat-Datei:

set IS_ELEVATED=0
whoami /groups | findstr /b /c:"Mandatory Label\High Mandatory Level" | findstr /c:"Enabled group" > nul: && set IS_ELEVATED=1
if %IS_ELEVATED%==0 (
    echo You must run the command prompt as administrator to install.
    exit /b 1
)

Das hat definitiv bei mir funktioniert und das Prinzip scheint solide zu sein; von Chris Jackson von MSFT :

Wenn Sie erhöht ausgeführt werden, enthält Ihr Token einen ACE mit der Bezeichnung "Obligatorisches Label \ High Mandatory Level".

Hugh
quelle
whoami / groups hat einen Randfall, in dem Sie die falschen Informationen erhalten. Siehe stackoverflow.com/questions/4051883/…
zumalifeguard
7

die Lösung:

at >nul
if %ErrorLevel% equ 0 ( echo Administrator ) else ( echo NOT Administrator )

funktioniert nicht unter Windows 10

Für alle Windows-Versionen ist dies möglich:

openfiles >nul 2>&1
if %ErrorLevel% equ 0 ( echo Administrator ) else ( echo NOT Administrator )
ipAlex
quelle
6

Ich habe viele (die meisten?) Antworten gelesen und dann eine Bat-Datei entwickelt, die für mich in Win 8.1 funktioniert. Ich dachte, ich würde es teilen.

setlocal
set runState=user
whoami /groups | findstr /b /c:"Mandatory Label\High Mandatory Level" > nul && set runState=admin
whoami /groups | findstr /b /c:"Mandatory Label\System Mandatory Level" > nul && set runState=system
echo Running in state: "%runState%"
if not "%runState%"=="user" goto notUser
  echo Do user stuff...
  goto end
:notUser
if not "%runState%"=="admin" goto notAdmin
  echo Do admin stuff...
  goto end
:notAdmin
if not "%runState%"=="system" goto notSystem
  echo Do admin stuff...
  goto end
:notSystem
echo Do common stuff...
:end

Hoffe jemand findet das nützlich :)

GeoffH
quelle
whoami / groups hat einen Randfall, in dem Sie die falschen Informationen erhalten. Siehe stackoverflow.com/questions/4051883/…
zumalifeguard
Danke dafür! Die andere "whoami" -Lösung hat unter Windows 8.1 bei mir nicht funktioniert. Dieser tat es.
Ryan
1

Ich weiß, dass ich zu spät zu dieser Party komme, aber hier ist mein einziger Liner, um die Verwaltung zu bestimmen.

Es hängt nicht von der Fehlerstufe ab, sondern nur von systeminfo:

for /f "tokens=1-6" %%a in ('"net user "%username%" | find /i "Local Group Memberships""') do (set admin=yes & if not "%%d" == "*Administrators" (set admin=no) & echo %admin%)

Je nach Administratorstatus des Benutzers wird entweder Ja oder Nein zurückgegeben ...

Außerdem wird der Wert der Variablen "admin" entsprechend auf "Ja" oder "Nein" gesetzt.

user1
quelle
Dies funktioniert nur, wenn der Benutzer ein direktes Mitglied der lokalen Gruppe Administratoren ist. Wenn der Benutzer Mitglied einer Domänengruppe (z. B. "Domänenadministratoren") ist, die Mitglied der Administratorgruppe ist, funktioniert dies nicht.
Harry Johnston
1

Wenn Sie als Benutzer mit Administratorrechten ausgeführt werden, wird die Umgebungsvariable Sitzungsname NICHT definiert und Sie haben beim Ausführen einer Batchdatei immer noch keine Administratorrechte.

Sie sollten den Befehl "net session" verwenden und nach einem Fehlerrückgabecode von "0" suchen, um die Administratorrechte zu überprüfen.

Beispiel; - Die erste Echo-Anweisung ist das Glockenzeichen net session >nul 2>&1 if not %errorlevel%==0 (echo echo You need to start over and right-click on this file, echo then select "Run as administrator" to be successfull. echo.&pause&exit)

Wolfgang
quelle
0

Hier ist eine einfache Methode, die ich unter Windows 7 bis Windows 10 verwendet habe. Grundsätzlich verwende ich einfach den Befehl "IF EXIST", um nach dem Ordner Windows \ System32 \ WDI \ LogFiles zu suchen. Der WDI-Ordner ist bei jeder Installation von Windows ab mindestens 7 vorhanden und erfordert Administratorrechte für den Zugriff. Der WDI-Ordner enthält immer einen LogFiles-Ordner. Wenn Sie also "IF EXIST" im Ordner "WDI \ LogFiles" ausführen, wird "true" zurückgegeben, wenn Sie als Administrator ausgeführt werden, und "false", wenn Sie nicht als Administrator ausgeführt werden. Dies kann in einer Batchdatei verwendet werden, um die Berechtigungsstufe zu überprüfen und basierend auf diesem Ergebnis zu den gewünschten Befehlen zu verzweigen.

Hier ist ein kurzer Ausschnitt des Beispielcodes:

IF EXIST %SYSTEMROOT%\SYSTEM32\WDI\LOGFILES GOTO GOTADMIN
(Commands for running with normal privileges)

:GOTADMIN
(Commands for running with admin privileges)

Beachten Sie, dass bei dieser Methode davon ausgegangen wird, dass die Standardsicherheitsberechtigungen für den WDI-Ordner nicht geändert wurden (was in den meisten Situationen unwahrscheinlich ist, siehe jedoch die Einschränkung Nr. 2 unten). Selbst in diesem Fall müssen Sie lediglich den Code ändern, um nach einer anderen gemeinsamen Datei / einem anderen Ordner zu suchen, für die Administratorzugriff erforderlich ist (System32 \ config \ SAM ist möglicherweise ein guter alternativer Kandidat), oder Sie können sogar einen eigenen speziell dafür erstellen Zweck.

Es gibt jedoch zwei Einschränkungen bei dieser Methode:

  1. Das Deaktivieren der Benutzerkontensteuerung führt wahrscheinlich dazu, dass ohnehin alles als Administrator ausgeführt wird.

  2. Wenn Sie versuchen, den WDI-Ordner im Windows Explorer zu öffnen und dann auf "Weiter" klicken, wenn Sie dazu aufgefordert werden, werden permanente Zugriffsrechte für dieses Benutzerkonto hinzugefügt, wodurch meine Methode verletzt wird. In diesem Fall kann dies behoben werden, indem das Benutzerkonto aus den Sicherheitsberechtigungen für WDI-Ordner entfernt wird. Wenn der Benutzer aus irgendeinem Grund mit Windows Explorer auf den WDI-Ordner zugreifen MUSS, müssen Sie den Code ändern, um einen anderen Ordner zu überprüfen (wie oben erwähnt, kann es eine gute Wahl sein, einen eigenen Ordner speziell für diesen Zweck zu erstellen). .

Zugegeben, meine Methode ist nicht perfekt, da sie kaputt gehen kann, aber es ist eine relativ schnelle Methode, die einfach zu implementieren ist, gleichermaßen mit allen Versionen von Windows 7, 8 und 10 kompatibel ist und vorausgesetzt, ich beachte die genannten Einschränkungen war 100% effektiv für mich.

Torin Darkflight
quelle
0

Funktioniert für Win7 Enterprise und Win10 Enterprise

@if DEFINED SESSIONNAME (
    @echo.
    @echo You must right click to "Run as administrator"
    @echo Try again
    @echo.
    @pause
    @goto :EOF
)
englebart
quelle