2009-09-06 41 views
37

Có cách nào trong Java để yêu cầu hệ thống kiểm soát chức năng quản trị viên hay không. Tất nhiên không cần làm: Nhấp chuột phải vào exe -> chạy dưới dạng quản trị viên.
Điều tôi muốn là có một khung từ UAC như trong Windows Vista hoặc Windows 7.Java: chạy với tư cách là quản trị viên

Hoặc tôi có phải thực hiện một số cài đặt trong khi thực hiện một exe khỏi bình?

Trả lời

20

Bạn phải tạo tệp kê khai chỉ định rằng ứng dụng của bạn cần quyền quản trị viên. Bạn có thể bao gồm các biểu hiện trong exe của bạn hoặc giữ nó như là một file riêng biệt (yourapp.exe.manifest)

http://msdn.microsoft.com/en-us/library/bb756929.aspx

+8

Vấn đề tất nhiên là "thực thi" sẽ là JVM, không phải mã của riêng bạn. Và vì tệp kê khai áp dụng cho JVM, nó áp dụng cho bất kỳ thứ gì được chạy bởi JVM đó. – MSalters

+1

Điều gì sẽ xảy ra nếu bạn có exe bao bọc để khởi chạy java? Quyền truy cập quản trị viên có được thừa kế bởi tiến trình con (jvm) không? – Cal

+3

@Cal - Có - khi quá trình được nâng lên, tất cả các quá trình mà nó tạo sẽ được nâng lên. Độ cao UAC theo nghĩa đen thay đổi người dùng mà ứng dụng đang chạy và đó là đường một chiều - bạn có thể nâng cao, nhưng bạn không thể thả xuống. –

8

câu trả lời ZippyV là tốt nếu bạn có ý định để khởi động javaw.exe với quyền quản trị hệ thống, mà nếu mã java thuần túy là những gì bị chặn bởi UAC (chẳng hạn như cố gắng viết một tệp vào một thư mục đặc quyền), thì đó là những gì bạn sẽ cần phải làm.

Nếu, tuy nhiên, bạn đang cố gắng khởi chạy một cái gì đó bên ngoài, nhưng chỉ với độ cao, bạn có thể gói một exe nâng cao một lệnh. Here is one.

+0

Cảm ơn! Bạn thường không muốn một ứng dụng người dùng chạy với tư cách quản trị viên (chỉ một số hành động đặc quyền nhất định), vì vậy đây có lẽ là giải pháp thích hợp hơn trong hầu hết các trường hợp. Tôi cũng thích rằng Elevate.exe có một tùy chọn -wait để bạn có thể chặn cho đến khi lệnh nâng cấp đã hoàn thành. – rob

+0

nếu tôi đọc liên kết của bạn một cách chính xác, người ta cũng phải sửa đổi sổ đăng ký mà có thể không phải lúc nào cũng là một tùy chọn. – likejiujitsu

9

Cách đơn giản nhất là nên sử dụng một wrapper để khởi động JVM của bạn, sau đó nâng cao wrapper. Tôi sử dụng tập lệnh cài đặt NSIS đơn giản với plugin UAC để thực hiện việc này:

; Java Launcher 
;-------------- 

; You want to change the below lines 
Name "my program" 
Caption "my program Launcher"  
Icon "iconfile.ico"  
OutFile "java launcher.exe" 

; param below can be user, admin  
RequestExecutionLevel admin 

!include UAC.nsh 

SilentInstall silent 
AutoCloseWindow true 
ShowInstDetails show 

Section ""  
    ; command to execute  
    StrCpy $0 'javaw -jar myjarfile'  
    SetOutPath $EXEDIR  
    Exec $0  
SectionEnd 
1

Tôi sử dụng dòng lệnh trên cửa sổ cho mục đích này. Từ menu Bắt đầu, nhập cmd vào hộp văn bản và khi chương trình cmd.exe xuất hiện, hãy nhấp chuột phải vào nó và chọn Chạy với tư cách Quản trị viên. Bây giờ, khi ytou thực hiện java -jar, nó sẽ chạy với quyền Quản trị.

