2013-11-28 42 views
7

Tôi đang cố gắng sử dụng Java để tạo khóa khởi động đăng ký và tôi nhận được kết quả thực sự kỳ lạ. Trên một số hệ điều hành như XP lệnh hoạt động hoàn hảo. Tuy nhiên, trên Windows 7 nó chỉ tạo ra khóa nếu bạn chạy jar hoặc các lớp được biên dịch, chứ không phải từ một applet trên một trang web. Ngoài ra trên Windows 8, lệnh không hoạt động chút nào. Tôi đã thử gỡ lỗi này, và có vẻ như lệnh REG đang thực hiện thành công. Nếu tôi chạy lệnh theo cách thủ công từ dấu nhắc lệnh, nó sẽ tạo ra các khóa, với cùng đầu ra như khi nó chạy từ bên trong chương trình. Heres một ví dụ về mã:Lệnh Windows REG không hoạt động khi được thực hiện từ ProcessBuilder trong 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; 
} 

Trong log0.txt nó in này:

Các hoạt động thành công.

Thêm vào đó, "kết quả" của chương trình in

ADD: 0

Vì vậy, tại thời điểm này, tôi đang ở một mất mát của những gì có thể là vấn đề. Tôi nhận thức được các cách dicey khác để thêm vào sổ đăng ký, nhưng tôi muốn giữ mã của tôi tương thích với tất cả các bản phân phối VM. Có cách nào để thực hiện điều này hoặc sửa chữa phương pháp thoát?

+0

Hai thứ nhảy ra, 1- * "và không phải từ applet trên trang web *" Applet chạy trong hộp cát bảo mật, có nghĩa là chúng có chức năng rất hạn chế khi truy cập máy khách, như chạy các quy trình ví dụ, vì vậy trừ khi applet được ký và có các quyền bảo mật thích hợp, điều này sẽ thất bại. 2- Windows 7+ có một mô hình bảo mật khác với XP. Nó có thể là người quản lý bảo mật của Windows đã bước vào và ngừng hành động diễn ra, và làm như vậy lặng lẽ. Có một số lý do chính đáng cho việc này, nhưng tôi đang chạy ra khỏi phòng. – MadProgrammer

+0

Bạn "có thể" thử chạy trình duyệt dưới dạng "Quản trị", nhưng tôi không chắc liệu điều này có tạo sự khác biệt về cách chạy plugin Java ... – MadProgrammer

+2

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

Trả lời

6

Tôi giả định rằng bạn có nhiều máy ảo Java được cài đặt (32 bit, 64bit, ...) và tùy thuộc vào cách bạn thực thi mã của mình một JavaVM khác được sử dụng với kết quả khác.

Ví dụ từ bên trong một applet bạn thường kết thúc trong máy ảo Java 32 bit (vì trình duyệt web là 32 bit và do đó VM cũng phải là 32 bit).

Trong trường hợp này, tôi giả định rằng cũng có phiên bản 32 bit của reg.exe được thực hiện. Cuối cùng, mọi thứ được viết cho HKLM\Software được chuyển hướng đến HKLM\SOFTWARE\Wow6432Node (tương tự cho HKCU\Software ->HKCU\Software\Wow6432Node).

Trong mọi trường hợp, tôi khuyên bạn nên chỉ theo dõi những gì đang thực sự diễn ra. Tải xuống và bắt đầu Sysinternals ProcessMonitor và chỉ cần tra cứu những gì được ghi vào sổ đăng ký nơi chính xác nó được ghi vào. Sau đó, bạn có thể chắc chắn nếu hoặc không phải là khóa registry bạn muốn thêm được tạo ra hay không hoặc nếu bạn chỉ đơn giản là không tìm thấy chúng vì bất kỳ kỹ thuật ảo hóa nào.

+0

Tôi sẽ thực hiện phiên bản 64 bit của reg.exe như thế nào? Hoặc là có một số cách khác xung quanh đó để thêm vào registry thực? – Colby

+0

Không được chuyển hướng đến wow6432node vì các phím cần tương tác với các ứng dụng hiện có – Colby

5

Tôi đã phát triển plugin để tạo khóa trong registry.

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, Nếu bạn gặp bất kỳ sự cố nào, hãy cho tôi biết.

1

Để gỡ lỗi này, bạn có thể thử thực hiện một chương trình khác nói notepad.exe, để kiểm tra xem nó có đang thực thi ở phía máy khách hay không.

Sau đó, bạn có thể thử với "cmd.exe/C reg" thay vì "reg", nó sẽ hoạt động.

Vui lòng cho tôi biết nếu nó hoạt động.

+0

Có, các chương trình khác hoạt động. Reg.exe đang chạy, đó không phải là vấn đề. đó là hình ảnh đăng ký .. – Colby

1

Reg thêm tài liệu:

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

Vì vậy, chúng ta có thể sử dụng http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#exec%28java.lang.String%29

Runtime.exec(String command) để thực hiện lệnh và trả về một quá trình.

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

Bây giờ chúng ta có quá trình biến Mà chứa một phương pháp expesific: http://docs.oracle.com/javase/7/docs/api/java/lang/Process.html#getInputStream%28%29

Process.getInputStream(); 

Hãy tiếp tục với mã của chúng tôi:

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

Tôi đoán đây có thể được kinda hữu ích.

+0

Tôi đã đạt được điều đó! Bài viết gốc cho thấy đầu ra của reg.exe là "Các hoạt động hoàn thành thành công." – Colby

Các vấn đề liên quan