stefanj
Goto Top

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

Content-Key: 27626

Url: https://administrator.de/contentid/27626

Printed on: April 24, 2024 at 03:04 o'clock

Member: meinereiner
meinereiner Mar 18, 2006 at 13:19:09 (UTC)
Goto Top
Ich häte da eine eher "indirekte" Idee.

lass im Script eine Aktion laufen, die nur Admins dürfen. Das kann z.B. das Schreiben einer Datei ins Windows Verzeichnis sein. Über Erfolg, bzw Misserfolg der Aktion weisst du dann ob der User Admin ist oder nicht.
Member: Camp
Camp Mar 18, 2006 at 13:27:37 (UTC)
Goto Top
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
Member: Biber
Biber Mar 18, 2006 at 15:57:27 (UTC)
Goto Top
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
Member: StefanJ
StefanJ Mar 18, 2006 at 16:13:25 (UTC)
Goto Top
absolut, Variante a) ist genau was ich suche. Ich bedanke mich bei allen Anwesenden face-smile
Member: StefanJ
StefanJ Mar 18, 2006 at 16:24:16 (UTC)
Goto Top
ach bevor ich euch das nächste mal wieder nerven muss:
Hast du eine gute Seite für Windows CMD Skripting ?
Dein Befehl ab "|find..." sieht mir nach einer If-Schleife aus? Seh ich das richtig ? was bewirken jeweils die "|" !??

vielleicht haste ja noch Zeit das zu beantowrten ;)
gruß
Stefan

Member: Biber
Biber Mar 18, 2006 at 16:52:38 (UTC)
Goto Top
So viele Fragen auf einmal, Stefan... face-wink

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
Member: StefanJ
StefanJ Mar 18, 2006 at 17:58:25 (UTC)
Goto Top
Thx!
Member: StefanJ
StefanJ Mar 21, 2006 at 15:50:16 (UTC)
Goto Top
Leider ist ein neues Problem aufgetreten *heul*
Und zwar ein Sprachenproblem:
Gibt es die Möglichkeit das ganze über eine Wildcard zu machen like "Adm*" ??

Ansonsten könnt ich mir noch vorstellen(was ich aber leider nicht hinbekomme, das Ganze so anzugehen:
Mit "net localgroup |find "Adm">%Variable" Die Ausgabe dann in eine Variable speichern. Dann irgendwie das Ganze nochma:
Wenn ja, wie leite ich ich das "find "Adm" in eine Variable um?

Gruß,
Stefan
Member: Biber
Biber Mar 21, 2006 at 16:09:56 (UTC)
Goto Top
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]
Member: StefanJ
StefanJ Mar 21, 2006 at 18:54:41 (UTC)
Goto Top
Sry für die Fragen und Danke für die Mühen ;)
Hab jetzt auf die Schnelle das Ganze nicht hinbekommen. Hab alle Varianten mal getestet:
Beim ersten bekomm ich:
"%%i" ist syntaktisch an dieser Stelle nicht verarbeitbar.

Und bei den unteren 2, bekomme ich zwar keine Fehlermeldung aber auch keinen Output! Muss jetzt leider weg, melde mich heut abend oder morgen nochma!

Danke nochma,
gruß
Member: Biber
Biber Mar 21, 2006 at 19:12:53 (UTC)
Goto Top
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:
@for /f "tokens=2 delims=*" %i in ('net localgroup ^|find /i "adm"') do @set "AdminsHere=%i"  
...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:
:: -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
(Hoffe, jetzt hab ich weniger Tippfehler *gg)

Gruß Biber
Member: StefanJ
StefanJ Mar 22, 2006 at 14:16:27 (UTC)
Goto Top
Moin Biber,

