Java App unter Windows keine Schreibrechte

sabek

Grünschnabel
Hallo,
ich habe eine kleine Anwendung in Java geschrieben (unter jdk1.6.0_17). Diese besitzt eine Exe (mit launch4j erstellt) und einen Installer (mit NSIS erstellt).
Alles funktioniert wunderbar. Nur leider muss mein Programm ab und zu in eine Datei schreiben, welches sich in einem Unterordner befindet. Das klappt auch, wenn der User Schreibrechte auf diese Ordner hat.
Unter Vista und Windows7 hat aber der normale User eben keine Schreibrechte auf "C:\Programme\" usw.

Man kann die Software installieren und anschließend manuell das Häkchen setzen "Als Administrator ausführen", dann klappt es auch. So ist das bis jetzt, aber schöner wäre es wenn das automatisch bei der Installation geschieht. Es gibt eben User und User ;)

Meine Fragen sind:
1) Einfachste Methode (wäre mir am liebsten, dann müsste ich nichts mehr am Programm ändern):
Kann man beim Installieren nicht direkt über Registry die Schreibrechte auf diesen Ordner setzen, für die Installation sind Adminrechte eh schon Voraussetzung ?
Wenn ja,welche Schlüssel wären dass und wie schreibe ich die (ausführen würde es der NSIS Installer) ?
Habe noch nie einen Registry Schlüssel geschrieben.

2) Andere Methode:
Programm unter "C:programme" oder wo auch immer installieren und die Datei, die beschrieben wird in "C\Dokumente und Einstellungen\User\Anwendungsdaten\MyApp". Dann müsste man auch als normaler Benutzer dort schreiben können.
Nur wie lese ich mit java den Pfad "C\Dokumente und Einstellungen\User\Anwendungsdaten\" aus ?
Mit property "user.home", bekomme ich nur "C\Dokumente und Einstellungen\User". Das Wort "Anwendungsdaten" würde ich nicht manuell dahinter schreiben, da nicht jeder deutsches Windows hat.

Für einen Rat wäre ich dankbar.
 
Hallo,

du kannst nichts an den Schreibrechten des Betriebssystems ändern.

Was du machen könntest wäre, dass du halt den User-Home-Pfad nimmst, das machen einige Programme auch so.

Gruß

Sascha
 
Hallo,

mit der Umgebungsvariable APPDATA solltest du bei jedem Betriebssystem ins richtige Verzeichnis kommen.
Bei mir unter Windows 7 führt APPDATA auf "C:\Users\<Username>\AppData\Roaming", oder unter Win 2003 Server auf "C:\Documents and Settings\<Username>\Application Data" und dort sind auch die Daten anderer Applikationen.

Wenn du manuell "Anwendungsdaten" hinzufügst, wirst du Probleme mit der Kompatibilität bekommen, denn das ist bei jedem Betriebssystem und manchmal auch je nach Sprache anders.

Gruss Rambomaster
 
@ Rambomaster
Ob ich mit APPDATA wirklich bei jedem Betriebssystem ins richtige Verzeichnis komme, weiß ich nicht da ich keine Möglichkeit habe es auszuprobieren.

gelöst habe ich es jetzt mit 2 Methoden:

Variablen:

Java:
        private String osName;                // Name des Betriebssystems
	private String userHome;            // bei Windows C:\Dokumente und Einstellungen\User
	private String applicationData;   // bei Windows C:\Dokumente und Einstellungen\User\Anwendungsdaten
	private File workingDirectoryPath = new File(".");      // bei Windows C:\Dokumente und Einstellungen\User\Anwendungsdaten
	private final String programGroupName = "AppName";  // GruppenName wird benötigt um einen Ordner abzulegen im Arbeitsverzeichnis

1. Methode wird immer beim Programmstart ausgeführt

Java:
/**
 * Ermittelt das User Arbeitsverzeichnis.
 */
 private void resolveWorkingDirectoryPath(){

        userHome = System.getProperty("user.home");
        osName = System.getProperty("os.name").toLowerCase();
        
        if (osName.contains("windows")){
          applicationData = System.getenv("APPDATA");
             if (applicationData != null) {
        	   workingDirectoryPath = new File( applicationData, "."+ programGroupName);
             }else{
        	   workingDirectoryPath = new File( userHome, "."+ programGroupName);
             }
        }else if ( osName.contains("linux") || osName.contains("mac") || osName.contains("solaris") ){
        	workingDirectoryPath = new File(userHome, "."+ programGroupName);
        }
 }


2. Methode liefert bei Bedarf diesen Pfad
Java:
/**
 * Gibt das Arbeitsverzeichnis des Users zurück.
 * @return (File) workingDirectoryPath
 */
	public File getWorkingDirectory(){
		if(workingDirectoryPath!=null){
	           if (!workingDirectoryPath.exists()) {
	              if (!workingDirectoryPath.mkdirs()){
	                    JOptionPane.showMessageDialog(null,
	      	    	         "Das Arbeitsverzeichnis in :\n"+
	      	    	          " \""+workingDirectoryPath.getAbsolutePath() +"\"\n"+
	      	    	          "konnte nicht erstellt werden. Weitere Nutzung der Software ist somit nicht mehr möglich.\n"+
	      	    	          "Bitte wenden Sie sich an den Support. Die Anwendung wird jetzt beendet.\n",
	      	    	         " FEHLER",
	      	    	         JOptionPane.ERROR_MESSAGE,
	      	    	         null);
	              System.exit(0);
	            }
	          }
		}	
	  return workingDirectoryPath;
	}
 
Ehm ja, unter jedem Betriebssystem natürlich nicht ^^ aber zumindest unter Windows solltest du so immer ins Verzeichniss für die Userspezifischen Programmdaten kommen.
 
Ich würde dir immer noch empfehlen es einfach mit "user.home" zu lösen. Wie gesagt, das lösen mehrere Programme so, die auf mehreren Betriebssystemen laufen.

Gruß

Sascha
 
@zerix
Wie du siehst nutze ich userHome = System.getProperty("user.home"); bei den Unix-basierten Betriebssystemen (Solaris keine Ahnung, habe ich noch nie gesehen). Unter Windows gehe ich aber in die Anwendungsdaten bzw. AppData unter Win7.
Getestet habe ich es unter Win98, Win2000 Pro, WinXP Pro und unter Win7. funktioniert alles wunderbar.
 
user.home funktioniert auch bei allen Unix-Basierenden Systemen. Da hat auch jeder Nutzer einen eigenen Ordner. Allerdings gibt es dort keinen Ordner Anwendungsdaten. Da werden alle Ordner von den Programmen im user.home-Verzeichnis abgelegt.

Gruß

Sascha
 
Zurück