Bin ich Admin?

Wie kann eine Batch-Datei unter Windows Vista erkennen, ob sie mit vollen Administratorrechten gestartet wurde? Eine Prüfung darauf, ob der aktuelle Benutzer Mitglied der Administratoren-Gruppe ist, reicht ja nicht, weil seine Rechte trotzdem durch die Benutzerkontensteuerung (UAC) beschnitten sein könnten.

vorlesen Druckansicht 3 Kommentare lesen
Lesezeit: 2 Min.

Wie kann eine Batch-Datei unter Windows Vista erkennen, ob sie mit vollen Administratorrechten gestartet wurde? Eine Prüfung darauf, ob der aktuelle Benutzer Mitglied der Administratoren-Gruppe ist, reicht ja nicht, weil seine Rechte trotzdem durch die Benutzerkontensteuerung (UAC) beschnitten sein könnten.

Stimmt. Trotzdem weist der Ansatz, die Rechte über Gruppenmitgliedschaften zu prüfen, in die richtige Richtung. Unter Vista und Windows 7 trägt nämlich jeder Benutzer ein sogenanntes Integrity Label, das ihn automatisch zum Mitglied einer speziellen Gruppe macht (siehe auch den Artikel „Recht und Rechtschaffenheit“, c’t 10/07, S. 180). In der deutschen Übersetzung ist aus dem Integrity Label eine „Verbindliche Beschriftung“ geworden; es gibt sie als „System-“, „Hohe“, „Mittlere“ und „Niedrige Verbindlichkeitsstufe“. Normale, von einem eingeschränkten Benutzer gestartete Prozesse laufen mit mittlerer, mit Administratorrechten ausgestattete mit hoher Verbindlichkeitsstufe.

Eine Liste aller Gruppen, der der aktuelle Benutzer angehört, liefert der Befehl whoami /groups; die kann eine Batch-Datei dann mit find filtern. Statt den Klartextnamen sollte man dazu allerdings die Security-ID (SID) des gesuchten Integrity Label verwenden, damit das Skript unabhängig von der installierten Windows-Sprachversion funktioniert. Sie lautet für „Mittel“ S-1-16-8192 und für „Hoch“ S-1-16-12288. Ein passender Code-Ausschnitt sieht damit so aus:

whoami /groups | find "S-1-16-12288" > nul
if errorlevel 1 goto restricted
REM Hier Admin-Aufgaben erledigen
:restricted
…

Das Skript macht sich die Tatsache zunutze, dass find einen Fehlerwert (errorlevel) von 1 zurĂĽckliefert, wenn es den angegebenen Such-String nicht finden kann. (hos)