# Java und Vista UAC



## Claude M (3. Apr 2008)

Hallo Forum!!

Ich habe Probleme mein Programm an Vista anzupassen. Es gibt zwar Dokumente im Internet die einem dabei helfen sollen aber nichts speziell für Java. Oder ich hab's nur nicht gefunden. 
Vielleicht hat mir jemand einen Link?

Ein grosses Problem welches ich habe ist folgendes:

Wie teste ich die Schreibrechte bei Vista?
new File("foo").canWrite() gibt praktisch immer _true_ zurück, auch wenn man nur mit Adminrechten die Datei ändern darf. Ich muss eine bestehende Datei umbenennen (renameTo) und das wieder rückgängig machen um zu sehen ob ich Schreibrechte habe. Ist das ein Bug von Vista oder von Java oder mache ich was falsch? 

Was ich konkret anstellen will:

Also ich hab ein Programm mit Updatefunktion. Als Installer wird install4j verwendet.

Normalerweise wird Software als Admin installiert. Das ist auch gut so und ich will auf keinen Fall den User zwingen das Programm im home zu installieren, das wäre wirklich sehr unschön.

Das Update ist so gelöst:
Das Haupt-Jar startet per exec() ein update.jar welches das Programm mit einer runtergeladen Version ersetzen soll.
(Anmerkung: Das ist nur auf Win so, denn auf Unix kann ein Jar sich selbst ersetzen.)

Die Mac- und Linux-User haben eh keine andere Möglichkeit als das Tool als root zu starten denn sonst geht garnichts.

Auf WinXP ist man meist eh Admin und somit hat der User kein Problem mit dem Update (dafür einige Sicherheitsprobleme, aber das ist ein anderes Thema).

Auf Vista klappt das Update nicht, denn der User hat keine Adminrechte, wenn er eine Applikation wie die meine normal startet. Nur wenn Vista erkennt, dass es ein Installer oder Update-Tool ist gibt er dem Programm mehr Rechte. da ich aber /bin/java starte und nicht ein eigenes binary hat mein updater diese Rechte nicht.

Momentan gebe ich eine Meldung aus dass der User das Programm als Administrator starten muss (Rechtsklick) und dann klappts auch. Schöner wärs wenn ich so eine Vistameldung bringen kann und der User bestätigen muss dass es ok ist was mein Programm da tun will. (Wer gksudo kennt weiss was ich meine.)

Claude


----------



## HoaX (3. Apr 2008)

hab ich neulich erst links zu gepostet. das einfachste für vista ist eine eigene jvm mit zu liefern der ein vista-manifest für die java(w).exe beiliegt.

nachtrag: http://www.java-forum.org/de/viewtopic.php?t=66712&highlight=


----------



## Claude M (3. Apr 2008)

OK, vielen dank. Werde mir die Links dann mal genauer anschauen.

In dem Fall werde ich mit Delphi ein kleines update.exe erstellen welches dann mein update.jar startet.
Vielleicht geht's ja dann.


----------



## Claude M (3. Apr 2008)

OK, bin nun soweit, dass das Update funktioniert.
man braucht einfach nur ein update.exe welches dann folgendes ausführt:

```
java -jar update.jar
```
da update.exe nicht signiert ist muss der User das bestätigen.
weil update.exe das wort "update" enthält weiss Vista, dass es mehr Rechte benötigt. 
Wenn update.exe dann java ausführt erbt dies die Rechte von update.exe.

Wenn der Benutzer als Gast eingeloggt ist geht's aber trotzdem nicht!

Claude


----------



## Claude M (11. Apr 2008)

hab jetzt bemerkt dass das doch nicht geht.
man müsste erst einen Registry-Eintrag setzen damit java überhaupt ein exe ausführen kann. ansonsten geht garnichts.
Windows würde das zwar unter umständen selbst machen aber bei meiner Applikation nicht. vermutlich weil ich einen Starter verwende und nicht direkt java.exe ausgeführt wird.

Claude


----------



## Claude M (12. Nov 2009)

Ich hab bei Microsoft angefragt und die Lösung erhalten:
?ukasz milewski home Blog Archive  Using Vista’s UAC in SWT

Man braucht also nur swt.jar einzubinden und dann gehts.
Für Swing hab ich nichts gefunden.
Seltsam ist das Eclipse das anscheinend selbst nicht verwendet?!
Die Speichern die Updates im Userverzeichnis, was ja nicht gerade schön ist.


----------



## Guybrush Threepwood (12. Nov 2009)

Du kannst auch einen Exe-Wrapper (insbesondere launch4j) nehmen, wo sich ein Vista-Manifest einfügen lässt.


----------



## Wildcard (12. Nov 2009)

Claude M hat gesagt.:


> Seltsam ist das Eclipse das anscheinend selbst nicht verwendet?!
> Die Speichern die Updates im Userverzeichnis, was ja nicht gerade schön ist.


Das ist nicht nur nicht nicht schön, sondern sogar erwünscht. In einem Mehrbenutzerszenario kann dadurch jeder sein eigenes set an PlugIns und Updates haben, ohne das es einfluss auf andere Benutzer hat.


----------



## masta // thomas (13. Nov 2009)

Du könntest auch den "upzudatenden" Teil deiner App in %APPDATA% packen - damit hast du die Schreibberechtigung sichergestellt. Blöd nur dann, wenn die Core upgedatet werden muss.


----------

