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.

6voto

zumalifeguard Punkte 8227

Der whoami /groups funktioniert in einem Fall nicht. Wenn Sie die UAC vollständig ausgeschaltet haben (nicht nur die Benachrichtigung), und die Sie von einer Administrator-Eingabeaufforderung aus gestartet haben, ausgegeben:

runas /trustlevel:0x20000 cmd

werden Sie nicht erhöht laufen, sondern ausgestellt:

whoami /groups

wird sagen, dass Sie erhöht sind. Das ist falsch. Hier ist, warum es falsch ist:

Wenn in diesem Zustand ausgeführt wird und IsUserAdmin ( https://msdn.microsoft.com/en-us/library/Windows/desktop/aa376389(v=vs.85).aspx ) gibt FALSE zurück und UAC 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-securable-object-in-Windows-vista.aspx ), dann ist der Prozess no läuft erhöht, aber whoami /groups behauptet, dass es so ist.

Der beste Weg, dies von einer Batch-Datei aus zu tun, ist wirklich:

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

Sie sollten Folgendes tun net session zweimal, denn wenn jemand eine at Wenn Sie sich vorher informieren, erhalten Sie die falschen Informationen.

5voto

Benoit Punkte 72929

Im Folgenden wird versucht, eine Datei im Windows-Verzeichnis zu erstellen. Wenn dies gelingt, wird sie 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 bei der es unwahrscheinlich ist, dass sie mit einem bestehenden Dateinamen kollidiert.

3voto

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

2voto

risingballs Punkte 162

Eine Sammlung der vier scheinbar am besten kompatiblen Methoden von dieser Seite. Die erste ist wirklich ziemlich genial. Getestet ab XP aufwärts. Verwirrend ist allerdings, dass es keinen Standardbefehl gibt, um auf Adminrechte zu prüfen. Ich schätze, sie konzentrieren sich jetzt einfach auf PowerShell, was für die meisten meiner eigenen Arbeiten wirklich nutzlos ist.

Ich habe den Batch 'exit-if-not-admin.cmd' genannt, der von anderen Batches aufgerufen werden kann, um sicherzustellen, dass sie nicht weiter ausgeführt werden, wenn die erforderlichen Administratorrechte nicht gegeben sind.

rem Sun May 03, 2020

rem Methods for XP+ used herein based on:
rem https://stackoverflow.com/questions/4051883/batch-script-how-to-check-for-admin-rights
goto method1

:method1
setlocal enabledelayedexpansion
set "dv==::"
if defined !dv! goto notadmin
goto admin

:method2
call fsutil dirty query %SystemDrive% >nul
if %ERRORLEVEL%==0 goto admin
goto notadmin

:method3
net session >nul 2>&1
if %ERRORLEVEL%==0 goto admin
goto notadmin

:method4
fltmc >nul 2>&1 && goto admin
goto notadmin

:admin
echo Administrator rights detected
goto end

:notadmin
echo ERROR: This batch must be run with Administrator privileges
pause
exit /b
goto end

:end```

2voto

Ostati Punkte 4377

PowerShell gefällig?

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

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