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.

2voto

Tyler Szabo Punkte 936

Edit: copyitright hat darauf hingewiesen, dass dies unzuverlässig ist. Wenn Sie den Lesezugriff mit UAC genehmigen, kann dir das gelingen. 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


Auf der Grundlage einer Reihe anderer guter Antworten hier und der von and31415 angesprochenen Punkte habe ich festgestellt, dass ich ein Fan der folgenden Punkte bin:

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

Wenig Abhängigkeiten und schnell.

2voto

Dan Punkte 21

Einige Server deaktivieren Dienste, die der Befehl "net session" benötigt. Dies führt dazu, dass die Admin-Prüfung immer anzeigt, dass Sie keine Admin-Rechte haben, obwohl Sie diese haben könnten.

1voto

ivan_pozdeev Punkte 30938

Buchstäblich Dutzende von Antworten in dieser und in verlinkten Fragen und anderswo bei SE, die alle auf die eine oder andere Weise mangelhaft sind, haben deutlich gezeigt, dass Windows kein zuverlässiges eingebautes Konsolenprogramm bietet. Es ist also an der Zeit, Ihr eigenes zu entwickeln.

Der folgende C-Code, der auf Erkennen, ob das Programm mit vollen Administratorrechten ausgeführt wird , funktioniert unter Win2k+ 1 , überall und in allen Fällen (UAC, Domänen, transitive Gruppen...) - denn es tut dasselbe wie das System selbst, wenn es die Berechtigungen überprüft. Es meldet das Ergebnis sowohl mit einer Meldung (die mit einem Schalter abgestellt werden kann) als auch mit einem Exit-Code.

Es muss nur einmal kompiliert werden, dann können Sie einfach die .exe überall - es kommt nur darauf an kernel32.dll y advapi32.dll (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;
}

1 MSDN behauptet, die APIs seien XP+, aber das ist falsch. <code>CheckTokenMembership</code> <a href="https://social.msdn.microsoft.com/Forums/vstudio/en-US/2eaf7697-1b35-4ee9-b3f5-1f326337f870/checktokenmembership?forum=vcgeneral" rel="nofollow noreferrer">ist 2k+ </a>und die andere <a href="https://support.microsoft.com/en-us/kb/118626" rel="nofollow noreferrer">noch älter ist </a>. Der letzte Link enthält auch eine viel kompliziertere Methode, die sogar in NT funktionieren würde.

1voto

user2902818 Punkte 11

Anmerkung: Überprüfung mit cacls für \system32\config\system wird in WOW64 IMMER fehlschlagen (zum Beispiel von %systemroot% \syswow64\cmd.exe / 32 bit Total Commander), so dass Skripte, die in einer 32bit-Shell in einem 64bit-System laufen, eine Endlosschleife bilden... Besser wäre es, die Rechte für das Prefetch-Verzeichnis zu prüfen:

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

Win XP bis 7 getestet, jedoch schlägt es in WinPE fehl, da es in der Windows 7 install.wim weder ein solches Verzeichnis noch cacls.exe gibt

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

OPENFILES > nul

Unter Windows 7 wird die Fehlerebene mit "1" angezeigt, mit dem Hinweis, dass das Zielsystem ein 32-Bit-Betriebssystem sein muss.

Beide Prüfungen werden wahrscheinlich auch in der Wiederherstellungskonsole fehlschlagen.

Was funktioniert in Windows XP - 8 32/64 bit, in WOW64 und in WinPE sind: Tests zur Erstellung von Verzeichnissen (WENN der Administrator das Windows-Verzeichnis nicht mit Teppichbomben mit Berechtigungen für alle versehen hat...) und

net session

und

reg add HKLM /F

Kontrollen.

Auch eine weitere Anmerkung in einigen Windows XP (und andere Versionen wahrscheinlich auch, je nach Admin's Bastelei) abhängig von Registry-Einträge direkt Aufruf bat/cmd von .vbs Skript wird mit der Info, dass bat/cmd Dateien nicht mit etwas verbunden sind fehlschlagen...

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

Der Aufruf von cmd.exe mit den Parametern der bat/cmd-Datei funktioniert dagegen problemlos:

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

1voto

script'n'code Punkte 315

Hier ist eine weitere, die der Liste hinzugefügt werden kann ;-)

(Versuch einer Dateierstellung am Systemort)

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

)

En MODE CON reinitialisiert den Bildschirm und unterdrückt jeglichen Text/Fehler, wenn keine Berechtigung zum Schreiben in den Systemspeicher vorhanden ist.

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