alsooo,leidäär muss ich sagen, dass das net funktioniert. Nachdem ich den Befehl "for /f "tokens=2 delims=*" %i in ('net localgroup ^|find /i "Adm"') do @set "AdminsHere=%i" " auf die cmd losgelassen habe, hat er den Befehl ohne Fehler erledigt. Das Problem ist allerdings wenn ich danach mit echo %AdminsHere% die Geschichte mal ausgeben will, ist diese Variable nicht vorhanden,also scheint er wohl irgendwie nicht zu dem Befehl "do @set "AdminsHere=%i" zu kommen. (Zur Info noch:Der zu findende String muss mit groß A anfangen also "Adm").
Noch ein Fehlerchen vielleicht irgendwo? face-smile Wenn das Ganze nicht funktionieren sollte,was hälst du davon einfach den Output an der Stelle hier: "net localgroup |find "Adm">c:\test.txt" in eine Datei ausgeben,um sie dann wieder einzulesen und in eine Variable zu speichern ??!!
Schöner wärs natürlich ohne diesen "umweg"...
Thx again ;)
Gruß
Stefan
Member: Biber
Biber Mar 22, 2006 at 15:53:52 (UTC)
Goto Top
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
Member: StefanJ
StefanJ Mar 22, 2006 at 19:34:30 (UTC)
Goto Top
Na wer sagts denn...Nu gehts face-smile War doch alles kein Problem!
hehe,kommt vor sowas!Ich dachte schon du machst als extra Fehler rein um mich zu testen ;)
apropo: Ohne dich für "verrückt" zu halten,so frage ich mich dennoch schon die Ganze Zeit,warum zum Geier du so verdammt gut auf dieser nervtötenden Win-cmd Basis skripten kannst ??Scheint so als ob du öfters mal was beruflich "cmd-abhängig" machen durftest ?! ;) Das ist ja echt der Wahnsinn,ich hab hilflos in Windows 2003 Scripting Büchern versucht, mir dein "Werk" zusammen zu basteln,völlig vergebens!Du scheinst damit nicht allzuviele Probs gehabt zu haben ;)
Ach ja,(du merkst ich kann mich nicht wirklich kurz halten und stell gerne Fragen) ich werde morgen mal versuchen das Ganze nachzuvollziehen, weil das Ganze zu einer größeren Aufgabe gehört und ich somit ein paar anderen MItarbeitern in das Ganze einweihen muss. Und da wär es doof wenn ich das Ganze net erklären könnte.
Vielleicht kannst du mir ja dann nochma ein paar Code Schnipsel erklären...(quasi als Wiedergutmachung für die ganzen "Fehlerchen" ;) )

Gruß Stefan
Member: Biber
Biber Mar 22, 2006 at 20:42:07 (UTC)
Goto Top
Vielleicht kannst du mir ja dann nochma ein paar Code Schnipsel erklären...

Klar, Stefan, aber nur, wenn die in eine Zeile passen.. face-wink

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)
Member: StefanJ
StefanJ Mar 23, 2006 at 14:07:45 (UTC)
Goto Top
Hi Biber,
habs erledigt, Thema ist gelöst ;)

Jetzt noch meine angekündigten Fragen:
1. (ne blöde Frage) wenn man das * als Trennzeichen nimmt,wieso ist dann bei "*Administratoren", das Administratoren=tokens1 ?! Eigentlich müsste doch das "Nichts" vor dem Trennzeichen tokens1 sein und Administratoren das tokens2 ?? Oder beginnt er erst nach dem Trennzeichen zu zählen wenn davor "Nichts" ist ??
2. Bei " net localgroup ^|find /i "*Adm" " : was macht das " ^ " ?

Das sind doch mal wenig Fragen,wa ?? face-smile

Gruß
Stefan
Member: Biber
Biber Mar 23, 2006 at 14:43:03 (UTC)
Goto Top
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
Member: StefanJ
StefanJ Mar 23, 2006 at 17:50:38 (UTC)
Goto Top
Punkt Ende. Thema geschlossen !

Ich bedanke mich beim Senior Administrator Biber ;)

Gruß & und bis zum nächsten Mal

Stefan