# Windows ermitteln ob Administratorrechte vorhanden



## redbomber (15. Mai 2011)

Hi zusammen,
könnt ihr mir sagen wie ich herausbekomme ob der aktuelle Windows Benutzer Administratorrechte besitzt?

Ich könnte von meinem Java Programm auch die CMD-Shell aufrufen, weiss da abe auch keine Möglichkeit wie ich die Rechte des aktuellen Users überprüfen kann.

Als Alternative hatte ich mir überlegt irgendwo unter "C:\Program Files" eine Datei anzulegen und diese danach wieder zu löschen.
Wenn es nicht geht bin ich kein Admin.


Der Hintergrund wieso ich diese Information benötige ist, dass mein Tool ein Programm updaten soll. Und dies geht eben nur wenn der aktuelle User Dateien löschen/schreiben darf (unter "Program Files")

Vielleicht habt ihr noch eine Idee?


----------



## FGB (15. Mai 2011)

Hi,

also direkt Windows-Rights permission wüsste ich jetzt nicht zu testen. Aber Unter Windows verfügt man mit eingeschränkten Rechten nicht über die Möglichkeit, in z.B. C:\Windows oder C:\Program Files zu schreiben. Du kannst ja einen einfachen File-Permission-Check auf solche Dateien machen. Hast du kein Recht das Verzeichnis zu schreiben, hast du keine Rechte dazu. Ist aber wirklich nur ein Work-Around.

Viel Erfolg noch!

Felix


----------



## faetzminator (15. Mai 2011)

redbomber hat gesagt.:


> Der Hintergrund wieso ich diese Information benötige ist, dass mein Tool ein Programm updaten soll. Und dies geht eben nur wenn der aktuelle User Dateien löschen/schreiben darf (unter "Program Files")



Na dann prüf doch gleich, ob du für die zu updatenden Dateien Schreibrechte hast.


----------



## redbomber (15. Mai 2011)

Ja das hatte ich mir auch überlegt,
aber wie FGB schon erwähnt hat, ist das nur ein Workaround.

Aber vielleicht klappt es einfach nur so, ich werde dies jetzt erstmal so probieren.


Vielen Dank euch!!


----------



## faetzminator (15. Mai 2011)

Du willst ja nicht Admin sein. Sondern nur Dateien ersetzen. Also musst du schauen, ob du diese ersetzen darfst. Stell dir vor, ich geb einem User Schreibrechte für C:\Program Files\, damit er als Dev neue Programme installieren kann. Nun soll deine Updateroutine abbrechen, weil er kein Admin ist ???:L


----------



## Andi_CH (16. Mai 2011)

Ich stehe vor einem ähnlichen Problem - seit heute früh gibt es eine neues Requirement ;-) " Die Software soll warnen, wenn sie mit Admin Privilegien gestartet wird" und das bitteschön portabel (auch Linux)

Linux: whoami -> user und dann groups user auf "root" überprüfen, aber reicht das auch?
Windows? Da habe ich nur ???:L

Ach:  wie finde ich heraus auf welchen BS das Programm läuft? Einfach mal whoami ausführen?


----------



## faetzminator (16. Mai 2011)

Was hat denn ein "Admin" unter Windows für Privilegien? Und wie wirken sich diese aus? "Den Admin" = Super user gibts ja unter Windoof (< Vista / Win7) AFAIK nicht. Unter Linux ist es klar, whoami auf root


----------



## Gast2 (16. Mai 2011)

Andi_CH hat gesagt.:


> Linux: whoami -> user und dann groups user auf "root" überprüfen, aber reicht das auch?


statt [c]whoami[/c] finde ich [c]id[/c] schöner


```
mogel@despina:~$ id
uid=1000(mogel) gid=1000(mogel) Gruppen=1000(mogel),20(dialout),24(cdrom),46(plugdev),122(sambashare)
mogel@despina:~$
```

aber auch unter Linux das - genau wie Windows - nicht so richtig Zielführend ... nur weil ich in einer bestimmten Gruppe bin (oder nicht bin), heißt das noch lange nicht das ich auch das machen darf (oder nverboten bekommen habe) was ich will (vgl. Antwort von faetzminator)


----------



## Andi_CH (16. Mai 2011)

faetzminator hat gesagt.:


> Was hat denn ein "Admin" unter Windows für Privilegien?


???:L
Wer das ernsthaft nicht weiss sollte *nie* ein Windowssystem bedienen dürfen - du bist sicher einer von der Sorte der selbst permanent mit Adminprivilegien arbeitet.


----------



## faetzminator (16. Mai 2011)

1. Zu Hause hab ich kein Windows
2. Im Geschäft hab ich natürlich keine Adminrechte
3. Ich weiss, dass es unter XP den System User gibt, und der darf alles (= Super user?) -> aber man kann sich nicht als solchen einloggen
4. Als ich zu Hause noch mit Windows arbeitete, hatte ich selbstverständlich einen eigenen User dafür, das ist allerdings schon länger her...

