Berechtigungen des eingeloggten Benutzers über Kommandozeile auslesen
Hi,
folgendes Problem:
Ich möchte ein Skript(.bat) an verschiedene Clients verteilen, welches Systemänderungen vornimmt. Dazu benötigt der angemeldete Benutzer Administratorrechte an dem entsprechenden Rechner auf dem er das Skript ausführt. Ich möchte nun am Anfang des Skripts noch einen Befehl ausführen, welches diese Rechte des Benutzers überprüft und im entsprechenden Fall ihn darüber informiert dass er keine Administratorrechte besitzt. Ich brauche also einen Befehl, der überprüft ob der angemeldete Benutzer entweder lokale Administratorrechte ODER Domän-weite Administratorrechte(und somit auch lokale) besitzt. (Es reicht wohl zu überprüfen ob er lokale Adminrechte besitzt,weil die Domän Admins ja so oder so auch in der lokalen Administrator Gruppe eingetragen sind !)
Könnt ihr mir weiterhelfen ??? Danke
Gruß,
Stefan J
folgendes Problem:
Ich möchte ein Skript(.bat) an verschiedene Clients verteilen, welches Systemänderungen vornimmt. Dazu benötigt der angemeldete Benutzer Administratorrechte an dem entsprechenden Rechner auf dem er das Skript ausführt. Ich möchte nun am Anfang des Skripts noch einen Befehl ausführen, welches diese Rechte des Benutzers überprüft und im entsprechenden Fall ihn darüber informiert dass er keine Administratorrechte besitzt. Ich brauche also einen Befehl, der überprüft ob der angemeldete Benutzer entweder lokale Administratorrechte ODER Domän-weite Administratorrechte(und somit auch lokale) besitzt. (Es reicht wohl zu überprüfen ob er lokale Adminrechte besitzt,weil die Domän Admins ja so oder so auch in der lokalen Administrator Gruppe eingetragen sind !)
Könnt ihr mir weiterhelfen ??? Danke
Gruß,
Stefan J
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 27626
Url: https://administrator.de/forum/berechtigungen-des-eingeloggten-benutzers-ueber-kommandozeile-auslesen-27626.html
Ausgedruckt am: 10.05.2025 um 03:05 Uhr
18 Kommentare
Neuester Kommentar
Hi,
wenn man ein script (.bat) ausführt und man nicht ausreichen Rechte besitzt, kommt die Meldung in der CMD
"Systemfehler 5
Zugriff wurde verweigert."
Ansonsten wenn man die Berechtigung auslesen will würde ich es mit "whoami" als eingabe in der CMD versuchen wenn du genau angabenhaben willst würde ich "whoami /all" eingeben,
müstest das nur noch in die *.bat vorher eingeben, damit das der User sieht, dann ein break einfügen, damit er das noch lesen kann und dann einfach das script weiter ausführen lassen, wenns nicht geht steht da eh die Meldung welche ich oben genannt habe.
Gruß
Camp
wenn man ein script (.bat) ausführt und man nicht ausreichen Rechte besitzt, kommt die Meldung in der CMD
"Systemfehler 5
Zugriff wurde verweigert."
Ansonsten wenn man die Berechtigung auslesen will würde ich es mit "whoami" als eingabe in der CMD versuchen wenn du genau angabenhaben willst würde ich "whoami /all" eingeben,
müstest das nur noch in die *.bat vorher eingeben, damit das der User sieht, dann ein break einfügen, damit er das noch lesen kann und dann einfach das script weiter ausführen lassen, wenns nicht geht steht da eh die Meldung welche ich oben genannt habe.
Gruß
Camp
Moin StefanJ,
Das kannst Du mit native Net-Commands machen oder mit mitgelieferten M$-Utilitites oder mit kleinen Freeware-Hilfstools.
a) mit Net-Kommandos
Z.B
b) mit IfMember.Exe aus dem M$-ResKit
(siehe über Forumssuche; diverse Beispiele in "Batch & Shell")
c) Über Freewaretools für ganz schreibfaule, z.B. IsAdmin.exe von http://internet.cybermesa.com/~bstewart/wast.html
(oder MemberOf.exe oder CheckAdmin.exe...)
Halte aber Variante a) für ausreichend.
HTH Biber
Das kannst Du mit native Net-Commands machen oder mit mitgelieferten M$-Utilitites oder mit kleinen Freeware-Hilfstools.
a) mit Net-Kommandos
Z.B
b) mit IfMember.Exe aus dem M$-ResKit
(siehe über Forumssuche; diverse Beispiele in "Batch & Shell")
c) Über Freewaretools für ganz schreibfaule, z.B. IsAdmin.exe von http://internet.cybermesa.com/~bstewart/wast.html
(oder MemberOf.exe oder CheckAdmin.exe...)
Halte aber Variante a) für ausreichend.
HTH Biber
So viele Fragen auf einmal, Stefan... 
also:
- gute Seiten für Windows-Skripting ... ein paar Links sind gepostet im Bereich "Batch & Shell" hier im Forum.
Das "|" ist ein so genanntes Pipe-Symbol. Nicht, weil solche Pfeifen wie ich es verwenden, sondern weil damit der Output von einem Programm (hier "net group...") als Input des rechts folgenden (hier "find.exe") verwendet wird.
Sprich: Wenn "Find.exe" nichts findet, ist das für Find ein FEHLER... in diesem Fall wurde der Benutzer nicht als Mitglied der Local-Admin-Gruppe gefunden.
Diese Batch-Grundlagen sind ein bisschen erklärt in den Tutorials auch im Bereich "Batch & Shell".
Hope That Helps
Biber
also:
- gute Seiten für Windows-Skripting ... ein paar Links sind gepostet im Bereich "Batch & Shell" hier im Forum.
Sprich: Wenn "Find.exe" nichts findet, ist das für Find ein FEHLER... in diesem Fall wurde der Benutzer nicht als Mitglied der Local-Admin-Gruppe gefunden.
Diese Batch-Grundlagen sind ein bisschen erklärt in den Tutorials auch im Bereich "Batch & Shell".
Hope That Helps
Biber
Moin Stefan,
wieder so viele Fragen...
Also:
- Wildcards beim Find-Befehl: Fehlanzeige
- funzen tut in "Batch & Shell" gar nichts, aber einiges bringe ich hier zum funk-ti-o-nie-ren..
- Variable setzen wie folgt (in einem Batch-Zweizeiler):
for /f "tokens=2 delims=*" %%i in ('net localgroup ^|find /i "adm"') do set "AdminsHere=%%i"
Dann sind es halt zwei Zeilen...
Ginge auch als eine Zeile (wieder im Batch):
for /f "tokens=2 delims=*" %%i in ('net localgroup ^|find /i "adm"') do (
[Aus optischen Gründen umgebrochen in zwei Zeilen.]
Grüße
Biber
[Edit] Sorry... so ist es besser nachvollziehbar: am CMD-Prompt abschicken:
for /f "tokens=2 delims=*" %i in ('net localgroup ^|find /i "adm"') do @echo [Output] %i
[Output] Administratoren
[Edit II ... Tippfehlerkorrektur fehlende Klammer... siehe unten]
[/Edit]
wieder so viele Fragen...
Also:
- Wildcards beim Find-Befehl: Fehlanzeige
- funzen tut in "Batch & Shell" gar nichts, aber einiges bringe ich hier zum funk-ti-o-nie-ren..
- Variable setzen wie folgt (in einem Batch-Zweizeiler):
for /f "tokens=2 delims=*" %%i in ('net localgroup ^|find /i "adm"') do set "AdminsHere=%%i"
Dann sind es halt zwei Zeilen...
Ginge auch als eine Zeile (wieder im Batch):
for /f "tokens=2 delims=*" %%i in ('net localgroup ^|find /i "adm"') do (
Grüße
Biber
[Edit] Sorry... so ist es besser nachvollziehbar: am CMD-Prompt abschicken:
for /f "tokens=2 delims=*" %i in ('net localgroup ^|find /i "adm"') do @echo [Output] %i
[Output] Administratoren
[Edit II ... Tippfehlerkorrektur fehlende Klammer... siehe unten]
[/Edit]
Sorry, Stefan,
habe mich oben missverständlich ausgedrückt... das sollte ein Auszug aus einer Batchdatei sein. Am CMD-Prompt muss ein Prozentzeichen weg bei den Zählvariablen.´
Außerdem fehlt in der zweiten "net LocalGroup"-Zeile die "RundeKlammerAuf" am Anfang.
Also nochmal:
A) Entweder am CMD-Prompt FOR..IN..DO.. mit EINEM Prozentzeichen:
...und danach...
..---oder alternativ--
(net localgroup "%AdminsHere%"|find "%username%">nul)&& @echo User hat Adminrechte
-oder-
B) Wenn es in einer Batchdatei ist mit zwei Prozentzeichen bei Zählvariablen:
(Hoffe, jetzt hab ich weniger Tippfehler *gg)
Gruß Biber
habe mich oben missverständlich ausgedrückt... das sollte ein Auszug aus einer Batchdatei sein. Am CMD-Prompt muss ein Prozentzeichen weg bei den Zählvariablen.´
Außerdem fehlt in der zweiten "net LocalGroup"-Zeile die "RundeKlammerAuf" am Anfang.
Also nochmal:
A) Entweder am CMD-Prompt FOR..IN..DO.. mit EINEM Prozentzeichen:
@for /f "tokens=2 delims=*" %i in ('net localgroup ^|find /i "adm"') do @set "AdminsHere=%i"
(net localgroup "%AdminsHere%"|find "%username%">nul)&& @echo User hat Adminrechte
-oder-
B) Wenn es in einer Batchdatei ist mit zwei Prozentzeichen bei Zählvariablen:
:: -Snipp CheckIfAdmin.bat
@echo off & setlocal
for /f "tokens=2 delims=*" %%i in ('net localgroup ^|find /i "adm"') do set "AdminsHere=%%i"
(net localgroup "%AdminsHere%"|find "%username%">nul)|| @echo User hat KEINE Adminrechte
(net localgroup "%AdminsHere%"|find "%username%">nul)&& @echo User hat Adminrechte
:: ----Snapp CheckIfAdmin.bat
Gruß Biber
Hm, Stefan,
mal sehen, ob wir den Knackpunkt eingrenzen können.
Mein System ist WinXP Pro SP2 /in einer Domäne/Clientrechner.
Wenn ich es schrittweise am CMD-Prompt entwickle (den CMD-Prompt immer dargestellt durch ein Kleinerzeichen am Anfang der Zeile) sieht das so aus:
(STEP1)>net localgroup
Gruppen für \\XXXXXX13
*Administratoren
*Benutzer
*Debuggerbenutzer
*Gäste
*Hauptbenutzer
*Hilfedienstgruppe
*Netzwerkkonfigurations-Operatoren
*Remotedesktopbenutzer
*Remoteunterstuetzung
*Remoteunterstützungsanbieter
*Replikations-Operator
*Sicherungs-Operatoren
Der Befehl wurde erfolgreich ausgeführt.
(STEP2)>net localgroup|find /i "adm"
*Administratoren
(STEP3)>for /f %i in ('net localgroup^|find /i "adm"') do @echo %i
*Administratoren
Besser ist eigentlich als Suchkriterium "*Adm" statt nur "adm", fällt mir grad auf.
(STEP4)>for /f "delims=* tokens=1" %i in ('net localgroup^|find /i "*Adm"') do @echo %i
Administratoren
f*ck..oben habe ich "tokens=2" gepostet statt "tokens=1" *fluch und schimpf"
..okay, den Rest der Herleitung schenk ich mir.. ist "nur" ein Tippfehler oben.
Ich gehe jetzt mal eine Runde in die Ecke zum Schämen...
...in Zukunft schreibe ich nur noch Oneliner - mit Zweizeilern klappt das nicht *sfg*
Bitte ersetze oben:
ALT: for /f "tokens=2 delims=*" %%i in ('net localgroup ^|find /i "adm"') do set "AdminsHere=%%i"
-durch-
NEU:for /f "tokens=1 delims=*" %%i in ('net localgroup ^|find /i "*Adm"') do set "AdminsHere=%%i"
Reumütig
Biber
mal sehen, ob wir den Knackpunkt eingrenzen können.
Mein System ist WinXP Pro SP2 /in einer Domäne/Clientrechner.
Wenn ich es schrittweise am CMD-Prompt entwickle (den CMD-Prompt immer dargestellt durch ein Kleinerzeichen am Anfang der Zeile) sieht das so aus:
(STEP1)>net localgroup
Gruppen für \\XXXXXX13
*Administratoren
*Benutzer
*Debuggerbenutzer
*Gäste
*Hauptbenutzer
*Hilfedienstgruppe
*Netzwerkkonfigurations-Operatoren
*Remotedesktopbenutzer
*Remoteunterstuetzung
*Remoteunterstützungsanbieter
*Replikations-Operator
*Sicherungs-Operatoren
Der Befehl wurde erfolgreich ausgeführt.
(STEP2)>net localgroup|find /i "adm"
*Administratoren
(STEP3)>for /f %i in ('net localgroup^|find /i "adm"') do @echo %i
*Administratoren
Besser ist eigentlich als Suchkriterium "*Adm" statt nur "adm", fällt mir grad auf.
(STEP4)>for /f "delims=* tokens=1" %i in ('net localgroup^|find /i "*Adm"') do @echo %i
Administratoren
f*ck..oben habe ich "tokens=2" gepostet statt "tokens=1" *fluch und schimpf"
..okay, den Rest der Herleitung schenk ich mir.. ist "nur" ein Tippfehler oben.
Ich gehe jetzt mal eine Runde in die Ecke zum Schämen...
...in Zukunft schreibe ich nur noch Oneliner - mit Zweizeilern klappt das nicht *sfg*
Bitte ersetze oben:
ALT: for /f "tokens=2 delims=*" %%i in ('net localgroup ^|find /i "adm"') do set "AdminsHere=%%i"
-durch-
NEU:for /f "tokens=1 delims=*" %%i in ('net localgroup ^|find /i "*Adm"') do set "AdminsHere=%%i"
Reumütig
Biber
Vielleicht kannst du mir ja dann nochma ein paar Code Schnipsel erklären...
Klar, Stefan, aber nur, wenn die in eine Zeile passen..
Eigentlich bin ich zu dem zwangsweisen näheren Auseinandersetzen mit den CMD-Befehlen durch so banale Fragen wie "...kannste ma' eben in den Logfiles aufm Server nachgucken, ob da irgendwelche Timeout-Fehler drinstehen seit Donnerstach?"
Bei (Java-Application-)Logfiles, die mal eben 10 GigaByte groß werden, weil die fehlersuchenden Entwickler jeden Step mitloggen... da versucht man/frau nur einmal, irgendetwas mit einem Editor und bio-optischer Analyse finden zu wollen.. spätestens dann habe ich mich mit Find's/grep's/pipes und ähnlichen altertümlichen Werkzeugen angefreundet.
Und für die Fälle, wo halt gar keine von diesen Super-Profi-Tools zur Hand (also auf dem Problem-Rechner installiert) sind oder dann, wenn ein DAU-User am Telefon ist, von dem ich aber die IP-Adresse oder den Computernamen brauche... dann kann ich über wenige kurze Anweisungen brauchbare Antworten erreichen ("So, jetzt geben wir mal ein: ipconfig ... nein, das wird nur ei-pi-config gesprochen, eintippen bitte ida-paula-cäsar...)
Egal... einen DAU-User mit der Maus über die Micro$oft-GUI-Landschaften zu lenken - das kostet mich mehr Zeit und Nerven.
Wenn Du ein paar Batch-Codeschnipsel lesen willst: Im Bereich Batch & Shell sind einige Fragen, einige Antworten, ein paar Tutorial und auch ein paar Links zu Batch-Guru-Seiten.
Ich sehe mich ja mehr als Gebrauchs-Bätche-Schreiber. *gg
Wenn jetzt Deine eigentliche Frage (Admin-Rechte über CMD-Zeile feststellen) beantwortet ist, dann setz doch bitte diesen Beitrag auf gelöst.
Grüße Biber
(der sich auch selten kurz fassen kann und will)
Moin Stefan,
hast recht... die Fragen können wir hier noch abhandeln...
zu 1)
...Oder beginnt er erst nach dem Trennzeichen zu zählen wenn davor "Nichts" ist ??
Genau so macht er es. Ist zwar selten, dass eine Aufzählung mit einem Trennzeichen anfängt, denn normalerweise sind ja Tokens in einem String so getrennt:"eins;zwei;drei" und nicht ";eins;zwei;drei".
Aber sollte es mal so sein, "beginnt er nach dem Trennzeichen".
Kann ja auch nicht sein beim CMD, dass das erste Token "leer" ist, aber die danach folgenden "gefüllt"..
zu 2)
das Caret ("^") ist in diesem Fall ein so genanntes Maskierungszeichen.
Um dem CMD-Interpreter zu sagen, er soll das folgende Steuerzeichen NICHT als Steuerzeichen interpretieren, sondern einfach so als Zeichen weiterliefern.
Was in der Klammer in der FOR..IN..DO-Anweisung steht, bedeutet eigentlich
Nimm für die FOR..Token-Zerlegung den Output von ...
...so lese ich ich die Zeile: 'FOR /f "tokens"=.... in ( Output_von )'
..und Output_von ist quasi das Ergebnis eines Aufrufs "cmd.exe /c net localgroup|find..."
Für diesen CMD-Aufruf muss das Steuerzeichen "|" maskiert werden, damit es nicht schon die CMD-Instanz, die den FOR-Befehl ausfuhrt, zu interpretieren versucht.
Ein bisschen was zur Maskierung von Steuerzeichen steht auch in den Tutorials in Batch & Shell.
Grüße Biber
hast recht... die Fragen können wir hier noch abhandeln...
zu 1)
...Oder beginnt er erst nach dem Trennzeichen zu zählen wenn davor "Nichts" ist ??
Genau so macht er es. Ist zwar selten, dass eine Aufzählung mit einem Trennzeichen anfängt, denn normalerweise sind ja Tokens in einem String so getrennt:"eins;zwei;drei" und nicht ";eins;zwei;drei".
Aber sollte es mal so sein, "beginnt er nach dem Trennzeichen".
Kann ja auch nicht sein beim CMD, dass das erste Token "leer" ist, aber die danach folgenden "gefüllt"..
zu 2)
das Caret ("^") ist in diesem Fall ein so genanntes Maskierungszeichen.
Um dem CMD-Interpreter zu sagen, er soll das folgende Steuerzeichen NICHT als Steuerzeichen interpretieren, sondern einfach so als Zeichen weiterliefern.
Was in der Klammer in der FOR..IN..DO-Anweisung steht, bedeutet eigentlich
Nimm für die FOR..Token-Zerlegung den Output von ...
...so lese ich ich die Zeile: 'FOR /f "tokens"=.... in ( Output_von )'
..und Output_von ist quasi das Ergebnis eines Aufrufs "cmd.exe /c net localgroup|find..."
Für diesen CMD-Aufruf muss das Steuerzeichen "|" maskiert werden, damit es nicht schon die CMD-Instanz, die den FOR-Befehl ausfuhrt, zu interpretieren versucht.
Ein bisschen was zur Maskierung von Steuerzeichen steht auch in den Tutorials in Batch & Shell.
Grüße Biber