2013-11-28 18 views
7

मैं स्टार्ट अप रजिस्ट्री कुंजी बनाने के लिए जावा का उपयोग करने की कोशिश कर रहा हूं और मुझे वास्तव में अजीब परिणाम मिल रहा है। कुछ ओएस जैसे एक्सपी पर कमांड काम करता है। हालांकि, विंडोज 7 पर यह केवल कुंजी बनाता है यदि आप संकलित जार या कक्षाएं चलाते हैं, न कि किसी वेब पेज पर एप्लेट से। इसके अतिरिक्त विंडोज 8 पर, कमांड बिल्कुल काम नहीं करता है। मैंने इसे डीबग करने का प्रयास किया है, और ऐसा लगता है कि आरईजी कमांड सफलतापूर्वक निष्पादित कर रहा है। यदि मैं कमांड प्रॉम्प्ट से मैन्युअल रूप से कमांड चलाता हूं, तो यह उसी आउटपुट के साथ कुंजी बनाता है जब यह प्रोग्राम के अंदर से चलाया जाता है। यहाँ कोड का एक उदाहरण:जावा आरईजी कमांड जावा में प्रोसेसबिल्डर से निष्पादित होने पर काम नहीं कर रहा है

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; 
} 

log0.txt में यह इस प्रिंट:

आपरेशन सफलतापूर्वक पूर्ण हुआ।

इसके अतिरिक्त, कार्यक्रम प्रिंट

की "परिणाम"

जोड़ें: 0

तो इस बिंदु पर, मैं क्या समस्या हो सकती है की एक नुकसान में हूँ। मैं रजिस्ट्री में जोड़ने के अन्य पागल तरीकों से अवगत हूं, लेकिन मैं अपने कोड को सभी वीएम वितरणों के साथ संगत रखना चाहता हूं। क्या इसे पूरा करने या बाहर निकलने की विधि को ठीक करने का कोई तरीका है?

+0

दो चीजें बाहर निकलती हैं, 1- * "और एक वेब पेज पर एक एप्लेट से नहीं *" एप्लेट एक सुरक्षा रेत बॉक्स के भीतर चलाते हैं, जिसका मतलब है कि क्लाइंट मशीन तक पहुंचने की बात आती है, जैसे वे चलने की तरह बहुत सीमित कार्यक्षमता रखते हैं उदाहरण के लिए प्रक्रियाएं, इसलिए जब तक एप्लेट पर हस्ताक्षर नहीं किया जाता है और उचित सुरक्षा अनुमतियां होती हैं, तो यह असफल हो जाएगी। 2- विंडोज 7+ के पास एक अलग सुरक्षा मॉडल है तो एक्सपी। ऐसा हो सकता है कि विंडोज सुरक्षा प्रबंधक ने कदम उठाया है और कार्रवाई को रोकने से रोक दिया है, और इतनी चुपचाप किया है। इसके लिए कुछ अच्छे कारण हैं, लेकिन मैं कमरे से बाहर निकल रहा हूं। – MadProgrammer

+0

आप "व्यवस्थापक" के रूप में ब्राउज़र को चलाने का प्रयास कर सकते हैं, लेकिन मुझे यकीन नहीं है कि इससे जावा प्लगइन कैसे चलाया जा सकता है ... – MadProgrammer

+2

[रजिस्ट्री वर्चुअलाइजेशन (विंडोज) - एमएसडीएन - माइक्रोसॉफ्ट] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa965884(v=vs.85).aspx) – Holger

उत्तर

6

मुझे लगता है कि आपके पास एकाधिक जावा वीएम इंस्टॉल हैं (32 बिट, 64 बिट, ...) और यह निर्भर करता है कि आप अपने कोड को कैसे निष्पादित करते हैं, एक अलग परिणाम के साथ एक अलग जावावीएम का उपयोग किया जाता है।

उदाहरण के लिए एक एप्लेट के भीतर से आप आमतौर पर 32 बिट जावा वीएम में समाप्त होते हैं (क्योंकि वेब ब्राउज़र 32 बिट है और इसलिए वीएम को भी 32 बिट होना चाहिए)।

ऐसे मामले में मुझे लगता है कि reg.exe का 32 बिट बनाम भी निष्पादित किया गया है। अंत में HKLM\Software पर लिखे गए सभी को HKLM\SOFTWARE\Wow6432Node पर रीडायरेक्ट किया गया है (HKCU\Software ->HKCU\Software\Wow6432Node के लिए)।

किसी भी मामले में मैं दृढ़ता से आपको सलाह देता हूं कि वास्तव में क्या चल रहा है इसकी निगरानी करें। Sysinternals ProcessMonitor डाउनलोड करें और शुरू करें और रजिस्ट्री में जो लिखा गया है उसे देखें, जहां वास्तव में लिखा गया है। फिर आप यह सुनिश्चित कर सकते हैं कि यदि रजिस्ट्री कुंजियां आप जोड़ना चाहते हैं या नहीं, या यदि आप उन्हें वर्चुअलाइजेशन तकनीकों में से किसी के कारण नहीं पाते हैं।

+0

मैं reg.exe के 64 बिट संस्करण को निष्पादित करने के बारे में कैसे जाउंगा? या असली रजिस्ट्री में जोड़ने के लिए उसके आसपास कुछ और तरीका है? – Colby

+0

इसे wow6432node पर रीडायरेक्ट नहीं किया जाना चाहिए क्योंकि कुंजी को मौजूदा अनुप्रयोगों के साथ बातचीत करने की आवश्यकता है – Colby

5

मैंने रजिस्ट्री में कुंजी बनाने के लिए प्लगइन विकसित किया।

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, यदि आपको कोई समस्या है तो मुझे बताएं।

1

इसे डीबग करने के लिए, आप किसी अन्य प्रोग्राम को निष्पादित करने का प्रयास कर सकते हैं, यह नोट करने के लिए कि यह क्लाइंट पक्ष पर निष्पादित है या नहीं।

फिर आप "reg" के बजाय "cmd.exe/C reg" के साथ प्रयास कर सकते हैं, यह काम करेगा।

कृपया मुझे बताएं कि यह काम करता है या नहीं।

+0

हां, अन्य प्रोग्राम काम करते हैं। reg.exe चल रहा है, यह समस्या नहीं है। यह रजिस्ट्री विज़ुअलाइज़ेशन है .. – Colby

1

रेग प्रलेखन जोड़ें:

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

तो हम http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#exec%28java.lang.String%29

Runtime.exec(String command) उपयोग कर सकते हैं आदेश निष्पादित और एक प्रक्रिया वापस जाने के लिए।

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

अब हम प्रक्रिया चर जो एक expesific विधि शामिल है: http://docs.oracle.com/javase/7/docs/api/java/lang/Process.html#getInputStream%28%29

Process.getInputStream(); 

के हमारे कोड के साथ ही जारी रखते हैं:

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

मुझे लगता है कि इस थोड़े सहायक हो सकता है।

+0

मैं पहले से ही इसे प्राप्त कर चुका हूं! मूल पोस्ट से पता चलता है कि reg.exe का आउटपुट "ऑपरेशन सफलतापूर्वक पूरा हो गया है।" – Colby

संबंधित मुद्दे