+0

Nó làm việc cho tôi, nhờ giải pháp rất đơn giản –

-3

Truy cập java.exe và javaw.exe bên trong thư mục cài đặt. tức là - C: \ Program Files \ Java \ jre7 \ bin hoặc C: \ Program Files \ Java \ jdk1.7.0_17 \ bin nhấp chuột trái vào chúng và chọn properties-> compatability và ở đó: kiểm tra "chạy chương trình này là người quản lý".

+2

Đây là một ý tưởng thực sự tồi, vì nó mang lại cho quyền quản trị chương trình Java _every_. Phần mềm độc hại thậm chí sẽ không cần tận dụng các lỗ hổng bảo mật trong quá trình triển khai Java để p0wn hệ thống của bạn, vì bạn vừa chuyển giao khóa. –

2

Nếu bạn có thể chạy bất cứ thứ gì bạn cần để chạy từ một tập tin hàng loạt CMD .. Bạn có thể tạo tập tin thực thi (ngay cả khi đang bay) từ bên trong ứng dụng java của bạn thực hiện những gì bạn muốn và khởi chạy nó. Tôi có nó làm việc để chương trình java của tôi khởi chạy này và nó bật lên cửa sổ bình thường UAC nhắc nhở cho người dùng và sau đó chạy các lệnh nếu họ chọn YES.

String[] commands = {"cmd.exe", "/C" "mybatchfile.bat"}; 
    ProcessBuilder pb = new ProcessBuilder(commands); 
    .. 
    pb.start(); 

Đây là một chủ đề mà đề với yêu cầu truy cập UAC trong một cửa sổ tập tin batch: How to request Administrator access inside a batch file

LƯU Ý: ProcessBuilder có thể là một chút khó khăn để đối phó với, sử dụng một StreamGobbler để xử lý các công trình đầu ra cho tôi: Handle Input using StreamGobbler

0

tôi sẽ giải thích làm thế nào để bạn có được ứng dụng java cao

import java.io.IOException; 

public class RunAsAdminExample { 
    public static void main(String[] args) throws IOException { 
     Process myappProcess = Runtime.getRuntime().exec("powershell.exe Start-Process <program.exe> -verb RunAs"); 
    } 
} 

program.exe là ví dụ chỉ cần gọi notepad.exe

import java.io.IOException; 

public class RunAsAdminExample { 
    public static void main(String[] args) throws IOException { 
     Process myappProcess = Runtime.getRuntime().exec("powershell.exe Start-Process notepad.exe -verb RunAs"); 
    } 
} 

Hơn bạn đã có chương trình nâng cao. Tôi recommand bạn - Bạn cần chuyển đổi sang wrapper nhị phân như Launch4j hoặc Parcle hơn bạn có thể nhấp vào - (. Làm bằng Java Swing hoặc AWT) Nếu bạn tạo bộ cài đặt tùy chỉnh

tôi hy vọng bạn có giải pháp tốt :) - Nếu bạn sử dụng Linux hoặc Mac OS X hơn bạn cần sử dụng Parcle wrapper nhị phân hoặc wrapper khác nếu bạn biết ...

// EDIT ý tưởng tốt bởi Kaptkaos hơn bạn viết đơn giản:

import java.io.IOException; 

public class RunAsAdminExample { 
    public static void main(String[] args) throws IOException { 
     Process myappProcess = Runtime.getRuntime().exec("powershell.exe Start-Process -FilePath java.exe -Argument '-jar runasadmin.jar' -verb RunAs"); 
    } 
} 

Đừng quên sử dụng '' và '' nếu -jar .jar từ -Bài viết của quá trình bắt đầu. Lưu ý đừng quên - Nếu bạn sử dụng làm việc thư mục và tập tin jar phải làm việc thư mục ví dụ \ java MyJar.jar \ RunAsAdminExample.class hơn bạn có thể thấy java cao với lập luận :)

Trân trọng..!

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