2012-09-25 54 views
2

我有一個前端應用(在PowerBuilder但是這並不重要)。UAC和文件虛擬化創建了調用用Java開發與launch4j包裝輔助應用程序文件

應用程序的最終用戶自由地配置路徑進入其中一些文件將通過任一前端或後端中生成的前端的可能性。

我注意到,在UAC激活的Windows Vista或Windows7上,如果用戶(沒有管理員權限)將輸出配置爲C:\,則會將生成的文件虛擬爲c:\Users\user_name\AppData\Local\VirtualStore\目錄。

但是,當進程使得java應用程序在同一個C:\中創建一些文件(通過FileOutputStream)時,java會因「驅動器根目錄無法訪問用戶,而不是其他應用程序被虛擬化的事實。任務管理器確認其中一個虛擬化而不是另一個。

我發現that other SO question提供了一些線索,但沒有回答我的情況,因爲這兩個應用程序都是在32位系統上的32位,並且兩個都沒有涉及清單。

有沒有辦法讓Java的行爲類似於PB應用程序(即進行虛擬化 - 這一個客戶要求)?當然,更好的解決方案是檢查路徑是否可訪問,如果不是,則通知用戶。

編輯: 注視java.exe的二進制文件,我注意到,它包括一個清單,各國(但我不熟悉)

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

也許是的答案問題:java沒有通過設計虛擬化? 編輯:我也明白,清單機制禁用虛擬化。

EPILOGUE:感謝您的解釋和您的論點有助於改變客戶的要求。現在人們認識到,處理缺乏權限對某些文件夾寫的是不是讓Windows虛擬化在醚某處的文件更好:O)

回答

2

一種更好的方式來處理,這是在電力基礎應用程序禁用虛擬化。

你可以做到這一點被添加到清單一節說,這個過程是Vista的認識。 你可以在MSDN找到更多的信息。

+0

這是什麼決定。通過通過內部清單禁用虛擬化,我們有一個正反兩端的一致行爲。 – Seki

+0

嗚,常識勝:) – Deanna

3

也許這是問題的答案:java沒有通過設計虛擬化?

我想一個更好的方式來思考它是Java是UAC意識 - 你可以通過你找到的清單告訴。由於Java支持UAC,所以Windows確定Java知道它在做什麼。由於清單不請求管理員權限並且由標準用戶運行,Windows正確地禁止寫入受保護的目錄(C:\),並且您將獲得訪問被拒絕的錯誤。

注意在http://msdn.microsoft.com/en-us/library/windows/desktop/bb756960.aspx

虛擬化的警告實施,以提高應用程序的兼容性運行作爲Windows Vista的標準用戶應用 問題。 開發人員不能依賴隨後的 版本的Windows中存在的虛擬化。

如果你的客戶真的認爲虛擬化是一件好事,你需要給Java一個lobotomy並找到一些方法來刪除該清單。然後,Windows會認爲Java不知道它在做什麼,並將重新開啓虛擬化。或者在Java代碼中自己實現虛擬化 - 並檢測對根驅動器,Program Files等的訪問,並將其替換爲c:\ Users \ user_name \ AppData \ Local \ VirtualStore \路徑。

可能有一種方法可以讓UAC感知應用程序恢復虛擬化,而不會破解exe文件,但我無法找到它。

最後的選擇可能是像exe4j來產生一個新的java跑步者。我相信exe4j可以讓你配置生成的可執行文件是否會被UAC識別。在你的情況下,你會想創建一個不UAC感知的exe(沒有清單)。然後使用你的新exe而不是java.exe。請參見http://www.ej-technologies.com/products/exe4j/overview.html

2

您在java.exe的應用程序清單中找到<requestedPrivileges>元素。這是使Java UAC感知的原因。由於Java 明確要求請求標準用戶的特權,所以關閉了虛擬化。

由於already noted,虛擬化可以使舊的應用程序儘可能無縫地工作。所以,最好的解決方案是讓Windows爲您的PowerBuilder前端應用程序添加適當的清單來關閉虛擬化。

另一個建議是在Java中處理Access Denied錯誤,然後嘗試使用虛擬化位置。但這不是一個真正的解決方法:你不應該依靠虛擬化


要檢查路徑是否可訪問是棘手的,除非兩個部分位於同一側。如果一個人虛擬化而另一個人不是,那麼你將面臨現在看到的同樣的問題。我的意思是,如果您在PB中執行檢查,是否可以在指定文件夾中創建文件,您將獲得成功,因爲系統會虛擬化該呼叫。同時,後端將失敗。

相關問題