ClickOnce 部署中的安全性、版本控制和資訊清單問題

有各種可能導致 ClickOnce 部署不成功的 ClickOnce 安全性、應用程式版本設定以及資訊清單語法和語義的問題。

ClickOnce 和 Windows 使用者帳戶名稱控制

在 Windows Vista 和更新版本的 Windows 中,應用程式預設會以標準使用者身分執行,即使目前使用者是以具有管理員權限的帳戶登入也是如此。 如果應用程式必須執行需要管理員權限的動作,它會通知作業系統,然後作業系統會提示使用者輸入其管理員憑證。 此功能 (稱為「使用者帳戶控制」(UAC)) 可防止應用程式在未經使用者明確核准的情況下進行可能影響整個作業系統的變更。 Windows 應用程式會透過在其應用程式資訊清單的 trustInfo 區段中指定 requestedExecutionLevel 屬性來宣告它們需要此權限提升。

由於存在讓應用程式遭受安全性提升攻擊的風險,ClickOnce 應用程式無法在用戶端啟用 UAC 時要求權限提升。 任何嘗試將其 requestedExecutionLevel 屬性設定為 requireAdministratorhighestAvailable 的 ClickOnce 應用程式都不會安裝在 Windows Vista 及更新版本上。

在某些情況下,由於 Windows 上的安裝程式偵測邏輯,ClickOnce 應用程式可能會嘗試使用管理員權限來執行。 在此情況下,您可以將應用程式資訊清單中的 requestedExecutionLevel 屬性設定為 asInvoker。 這將導致應用程式本身無需提升即可執行。 Visual Studio 會自動將此屬性新增到所有應用程式資訊清單中。

如果您正在開發的應用程式在其整個生命週期內都需要管理員權限,則應考慮改用 Windows Installer (MSI) 技術來部署該應用程式。 如需詳細資訊,請參閱 Windows Installer 基本概念

線上應用程式配額和部分信任應用程式

如果您的 ClickOnce 應用程式在線上執行,而不是透過安裝執行,則它必須符合為線上應用程式預留的配額。 此外,在部分信任 (例如具有一組受限的安全性權限) 下執行的網路應用程式不能大於配額大小的一半。

如需有關如何變更線上應用程式配額的詳細資訊與指示,請參閱 ClickOnce 快取概觀

版本控制問題

如果您為組件指派強式名稱並遞增組件版本號碼以反映應用程式更新,則可能會遇到問題。 使用強式命名的組件參考編譯的任何組件本身都必須重新編譯,否則該組件會嘗試參考較舊的版本。 該組件會嘗試此動作,因為該組件在其繫結要求中使用舊版的值。

例如,假設您自己的專案中有一個版本為 1.0.0.0 的強式命名組件。 編譯該組件之後,您將它新增為包含主要應用程式之專案的參考。 如果您更新該組件、將版本遞增為 1.0.0.1,並嘗試在也不重新編譯應用程式的情況下部署它,則應用程式將無法在執行階段載入該組件。

只有在您手動編輯 ClickOnce 資訊清單時才會發生此錯誤;如果您使用 Visual Studio 產生部署,則不該遇到此錯誤。

在資訊清單中指定個別的 .NET Framework 組件

如果您已手動編輯 ClickOnce 部署以參考舊版的 .NET Framework 組件,您的應用程式將無法載入。 例如,如果您在資訊清單中指定的版本之前,為 .NET Framework 版本新增 System.Net 組件的參考,則會發生錯誤。 通常,您不應嘗試指定對個別 .NET Framework 組件的參考,因為應用程式執行所針對的 .NET Framework 版本已在應用程式資訊清單中指定為相依性。

資訊清單剖析問題

ClickOnce 所使用的資訊清單檔案是 XML 檔案,而且它們必須格式正確且有效:它們必須遵守 XML 語法規則,並且只使用相關 XML 結構描述中所定義的元素和屬性。

可能會在資訊清單檔中導致問題的原因是:為應用程式選取的名稱包含特殊的字元 (例如單引號或雙引號)。 應用程式的名稱是其 ClickOnce 識別項的一部分。 ClickOnce 目前不會剖析包含特殊字元的識別項。 如果您的應用程式無法啟動,請確定您只針對名稱使用字母和數值字元,然後嘗試再次部署它。

如果您已手動編輯部署或應用程式資訊清單,則可能會無意中損壞它們。 損毀的資訊清單會阻止正確的 ClickOnce 安裝。 您可以在執行階段偵錯此類錯誤 (方法是按一下 [ClickOnce 錯誤] 對話方塊上的 [詳細資料],然後閱讀記錄檔中的錯誤訊息)。 記錄檔會列出下列其中一則訊息:

  • 語法錯誤的描述,以及發生錯誤的行號和字元位置。

  • 違反資訊清單結構描述的元素或屬性名稱。 如果您已手動將 XML 新增至資訊清單中,則必須將新增內容與資訊清單結構描述進行比較。 如需詳細資訊,請參閱 ClickOnce 部署資訊清單ClickOnce 應用程式資訊清單

  • ID 衝突。 部署和應用程式資訊清單中的相依性參考在其 namepublicKeyToken 屬性中都必須是唯一的。 如果這兩個屬性在資訊清單中的任何兩個元素之間相符,則資訊清單剖析將不會成功。

手動變更資訊清單或應用程式時的注意事項

更新應用程式資訊清單時,您必須重新簽署應用程式資訊清單和部署資訊清單。 部署資訊清單包含對應用程式資訊清單的參考,其中包含該檔案的雜湊碼及其數位簽章。

使用部署提供者的注意事項

ClickOnce 部署資訊清單有一個 deploymentProvider 屬性 (該屬性指向應安裝及提供服務給應用程式的位置的完整路徑):

<deploymentProvider codebase="http://myserver/myapp.application" />

此路徑是在 ClickOnce 建立應用程式時設定的,它對於已安裝的應用程式是必需的。 該路徑指向 ClickOnce 安裝程式將從中安裝應用程式並搜尋更新的標準位置。 如果您使用 [xcopy] 命令將 ClickOnce 應用程式複製到不同的位置,但不變更 deploymentProvider 屬性,則 ClickOnce 仍會在嘗試下載應用程式時指回到原始位置。

如果您想要移動或複製應用程式,您也必須更新 deploymentProvider 路徑,以便用戶端能實際從新位置安裝。 如果您已經安裝了應用程式,則更新此路徑是最主要的問題。 對於一律透過原始 URL 啟動的線上應用程式,設定 deploymentProvider 是選擇性的。 如果已設定了 deploymentProvider,則會予以接受;否則,用來啟動應用程式的 URL 將用作下載應用程式檔案的基本 URL。

注意

每次更新資訊清單時,您也必須再次簽署它。

針對 ClickOnce 部署進行疑難排解保護 ClickOnce 應用程式的安全選擇 ClickOnce 部署策略