Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Berechtigungen des eingeloggten Benutzers über Kommandozeile auslesen

Frage Entwicklung Batch & Shell

Mitglied: StefanJ

StefanJ (Level 1) - Jetzt verbinden

18.03.2006, aktualisiert 23.03.2006, 11374 Aufrufe, 18 Kommentare

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
Mitglied: meinereiner
18.03.2006 um 14:19 Uhr
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.
Bitte warten ..
Mitglied: Camp
18.03.2006 um 14:27 Uhr
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
Bitte warten ..
Mitglied: Biber
18.03.2006 um 16:57 Uhr
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
(net localgroup Administratoren|find "%username%">nul)|| @echo User hat KEINE Adminrechte

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
Bitte warten ..
Mitglied: StefanJ
18.03.2006 um 17:13 Uhr
absolut, Variante a) ist genau was ich suche. Ich bedanke mich bei allen Anwesenden
Bitte warten ..
Mitglied: StefanJ
18.03.2006 um 17:24 Uhr
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

"net localgroup Administratoren|find "%username%">nul)|| @echo User hat KEINE Adminrechte "
Bitte warten ..
Mitglied: Biber
18.03.2006 um 17:52 Uhr
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.

- die "|" and "||" in dem Oneliner oben haben unterschiedliche Bedeutung.
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.

Das "||" dagegen ist ein "logisches ODER".. bedeutet, dass NUR bei "Fehler(code)" des vorangegangenen Befehls die folgende Aktion ausgeführt 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
Bitte warten ..
Mitglied: StefanJ
18.03.2006 um 18:58 Uhr
Thx!
Bitte warten ..
Mitglied: StefanJ
21.03.2006 um 16:50 Uhr
Leider ist ein neues Problem aufgetreten *heul*
Und zwar ein Sprachenproblem:
"net localgroup Administratoren|find "%username%">nul)|| @echo User hat KEINE Adminrechte" klappt prima, solange es die Gruppe "Administratoren" gibt. Im Englischen heißt sie z.B. leider Administrators,da funktioniert das Ganze dann schon nicht mehr und leider muss es unter anderem in Spanisch,Franz.,Dt.,Engl. funktionieren...
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:
"net localgroup %Variable%|find "%username%">nul)|| @echo User hat KEINE Adminrechte". Könnte das so funzen??
Wenn ja, wie leite ich ich das "find "Adm" in eine Variable um?

Gruß,
Stefan
Bitte warten ..
Mitglied: Biber
21.03.2006 um 17:09 Uhr
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"
(net localgroup "%AdminsHere%"|find "%username%">nul)|| @echo User hat KEINE Adminrechte

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 (
(net localgroup "%%i"|find "%username%">nul)|| @echo User hat KEINE Adminrechte )
[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]
Bitte warten ..
Mitglied: StefanJ
21.03.2006 um 19:54 Uhr
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ß
Bitte warten ..
Mitglied: Biber
21.03.2006 um 20:12 Uhr
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:
01.
@for /f "tokens=2 delims=*" %i in ('net localgroup ^|find /i "adm"') do @set "AdminsHere=%i"
...und danach...
(net localgroup "%AdminsHere%"|find "%username%">nul)|| @echo User hat KEINE Adminrechte
..---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:
01.
:: -Snipp CheckIfAdmin.bat 
02.
@echo off & setlocal 
03.
for /f "tokens=2 delims=*" %%i in ('net localgroup ^|find /i "adm"') do set "AdminsHere=%%i"  
04.
(net localgroup "%AdminsHere%"|find "%username%">nul)|| @echo User hat KEINE Adminrechte  
05.
(net localgroup "%AdminsHere%"|find "%username%">nul)&& @echo User hat Adminrechte  
06.
:: ----Snapp CheckIfAdmin.bat
(Hoffe, jetzt hab ich weniger Tippfehler *gg)

Gruß Biber
Bitte warten ..
Mitglied: StefanJ
22.03.2006 um 15:16 Uhr
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? 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
Bitte warten ..
Mitglied: Biber
22.03.2006 um 16:53 Uhr
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
Bitte warten ..
Mitglied: StefanJ
22.03.2006 um 20:34 Uhr
Na wer sagts denn...Nu gehts 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
Bitte warten ..
Mitglied: Biber
22.03.2006 um 21:42 Uhr
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)
Bitte warten ..
Mitglied: StefanJ
23.03.2006 um 15:07 Uhr
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 ??

Gruß
Stefan
Bitte warten ..
Mitglied: Biber
23.03.2006 um 15:43 Uhr
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
Bitte warten ..
Mitglied: StefanJ
23.03.2006 um 18:50 Uhr
Punkt Ende. Thema geschlossen !

Ich bedanke mich beim Senior Administrator Biber ;)

Gruß & und bis zum nächsten Mal

Stefan
Bitte warten ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ähnliche Inhalte
Batch & Shell
Eventlog Druckjobs mit VBS auslesen (2)

Frage von joni2000de zum Thema Batch & Shell ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (21)

Frage von semperf1delis zum Thema Exchange Server ...

Batch & Shell
gelöst Appx aus Image auslesen und entfernen (9)

Frage von Markus2016 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Netzwerk
Windows 10 RDP geht nicht (16)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (13)

Frage von Motte990 zum Thema Microsoft Office ...