Registry Autostart Eintrag mit Java erstellen (über Windows cmd)

Marcel91200

Mitglied
Hallo, ich möchte einen Autostart Key mit einem Java Programm erstellen und dachte dass dies am Einfachsten über die Windows Konsole möglich wäre.
Meine Ansätze funktionieren aber leider nicht.
Java:
String value = "\"javaw -jar " + System.getProperty("user.dir") + "\\myjar.jar\"";
        
        String cmd[] = { "reg add ","\"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\"", " /v ","\"Test\"", " /t ", "REG_SZ", " /d ", value };
        Process proc = Runtime.getRuntime().exec("runas /marce/user:Administrator cmd.exe");
        PrintStream ps = new PrintStream(proc.getOutputStream());
        ps.println(cmd);
        System.out.println(Arrays.deepToString(cmd));

sysout(value): "javaw -jar C:\Users\name\eclipse-workspace\project\myjar.jar"

sysout(cmd): [rege add , "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", /v , "Test", /t , REG_SZ, /d , "javaw -jar C:\Users\name\eclipse-workspace\project\myjar.jar"]

[CODE lang="java" title="Weitere Ansätze (gehen auch nicht)"]Runtime.getRuntime().exec("runas /Marcel/user:Administrator cmd.exe "+ cmd);
Oder:
Runtime.getRuntime().exec("cmd /c " + cmd)
[/CODE]

Ich bekomm bei keinem dieser Ansätze einen Error, aber trotzdem wird kein Registryeintrag erstellt, pbwohl der Command in der Windows cmd funktioniert. Vielleicht hat ja jemand ne Idee
 
Nur kurz überflogen, aber cmd ist ein Array aus Strings. Wieso machst du es so kompliziert und schreibst den Befehl nicht gleich als String, wie es ausgeführt werden soll?
 
Ich bekomm bei keinem dieser Ansätze einen Error, aber trotzdem wird kein Registryeintrag erstellt, pbwohl der Command in der Windows cmd funktioniert. Vielleicht hat ja jemand ne Idee
Soweit ich weiß benötigst Du Adminrechte, um in die Registry schreiben zu können. Da das von der Konsole aus funktioniert bist offensichtlich als Administrator angemeldet. Die gestartet jar Datei hat aber keine Adminrechte. Das führt wahrscheinlich zu einer Zugriffsverweigerung.
Du könntest aber versuchen, den Aufruf deines Programms in eine Batchdatei zu schreiben, und diese mit Adminrechten zu starten.
https://praxistipps.chip.de/java-programm-als-administrator-starten-so-gehts_31441
 
Also das mit den Admin-Rechten ist natürlich richtig. Aber das Java Programm lässt sich ja auch per Eingabeaufforderung mit Adminrechten starten...

Auf meinen Punkt noch einmal im Detail: Du gibst ein String Array auf einem PrintStream aus. PrintStream ist auch System.out, daher ein einfacher Test:
Java:
public class Test {

    public static void main(String[] args) {
    String value = "";
        String cmd[] = { "reg add ","\"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\"", " /v ","\"Test\"", " /t ", "REG_SZ", " /d ", value };
    System.out.println(cmd);
    }

}

Was wird hier ausgegeben?

Da kommt etwas raus wie "[Ljava.lang.String;@6fe7aac8" und damit kann eine cmd natürlich nichts anfangen! (Gib es doch einfach mal in einer Eingabeaufforderung ein!)

Das Gleiche gilt für das Zusammenfügen eines Strings mit einem String Array:
Java:
public class Test {

    public static void main(String[] args) {
    String value = "";
        String cmd[] = { "reg add ","\"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\"", " /v ","\"Test\"", " /t ", "REG_SZ", " /d ", value };
    System.out.println("Test: " + cmd);
    }

}
==> "Test: [Ljava.lang.String;@3d51f06e"

Dann noch die Idee mit dem Arrays.deepToString - Da hast Du die Ausgabe ja selbst schon gesehen:
Java:
public class Test {

    public static void main(String[] args) {
    String value = "";
        String cmd[] = { "reg add ","\"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\"", " /v ","\"Test\"", " /t ", "REG_SZ", " /d ", value };
    System.out.println(Arrays.deepToString(cmd));
    }

}
==> [reg add , "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", /v , "Test", /t , REG_SZ, /d , ]

Das sind keine gültigen Befehle! Nimm Dir eine Eingabeaufforderung und bau erst einmal für Dich den korrekten Befehl auf.
- Du fängst bei Befehlen ja nicht mit einem [ an und hörst mit einem ] auf!
- Du separierst nicht mit Komma
- Du setzt ggf. Quotes.

Also ein Befehl könnte so aussehen:
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v "Test" /t REG_SZ /d ""

In einem Java Programm könnte man das dann in etwa so aussehen:
Java:
public class Test {

    public static void main(String[] args) {
    String value = "";
        String cmd = "reg add \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\" /v \"Test\" /t REG_SZ /d \"" + value + "\"";
    System.out.println(cmd);
    }

}

Das ist ein gültiger Befehl.
=> Den kannst Du also in einer Eingabeaufforderung eingeben zum testen
=> Den kannst Du mit cmd /c ausführen (Ohne /c oder /k kannst Du cmd keinen Befehl mitgeben! Wenn Du sowas wissen willst: cmd /? -> Das zeigt Dir eine Referenz des Befehls an.
=> Den cmd /c Befehl kann man natürlich auch in der Eingabeaufforderung testen.
=> Du kannst das dann ggf. auch einer gestarteten cmd in den Eingabestream schreiben. Das sehe ich aber eher als problematisch an. Aber technisch funktioniert es.

Also mein ganz wichtiger Punkt: Teste doch erst von Hand, ehe Du etwas mit Java machen möchtest.
 
@JustNobody
Danke erstmal für die Erklärung. Ich hab diese Möglichkeit, die Registry zu ändern, auch erst im Internet gelesen, wobei es eben mit einem Stringarray erklärt wurde. Deshalb dachte ich, dass man es auf diese Weise machen kann. (Den Befehl hab ich separat natürlich auch ohne die Kommas, etc getestet)

Jetzt hab ich nur immer noch das Problem, dass dieser Command natürlich Adminrechte benötigt. Wenn ich "runas" verwende, möchte cmd ja nochmal extra das Adminpasswort haben und das ist natürlich ziemlich nervig so. Gibt es da eine Alternative, wie man dies einfacher bewerkstelligen kann? Vielleicht auch allgemein den Registryeintrag erstellen ohne cmd?

Aber danke schonmal für die Hilfe. Ich möchte nur das ganze intern vom Programm aus machen und nicht mit einer externen Batch, was natürlich deutlich einfacher wäre
 
Also für den Registry Zugriff auf HKLM brauchst du Admin Rechte und daran kommst du nicht vorbei.

Aber du kannst das ja auch über HKCU machen, dann ist es aber halt nur für den aktuellen User eingetragen und nicht für alle.

Ansonsten wäre der übliche Weg für sowas, dass man das nicht vom eigentlichen Programm aus macht sondern mit einem Setup. Also du bietest dann sozusagen ein MSI an, mit dem User die Software installieren können. So ein MSI kann man auf diverse Wege erstellen, wir haben dafür Windows Installer XML (WIX) verwendet.

Das macht auch noch aus anderen Gründen Sinn, denn so baust du keine Plattform spezifischen Dinge in Dein Programm.
 
Dankeschön für die super Hilfe. Ich hab den Eintrag jetzt HKCU geschrieben, daran hab ich gar nicht gedacht. Für das Programm reicht das aber auch vollkommen aus.
 

Zurück
Oben