Was kann nun denn ein Admin?
- Zugriff auf alle Dateien im Dateisystem? Kann ich mir nicht vorstellen, da man die Reche eines Ordners / einer Datei nur für den Systembenutzer freigeben können müsste. Andererseits könnte auch der "normale" User Schreibrechte auf dem ganzen System haben
- Schreibzugriff auf Regedit? Kann man IMHO auch als normaler User (allenfalls eingeschränkt)

Ich will damit nur sagen, dass unter Linux root (vom Benutzer verwendbar) in meinen Augen dem System-User (nicht verfügbar) enspricht.
Falls ich fachlich einen völligen Sch**** erzählt hab, könnt ihr mich gerne des Besseren belehren.


----------



## Andi_CH (16. Mai 2011)

Aeh mit VIELEN Buchstaben am Ziel vorbei geschossen - wie findet man nun raus ob man unter Windows Adminrechte hat?

Linux ist ja relativ klar jetzt.
Gibt es keinen Javaeigenen Mechanismus?


----------



## FGB (16. Mai 2011)

Hier auch noch eine Möglichkeit, sofern jene noch nicht angesprochen wurde:
Detect If Windows User Has Admin Rights Using Java | Tech Tips Tricks


JAAS Authentication Tutorial
JAAS => Java Authentication and Authorization Service


----------



## redbomber (17. Mai 2011)

also ich habs jetzt wie von faetzminator vorgeschlagen so gelöst, dass ich versuche in dan entsprechende Verzeichnis zu schreiben. Das funktioniert natürlich auch.

Vielen Dank FGB. Ich probiere deinen Vorschlag auch aus!

Vorallem interessiert mich da, was passiert, wenn das Java-Tool als Administrator gestartet wird "run as administrator"
--> der user wäre dann z.b. nur ein normaler User, aber das Programm wird als Administrator ausgeführt. 
Der Vorgang soll also funktionieren.

Anhand von dieser Erklärung 


> The class is called NTSystem and the method below returns true if the user logged in to the Windows workstation has admin rights or none.


vermute ich dass dieser Test (isAdmin()) dann ein false liefert, wäre in diesem Beispiel dann falsch...


----------



## faetzminator (17. Mai 2011)

redbomber hat gesagt.:


> vermute ich dass dieser Test (isAdmin()) dann ein false liefert, wäre in diesem Beispiel dann falsch...



Mach aber unbedingt ein Class.forName("...") für diese Klasse. Ansonsten bringst du das Programm nur noch unter Windows mit der Sun JVM zum Laufen


----------



## Andi_CH (17. Mai 2011)

faetzminator hat gesagt.:


> Mach aber unbedingt ein Class.forName("...") für diese Klasse. Ansonsten bringst du das Programm nur noch unter Windows mit der Sun JVM zum Laufen



Meinst du das? Sieht nicht nett aus  :-( und wie man das mit Class.forName wegbekommt hab ich ncoh nicht herausgefunden.

ansonsten währe das isAdmin auf einem der Links von dir genau das was ich brauche.


```
Multiple markers at this line
	- Access restriction: The type NTSystem is not accessible due to restriction on required library C:
	 \Program Files\Java\jre6\lib\rt.jar
	- Access restriction: The constructor NTSystem() is not accessible due to restriction on required library C:
	 \Program Files\Java\jre6\lib\rt.jar
	- Access restriction: The method getGroupIDs() from the type NTSystem is not accessible due to 
	 restriction on required library C:\Program Files\Java\jre6\lib\rt.jar
```


----------



## faetzminator (17. Mai 2011)

Sieht so aus als dürftest du das nicht. Nein, ich sprach nicht von Compile Time Errors, sondern von Runtime Errors.
Zu Hause hab ich z.B. keine Klasse [c]NTSystem[/c] gefunden. Hier bei der Arbeit (aufm Websphere) heisst sie [c]com.ibm.security.auth.module.NTSystem[/c]. Wenn du die Klasse aber schon gar nicht kompilieren kannst, seh ich da keine Lösung.


----------



## maki (17. Mai 2011)

@Andi_CH
Das lässt sich in Eclipse einstellen:
Preferences -> java -> Compiler-> Errors/Warnings -> Deprecated and restricted API

Kann natürlich sein dass es dann zur Laufzeit kracht


----------



## Andi_CH (17. Mai 2011)

Ich bin noch auf Folgendes gestossen.
(Es hilft möglicherweise auch weiter, aber ich habe nicht versucht die Kommandos aus Java abzusetzen.)


```
C:\Users\av>whoami
desktopav\av

C:\Users\av>net user av
Benutzername                        av
<SNIP>
Lokale Gruppenmitgliedschaften      *Benutzer
Globale Gruppenmitgliedschaften     *None
Der Befehl wurde erfolgreich ausgeführt.

C:\Users\av>
```


----------

