Zugriffe auf Program Ordner

Hallo,

folgender Stand zeigt sich bei mir auf. Mein Java-Programm arbeitet mit der Funktion Drag-and Drop und mit Konfigurationsdateien sowie einer Datenbank im Programmverzeichnis. Auf Windows XP, Vista und 7 läuft alles sehr gut und einwandfrei. Nach einem Update auf Windows 8 funktionierte es leider nicht mehr und es ergibt sich folgender Stand.

a) Drag and Drop funktioniert nicht mehr, wenn ich als Admin angemeldet bin. → Ich habe dann ein neues Standard Konto angelegt mich damit eingeloggt und es funktioniert. Ok verstehe ich!

b) Das Programm startet nicht mehr, da ich als Standard-Benutzer von Windows 8 keinen Vollzugriffe auf den Programmordner besitzte. Ok, verstehe ich auch, aber wie ändere ich das nun :slight_smile:

Mein Ansatz ist nun, bei Installation des Programms auf einem Rechner die Zugriffsrechte für den Programm Ordner auf Vollzugriff zu setzen, dann funktioniert alles (habe ich manuell getestet).

Ich habe das mit einer Batch und ICALCS mit zum Beispiel ICALCS [Folder] /grant Everyone: (CI)(OI)(F)
versucht. Bis dato ohne Erfolg.

Was mache ich falsch oder hat jemand vielleicht eine Idee wie ich außer mit ICALCS das Problem lösen kann?
Für eine Antwort bin ich sehr dankbar.

Alles unter ‘Program’ sollten Dateien sein, die nur gelesen werden.

Deine Konfigurationsdateien und die Datenbank sollte man in anderen Ordnern ablegen. Entweder in komplett eigene Pfade oder in Standardpfaden ‘C:\Users\myName’ plus ‘\AppData\Roaming\myCompany\myApp’.

Ich weiss jetzt nicht genau was der Unterschied von Windows 7 zu 8 ist, aber das dürfte man schnell herausbekommen.

Hallo Falk,

vielen Dank für die schnelle Antwort.
Das ist ein guter Tip mit den Pfaden, ich werde das einmal versuchen in den Installer für meine App einzubauen und gebe dann ein Feedback ob es geklappt hat.

Der Pfad ist übrigens in der Umgebungsvariable APPDATA verfügbar. Damit vermeidet man Probleme in einer Umgebung mit umgeleiteten Pfaden (z. B. Roaming Profilen in einer AD-Umgebung) oder Nichtstandard-Laufwerksbuchstaben (jemand hat Windows z. B. auf Laufwerk D: installiert).

Hallo Falk, Hallo cmrudolph,

vielen Dank noch mal für die Tips und um es vorab zu sagen, es funktioniert nun. Das war die Lösung.
Vielleicht hilft es noch Weiteren, daher schreibe ich mal was ich genau gemacht habe.

Änderungen im Installer
Windows 8 erfordert die Installation als Admin durchzuführen (Schreiben in Program-Files), die veränderbaren Konfigurationsdateien müssen aber in den APPDATA-Ordner von dem User, da die APPDATA-ALLUSER (c:\ProgramData bei WIN 8) auch keinen Vollzugriff erlauben.
Daher habe ich im Installer den ausführenden User bei der Installation ermittelt und die Daten dann dort in den APPDATA für den User und nicht den ADMIN gelegt. Das konnte ich zum Glück beim Installer einstellen und ist sehr wichtig.

Dann noch im Installer geändert, dass der Installer am Ende meine APP nicht starten kann. Windows hält nämlich noch die Adminrechte für den Installationsprozess aufrecht und startet dann die App mit Adminrechten, was wiederum nicht funktioniert.

Änderungen in Java:
Mit dem Befehl System.getenv(“APPDATA”) +"\MYAPP" auf die Dateien zugegriffen.

Mit folgendem Code wird dann noch beim Start geprüft ob der User, der die App-startet Adminrechte besitzt. Wenn nein, kommt eine Meldung und der Abbruch des Starts.

        String groups[] = (new com.sun.security.auth.module.NTSystem()).getGroupIDs();
        for (String group : groups) {
            if (group.equals("S-1-5-32-544")) {
                return true;
            }
        }
        return false;
    }```
Den code habe ich übrigens [hier](http://tech.chitgoks.com/2010/10/21/detect-if-windows-user-has-admin-rights-using-java/) gefunden
Danke noch mal, ich war fast an Win8 verzweifelt :)

Hallo whitetea,

Das Interessanteste am Admin checken ist meiner Meinung nach ‘group.equals(“S-1-5-32-544”)’. Ich wusste gar nicht, dass Windows intern so ‘komisch’ arbeitet. Oder ich erkenne den Sinn hinter dem String nicht.

Anmerkung: Die Prüfung sollte besser ‘if (“myString”.equals(group))’ lauten.

Das ist der Security Identifier (SID) der Gruppe der lokalen Administratoren. Dieser ist unabhängig von der Lokalisierung des Betriebssystemes daher konstant. Bereits zwischen deutschem und englischem Windows heißen die Gruppen nämlich unterschiedlich: „Administratoren“ vs. „Administrators“.

Daher ist das Vorgehen schon sehr sinnvoll.

Edit: zu den integrierten Security-IDs: [MS-DTYP]: Well-Known SID Structures | Microsoft Learn

Erläuterung: Dann kann es nicht zu Nullpointer-Exceptions kommen, weil man .equals auf „myString“ aufruft, was nie null sein kann, statt auf der Variablen, die im Allgemeinen eben auch null sein könnte.