2011-07-12 32 views
2

中的文件時遇到「訪問被拒絕」我們的客戶經常報告他們在運行使用下載的安裝文件安裝的應用程序時遇到「訪問被拒絕」異常的問題。我們的安裝程序在'Program Files'上安裝可執行文件並在C:\ ProgramData上創建配置文件。安裝完成後,我們的應用程序會自動運行。無論何時用戶下次運行它時,都會拋出訪問被拒絕,因爲程序無法訪問C:\ ProgramData中的配置文件。嘗試訪問C: ProgramData

是的..「以管理員身份運行」是解決方案,但我們不能要求我們所有的付費用戶這樣做。我已搜索選項,可以通過一些替代方式設置權限,然後手動運行可執行文件爲「以管理員身份運行」。我發現help page但這不適合我。我的應用程序是java桌面應用程序,所以我創建了.exe.manifest文件,並將該清單文件放置在圖像和其他產品屬性文件所在的可執行文件中。

Manifest對我不起作用,我仍然在「拒絕訪問」問題。

這是清單文件的內容 -

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <assemblyIdentity version="1.0.0.0" 
    processorArchitecture="X86" 
    name="<product_name>" 
    type="win32"/> 
    <description>Description of your application</description> 
    <!-- Identify the application security requirements. --> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
    <security> 
     <requestedPrivileges> 
     <requestedExecutionLevel 
      level="requireAdministrator" 
      uiAccess="true"/> 
     </requestedPrivileges> 
     </security> 
    </trustInfo> 
</assembly> 

我怎麼能把應用程序清單的可執行文件,我只複製的清單,其中圖像和其它產品的屬性文件所在?

是否有任何事情需要在清單文件中更新,因爲我複製了原樣內容,除了?

例外 -

​​
+0

爲什麼不通過右鍵單擊安裝文件和「以管理員身份運行」進行安裝?它會給予管理員權限,當你啓動應用程序時,你不會得到「訪問被拒絕」。 –

+0

應該與'.exe'文件位於同一個目錄中。 http://msdn.microsoft.com/en-us/library/aa376618(v=VS.85).aspx –

+0

是的我曾嘗試使用相同的名稱,並在同一目錄中,但沒有工作。我的可執行文件名稱是 .exe,我的清單名稱是 .exe.manifest,我已將它們複製到同一個文件夾中,但未起作用 –

回答

0

它拋出訪問被拒絕

難道是真的嗎?

沒有這樣的例外。

什麼是實際例外,而且實際消息,什麼實際行代碼就在拋出?

+0

我編輯了我的原始文章。請看看實際例外 –

+0

@Ashish Pancholi,以便運行程序的用戶無法訪問該目錄。可能它是一個與安裝該程序的用戶不同的用戶,並且你陷入了Windows權限的惡夢,尤其是在Vista下。您將不得不查看您的安裝策略。這現在是一個Windows問題。 – EJP

+0

我已經看過這個問題,並符合我開始這個線程。我從這裏得到了解決方案 - http://stackoverflow.com/questions/1385866/java-run-as-administrator,但不幸的是,這不適合我。 –

1

問題是因爲用戶設置文件存儲在錯誤的地方。

只有可執行的二進制文件和相關資源屬於在ProgramData目錄(「C:\ Program Files文件...」),當與管理員權限的用戶安裝或者更新程序安裝這個數據應該只改變。用戶需要更改任何配置或數據必須保存在地方的用戶有權修改,如他們的主文件夾,「我的文檔」,他們的HKEY_CURRENT_USER註冊表項,或更好,但他們的AppData目錄。

你可以閱讀更多有關這些 Windows programming requirements for user data storage herehere is how some people have done this in Java。希望能幫助你修好!

關於第二個想法,也許使用像PROCMON.EXE的工具,將有助於縮小拒絕的細節 - 因爲它會顯示你的程序是否被打開的文件/目錄的讀取,寫入與 - 所有的權限,試圖創建一個已經存在的文件等。

+0

「ProgramData」和「Program Files」是不一樣的。 「Program Files」是二進制文件和只讀文件的地方 - 正如你所說的,但ProgramData是Vista對CSIDL_COMMON_APPDATA的回答。以前,在Windows XP中,它使用「C:\ Documents and Settings \ All Users \ Application Data」。 – jveazey

+0

你是完全正確的,@John L. Veazey ...我應該仔細閱讀!取消我的(錯誤)答案。 – ewall

0

最快的解決方案是您可以使用xcacls.exe utilityicacls.exe utility。使用它們,您可以給C:\ ProgramData中的「Everyone」或任何人讀取/寫入/ etc配置文件的權限。

注:確保只有改變你需要從你的程序訪問文件的權限。 ProgramData是一個系統文件夾,不應該一般都可以訪問。

更新:另外,您需要將清單嵌入到可執行文件中,特別是作爲RT_MANIFEST資源。這可以通過Manifest Tool (mt.exe)輕鬆完成。關於這方面的更多信息可以在answer找到。