2014-10-30 4 views
5

Java로 설치 프로그램을 작성 중이므로 그에 따라 Program Files 디렉토리에 액세스하는 데 높은 권한이 필요합니다. 내가 권한을 확인하기 위해 사용하고 시험은 대답을 약간 수정 Windows에서 Java 응용 프로그램을 관리자로 실행하십시오.

public static void main(String args[]) { 
    if (!checkPrivileges()) { // spawn a copy w/ elevated privileges 
     Runtime runtime = Runtime.getRuntime(); 
     try { 
      Process p = runtime.exec(
       "runas /profile /user:Administrator \"java -cp . main.Main\""); 
     } catch (IOException e) { ... } 
    } else { 
     // Run with elevated privileges 
    } 
} 
here을 발견하고 다음과 같습니다

다음과 같이 내가 온라인으로 발견 한 것을 정보를 바탕으로, 나는 구현을 작성했습니다 : 예상대로 - -
private static boolean checkPrivileges() { 
    File testPriv = new File("C:\\Program Files\\"); 
    if (!testPriv.canWrite()) return false; 
    File fileTest = null; 
    try { 
     fileTest = File.createTempFile("test", ".dll", testPriv); 
    } catch (IOException e) { 
     return false; 
    } finally { 
     if (fileTest != null) 
      fileTest.delete(); 
    } 
    return true; 
} 

나는이 실행

, 그것은 권한 테스트를 실패하고 간부로 호출합니다. p.isAlive()을보고 통화가 작동하는지 확인하면 프로세스가 실제로 살아 있음을 알 수 있습니다. 그러나 새 프로세스에 대한 어떠한 증거도 보이지 않으며 Windows에서 사용 권한을 부여하라는 메시지를 표시하지 않습니다.

저는 Java에서 exec()을 사용하는 것에 익숙하지 않아 어떻게 든 사용법을 오해 한 것 같습니다. 그 문제에 관해서, 내가 여기서도 할 수있는 일이 가능한 것인가? 그렇지 않다면, 제가 찾고있는 결과를 실제로 얻을 수있는 직접적인 대안이 있습니까?

+1

윈도우 8에서는'runas '를 사용하여 실제로 UAC 팝업을 불러 오지 않고 대신 stdin을 통해 입력 할 암호를 묻습니다. 명령 프롬프트 창에서'runas/profile/user : Administrator notepad'를 실행하십시오. 귀하의 문제를 설명 할 수 있습니다. – Pokechu22

+1

실제로 여기에있는 것처럼 보입니다. 나는 이것이 단지 후속 질문으로 이어질 것이라고 생각한다 : Java로 UAC 팝업을 어떻게 불러올 수 있는가? 내 대상 플랫폼은 Windows 7입니다 (Windows 8 플랫폼에서 개발 중이지만). 이 코드가 해당 플랫폼에서 의도 한대로 작동합니까? – bionicOnion

+1

한 가지 해결책은 Java 프로그램을 다시 시작하기 위해 C로 간단한 응용 프로그램을 작성하는 것입니다. 응용 프로그램 매니페스트에 응용 프로그램을 지정하여 Windows에 권한 상승이 필요하다고 알릴 수 있습니다. 그러나 Java로 직접 할 수있는 방법이있을 수 있습니다. 흥미로운 질문입니다. +1. –

답변

1

오케이, 마침내 나는이 문제에 대한 해결책을 얻을 수있었습니다. 추악한 편이긴하지만, 내가하고있는 일에 효과가있다.

this에서 코드를 빌려 실제 권한 상승을 수행합니다. 거기에서 문제는 실제로 자바로 작업 할 수있는 솔루션을 얻는 것이 었습니다. 그 코드는 다음과 같이 찾고 끝 :

if (!checkPrivileges()) { 
     try { 
      String jarPath = DownloaderMain.class.getProtectionDomain().getCodeSource().getLocation().getPath(); 
      String decodedPath = URLDecoder.decode(jarPath, "UTF-8"); 
      decodedPath = decodedPath.substring(1, decodedPath.length()); 
      Elevator.executeAsAdministrator(System.getProperty("java.home") + "\\bin\\java", "-jar " + "\"" + decodedPath + "\""); 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } 
    } else { 
     // Run with elevated privileges 
    } 

checkPrivileges 방법은 위에서 변경하고 Elevator 클래스 (난 그냥 불필요한 main 방법을했다) 링크 솔루션에 나타나는 것과 거의 동일하다 . 이 솔루션은 승격 될 프로세스가 항아리라고 가정합니다. 개인의 필요에 맞게이를 변경하는 것이 너무 어렵지 않아야합니다.

0

저는 이것을 달성하는 가장 좋은 방법은 간단한 자바로는 할 수 없기 때문에 개발자를 위해 Microsoft에서 만든 도구를 사용하는 것이라고 생각합니다. 이 경우 매니페스트 파일을 사용하십시오. http://msdn.microsoft.com/en-us/library/aa375632(v=vs.85).aspx 이 권한을 요청한 후 Java 프로그램을 생성하는 래퍼 .exe를 빌드하십시오.