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
 
K

kneitzel

Gast
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?
 

Blender3D

Top Contributor
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
 
K

kneitzel

Gast
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.
 

Marcel91200

Mitglied
@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
 
K

kneitzel

Gast
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.
 

Marcel91200

Mitglied
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Registry Autostart Eintrag ertstellen mit Java (Runtime.getRuntime().exec()) Allgemeine Java-Themen 0
M Autostart: Registry oder Link? Allgemeine Java-Themen 6
R -jar der Windows-Registry hinzufügen Allgemeine Java-Themen 1
F Registry Ordner durchlaufen Allgemeine Java-Themen 1
B Installer, der in die Win-Registry schreibt Allgemeine Java-Themen 10
M Wie mit Jacob die Registry auslesen? Allgemeine Java-Themen 0
D Variablen zur Laufzeit global speichern (Registry Pattern?) Allgemeine Java-Themen 6
E CMD Registry Key für Windows 7? Allgemeine Java-Themen 9
Dit_ Registry, Preferences | Name des Knotens ändern. Allgemeine Java-Themen 2
S Problem mit Registry Allgemeine Java-Themen 3
C Registry auslesen mit Java Allgemeine Java-Themen 13
N Registry Pattern Allgemeine Java-Themen 7
P windows registry lesen Allgemeine Java-Themen 3
conan2 Windows-Registry lesen und schreiben Allgemeine Java-Themen 8
K Registry-Zugriff auch einfacher? (ORACLE_HOME auslesen) Allgemeine Java-Themen 3
A Windows Registry Zugriff Allgemeine Java-Themen 4
M Registry mit jRegistryKey auslesen Allgemeine Java-Themen 7
M swing und windows registry Allgemeine Java-Themen 11
C REG_BINARY Type in Windows Registry ausgeben ? Allgemeine Java-Themen 4
C Registry schreiben und lesen unter Win XP ? Allgemeine Java-Themen 2
S Zugriff auf Windows-Registry Allgemeine Java-Themen 8
_user_q Verknüpfung einer .jar-Datei (liegt z. B. auf dem Desktop) im Autostart-Ordner erstellen? Allgemeine Java-Themen 20
A Autostart android App Allgemeine Java-Themen 4
T Autostart Allgemeine Java-Themen 3
Blender3D Java Swing Programm Windows 10 Autostart Problem Allgemeine Java-Themen 2
R Eclipse Java Autostart Allgemeine Java-Themen 2
P Effizientes Programmieren - oder Windows Autostart fürs Herunterfahren Allgemeine Java-Themen 11
M Autostart Allgemeine Java-Themen 13
J Autostart Allgemeine Java-Themen 11
S Java Applikation zu autostart hinzufügen Allgemeine Java-Themen 7
S Java Webstart Applikation in den Autostart? Allgemeine Java-Themen 3
J Programm von CD startet nicht (autorun/autostart/jre Allgemeine Java-Themen 38
5 usb autostart Allgemeine Java-Themen 3
M in Autostart schreiben? Allgemeine Java-Themen 14
R Übergabe und Autostart von Paint Allgemeine Java-Themen 4
T Autostart Programm - brauche Tipps Allgemeine Java-Themen 5
Ananaskirsche Input/Output Datei durchlesen und Eintrag herauschreiben Allgemeine Java-Themen 18
S CSV Eintrag der nächsten Zeile auslesen funktioniert nicht Allgemeine Java-Themen 8
B MySQL Eintrag erstellen Allgemeine Java-Themen 3
T Windows-Kontextmenü Eintrag hinzufügen? Allgemeine Java-Themen 3
J Eintrag in Datei überschreiben Allgemeine Java-Themen 6
H JPA (EclipseLink) Neuer Eintrag in Collection speichern (unidirektional) Allgemeine Java-Themen 3
S arraylist nach n. Eintrag numerisch Sortiren Allgemeine Java-Themen 5
S MANIFEST DATEI hat nur einen Eintrag Allgemeine Java-Themen 14
M Eintrag verschwindet aus Liste Allgemeine Java-Themen 3
J Path-Eintrag unter Windows 7 Allgemeine Java-Themen 11
Z aus private List<???> list eintrag löschen Allgemeine Java-Themen 4
E Swing hilfe, JWindow mit eintrag in taskleiste Allgemeine Java-Themen 2
M Javadoc | Javadoc Eintrag des verlinkten Element einbetten? Allgemeine Java-Themen 4
D Eintrag im Windows Kontextmenü hinzufügen Allgemeine Java-Themen 4
T LDAP - Eintrag löschen Allgemeine Java-Themen 6
B ArrayList eintrag löschen Allgemeine Java-Themen 3
G Hashset einen eintrag zufällig entfernen Allgemeine Java-Themen 4
thE_29 Kontextmenü Shell Eintrag Allgemeine Java-Themen 35
A Mehrzeiligen Eintrag in Ressourcebundle (.properties-Datei) Allgemeine Java-Themen 8
Luma Diskettenlaufwerk rattert los bei Eintrag in JTree Allgemeine Java-Themen 6
B JComboBox-Eintrag ohne Enter aktualisieren Allgemeine Java-Themen 2

Ähnliche Java Themen


Oben