2012-09-25 1 views
2

Java로 개발되어 launch4j로 패키지 된 도우미 응용 프로그램을 호출하는 프런트 엔드 애플리케이션 (PowerBuilder에서 중요하지만 중요하지 않음)이 있습니다.Java 생성 파일의 UAC 및 파일 가상화

응용 프로그램의 최종 사용자는 프론트 엔드 또는 백엔드에서 생성되는 일부 파일이있는 프런트 엔드에 대한 경로를 자유롭게 구성 할 수 있습니다.

나는 사용자가 (즉, 어떤 관리자 권한이 없음) C:\ 출력을 구성한 경우 Windows Vista 또는 활성화 UAC와는 Windows7에, 생성 된 파일은 자동으로 c:\Users\user_name\AppData\Local\VirtualStore\ 디렉토리에 가상화되는 것을 알 수 있습니다.

그러나 프로세스가 Java 응용 프로그램에서 FileOutputStream을 통해 일부 파일을 만들면 해당 드라이브 루트에 액세스 할 수 없다는 사실에 일관성이있는 "액세스 거부"예외에서 Java가 실패합니다 하지만 다른 응용 프로그램이 가상화되어 있지는 않습니다. 작업 관리자는 가상화가 아닌 가상화를 확인합니다.

모든 응용 프로그램이 32 시스템의 32 비트이고 두 매니페스트가 모두 관련되어 있지 않으므로 that other SO question은 단서를 제공하지만 내 경우에는 응답자가 아닙니다.

자바가 PB 애플리케이션 (가상화 될 것입니다 - 고객 요청)처럼 동작하도록 할 수있는 방법이 있습니까? 물론 더 나은 솔루션은 경로가 액세스 가능한지 확인하고 그렇지 않은 경우 사용자에게 알리는 것입니다.

는 편집 : java.exe를 바이너리 보면서, 나는 그것이 국가가

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <security> 
    <requestedPrivileges> 
     <requestedExecutionLevel 
        level="asInvoker" 
        uiAccess="false"/> 
    </requestedPrivileges> 
    </security> 
</trustInfo> 

은 어쩌면이의 답변입니다 (하지만 난 그 익숙하지 않은 오전)하는 매니페스트 포함 발견 질문 : 자바는 설계 상 가상화되지 않았습니까? 편집 : 매니페스트 메커니즘이 가상화를 사용할 수 없음을 이해했습니다.

에필로그 : 귀하의 설명에 감사 드리며 귀하의 주장은 고객 요청을 변경하는 데 도움이되었습니다. 이제 일부 폴더에 쓰기 권한이없는 것보다 Windows에서 파일을 가상화하는 것보다 낫습니다. o)

답변

2

더 나은 방법은 power 기본 응용 프로그램에서 가상화를 사용하지 않도록 설정하는 것입니다.

매니페스트에 섹션을 추가하여 프로세스가 비스타를 인식하고 있다고 할 수 있습니다. 자세한 내용은 MSDN에서 확인할 수 있습니다.

+0

그게 결정되었습니다. 내부 매니페스트를 통해 가상화를 사용하지 않도록 설정하면 fornt와 back end 모두 일관된 동작을 보입니다. – Seki

+0

우, 상식 승리 :) – Deanna

3

어쩌면 질문의 대답은 자바가 디자인 상 가상화되지 않았습니까?

나는 자바가 UAC를 인식하고 있다고 생각하는 것이 더 좋은 방법이라고 생각합니다. 발견 한 목록을 통해 알 수 있습니다. Java는 UAC를 인식하므로 Windows는 Java가 수행중인 작업을 알고 있다고 판단합니다. 매니페스트는 관리자 권한을 요청하지 않고 표준 사용자가 실행하므로 Windows에서는 보호 된 디렉터리 (C ​​: \)에 대한 쓰기를 올바르게 허용하지 않으므로 액세스가 거부되었습니다.

참고 http://msdn.microsoft.com/en-us/library/windows/desktop/bb756960.aspx

가상화의 경고는 응용 프로그램 호환성을 Windows Vista에서 표준 사용자로 실행중인 응용 프로그램에 대한 문제를 개선하기 위해 구현됩니다. 개발자는 이후의 버전의 Windows에 가상화가 있어야합니다.

고객이 실제로 가상화가 좋은 것이라고 생각하는 경우 Java에 잎 모양을 제공하고 해당 매니페스트를 제거 할 수있는 방법을 찾아야합니다. 그렇다면 윈도우는 자바가 무엇을하는지 모르고 가상화를 다시 시작할 것이라고 생각할 것이다. Java 코드에서 직접 가상화를 구현하고 루트 드라이브, Program Files 등의 액세스를 감지하여 c : \ Users \ user_name \ AppData \ Local \ VirtualStore \ 경로로 바꿀 수 있습니다.

exe를 해킹하지 않고 UAC 인식 응용 프로그램의 가상화를 다시 설정하는 방법이 있지만 찾을 수 없습니다.

최종 대안은 새로운 Java 러너를 생성하는 exe4j와 같은 것일 수 있습니다. exe4j를 사용하면 결과 실행 파일이 UAC를 인식하는지 여부를 구성 할 수 있다고 생각합니다. 귀하의 경우에는 UAC를 인식하지 못하는 exe (매니페스트 없음)를 생성하고자 할 것입니다. 그런 다음 java.exe 대신 새 exe를 사용하십시오. http://www.ej-technologies.com/products/exe4j/overview.html

2

java.exe의 응용 프로그램 목록에 <requestedPrivileges> 요소가 있습니다. 이것이 Java UAC를 인식하게합니다. Java 이 명시 적으로 표준 사용자의 권한을 요청하기 때문에 가상화가 해제되어 있습니다.

already noted으로 가상화는 가능한 한 원활하게 이전 응용 프로그램을 작동하게합니다. 따라서 좋은 해결책은 적절한 매니페스트를 추가하여 PowerBuilder 프론트 엔드 애플리케이션의 Windows 가상화를 해제하는 것입니다.

또 다른 제안은 Java에서 Access Denied 오류를 처리하고 가상화 된 위치를 시도하는 것입니다. 하지만 이는 실제 수정보다 다소 해결 방법입니다. 가상화에 의존해서는 안됩니다.


경로에 액세스 여부를 두 부분은 같은쪽에 있지 않는 까다로운 여부를 확인합니다. 가상화되고 다른 가상화가 아닌 경우 지금 보는 것과 동일한 문제에 직면하게됩니다. 내 말은, 당신이 PB의 체크를 특정 폴더에 만들 수 있는지 여부를 구현한다면 시스템이 호출을 가상화하기 때문에 성공할 것입니다. 동시에 백 엔드가 실패합니다.