2013-11-28 21 views
7

Sto provando ad utilizzare Java per creare una chiave di registro di avvio e sto ottenendo un risultato davvero strano. Su alcuni SO come XP, il comando funziona in modo impeccabile. Tuttavia, su Windows 7 crea la chiave solo se si esegue il jar o le classi compilati e non da un'applet in una pagina Web. Inoltre su Windows 8, il comando non funziona affatto. Ho provato il debug di questo, e sembra che il comando REG sta eseguendo con successo. Se eseguo il comando manualmente dal prompt dei comandi, crea le chiavi, con lo stesso risultato di quando viene eseguito all'interno del programma. Ecco un esempio del codice:Il comando Windows REG non funziona quando viene eseguito da ProcessBuilder in Java

public static int regadd(String key, String name, String val) throws IOException, InterruptedException { 
    ProcessBuilder pb = new ProcessBuilder(new String[]{"REG", "ADD", key, "/v", name, "/d", val, "/f"}); 
    pb.redirectOutput(new File(PathManager.getDirectory(), "log0.txt")); 

    int i = pb.start().waitFor(); 
    Logger.log("ADD: " + i); 

    return i; 
} 

In log0.txt esso stampa questo:

L'operazione è stata completata con successo.

Inoltre, il "risultato" delle stampe del programma

ADD: 0

Quindi a questo punto, io sono in perdita di quello che potrebbe essere il problema. Sono a conoscenza degli altri modi rischiosi da aggiungere al registro, ma vorrei mantenere il mio codice compatibile con tutte le distribuzioni VM. C'è un modo per realizzare questo o risolvere il metodo di uscita?

+0

Due cose saltano fuori, 1- * "e non da un'applet in una pagina web *" Le applet vengono eseguite all'interno di una sandbox di sicurezza, il che significa che tendono ad avere funzionalità molto limitate quando si tratta di accedere al computer client, come l'esecuzione ad esempio, ad esempio, a meno che l'applet non sia firmata e disponga delle autorizzazioni di sicurezza appropriate, ciò fallirà. 2- Windows 7+ ha un modello di sicurezza diverso da XP. Potrebbe essere che il responsabile della sicurezza di Windows è intervenuto e ha impedito l'azione e si è svolto in modo silenzioso. Ci sono alcune buone ragioni per questo, ma sto esaurendo la stanza. – MadProgrammer

+0

You "potrebbe" provare a eseguire il browser come "Admin", ma non sono sicuro se questo farà la differenza per il modo in cui il plug-in Java è gestito ... – MadProgrammer

+2

[Registry Virtualization (Windows) - MSDN - Microsoft] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa965884(v=vs.85).aspx) – Holger

risposta

6

Suppongo che siano installate più macchine virtuali Java (32 bit, 64 bit, ...) e, a seconda di come si esegue il codice, viene utilizzato un JavaVM diverso con un risultato diverso.

Per esempio all'interno di un applet di solito finisce in 32 bit Java VM (in quanto il browser web è a 32 bit e, pertanto, la VM deve anche essere a 32 bit).

In tal caso presumo che venga eseguita anche la versione a 32 bit di reg.exe. Alla fine, tutto ciò che viene scritto su HKLM\Software viene reindirizzato su HKLM\SOFTWARE\Wow6432Node (uguale a HKCU\Software ->HKCU\Software\Wow6432Node).

In ogni caso vi consiglio caldamente di monitorare ciò che sta realmente accadendo. Scarica e avvia Sysinternals ProcessMonitor e cerca semplicemente ciò che è scritto nel registro dove esattamente è scritto. Quindi puoi essere sicuro che se o non le chiavi di registro che vuoi aggiungere siano create o meno o semplicemente non le trovi a causa di una qualsiasi delle tecniche di virtualizzazione.

+0

Come posso eseguire l'esecuzione della versione 64 bit di reg.exe? O c'è un altro modo per aggiungerlo al registro reale? – Colby

+0

Non deve essere reindirizzato a wow6432node perché le chiavi devono interagire con le applicazioni esistenti – Colby

5

Ho sviluppato un plugin per creare la chiave nel registro.

import javaQuery.core.Registry; 
import javaQuery.importClass.javaQueryBundle; 

public class Demo { 
    public static void main(String[] args) { 
     String response = javaQueryBundle.createRegistry().createKey(Registry.HKEY_CURRENT_USER, "\\jqreg", Registry.key_String_Value, "Software", "javaQueryAPI"); 
     System.out.println(response); 
    } 
} 

Download library file, se avete qualunque problema non me lo faccia sapere.

1

Per eseguire il debug di questo, è possibile provare con l'esecuzione di un altro programma dire notepad.exe, per verificare se è in esecuzione sul lato client o meno.

Si può quindi provare con "cmd.exe/C reg" invece di "reg", funzionerà.

Gentilmente fammi sapere se funziona.

+0

Sì, altri programmi funzionano. reg.exe è in esecuzione, non è questo il problema. è la visualizzazione del registro .. – Colby

1

Reg aggiungere documentazione:

http://technet.microsoft.com/en-us/library/cc742162.aspx

modo che possiamo utilizzare http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#exec%28java.lang.String%29

Runtime.exec(String command) per eseguire il comando e restituire un processo.

Process proc = Runtime.getRuntime().exec("REG ADD HKLM\Software\MyCo /v Data /t REG_BINARY /d fe340ead"); 

Ora abbiamo il processo wich variabile contiene un metodo expesific: http://docs.oracle.com/javase/7/docs/api/java/lang/Process.html#getInputStream%28%29

Process.getInputStream(); 

Continuiamo con il nostro codice:

InputStream in = proc.getInputStream(); 
for (int i = 0; i < in.available(); i++) { 
    System.out.println("" + in.read()); 
} 

Credo che questo possa essere un po utile.

+0

Ho già ottenuto così lontano! Il post originale mostra l'output di reg.exe è "L'operazione è stata completata con successo." – Colby