Windows Vista 和 Windows 7 有許多功能,可讓作系統更安全。 新增安全性表示將修補程式套用至軟體並不像過去那麼簡單。 本文將探討一些在 Windows Vista 和 Windows 7 以及 Windows XP 中運作良好之修補的方法。
有兩個主要類別的遊戲需要修補程式:
- 只需偶爾修補的遊戲,例如大多數離線遊戲。
- 需要頻繁修補的遊戲,例如大部分的在線遊戲。
本文也會提供使用者帳戶控制 (UAC) 的簡短簡介,以作為開發人員預期使用者在 Windows Vista 和 Windows 7 中擁有的許可權背景。
用戶帳戶控制
Windows Vista 和 Windows 7 有兩種主要類型的使用者帳戶:標準使用者和系統管理員。 標準用戶帳戶有數個存取限制;例如,它無法將數據寫入 %SystemDrive%\Program Files 中的文件系統,或寫入HKEY_LOCAL_MACHINE中的登錄。 如果遊戲安裝在唯讀位置,這將影響修補程式的套用。 不同於 Windows XP,標準用戶帳戶在 Windows Vista 和 Windows 7 中更為常見。 作業系統的一些重要功能,例如家長監護,也需要標準使用者帳戶。 家長監護功能要求子帳戶必須是標準使用者,如果將這類帳戶提升為系統管理員,即便只為一個遊戲,家長監護功能將失效於所有其他遊戲。 因此,請務必為標準用戶設計遊戲。
Windows Vista 和 Windows 7 具有較新的用戶權力模型,可協助防止使用者執行嘗試執行使用者不想要或授權之作業的程式。 為此,用戶帳戶控制(先前稱為最低許可權用戶帳戶或 LUA)可讓使用者在大部分時間以低階許可權作計算機,同時能夠在必要時輕鬆地執行需要較高層級許可權的應用程式。 這表示標準使用者帳戶和系統管理員帳戶都執行具有標準用戶權力的應用程式,但只有系統管理員帳戶能夠將提高的許可權授與應用程式。 作系統會先要求具有系統管理員帳戶的用戶明確同意,再以提高許可權執行應用程式,而且如果要求系統管理員許可權的程式是在標準使用者帳戶上執行,系統會提示系統管理員核准。
僅需偶爾更新的遊戲
有些遊戲在整個產品週期中只需要幾次更新。 您可以針對這個修補頻率採用的兩種方法是將修補程式散發為 Windows Installer 套件,這通常不需要系統管理員許可權,或使用一些直接修改遊戲檔案的其他發行版類型。
注意
無論遊戲是否需要頻繁修補,應用程式通常需要安裝或移除系統管理員許可權。
方法 1:使用 Windows Installer 進行臨時修補程式
在此方法中,Windows Installer 是用來安裝套件(.msi 檔案),而 Windows Installer 修補程式 (.msp 檔案) 會散發以安裝修補程式。 套件必須有 MsiPatchCertificate 數據表,而且修補程式必須由數據表中的憑證進行數字簽署。 如需了解更多關於遊戲開發者使用 Authenticode 進行數位簽署的資訊,請參閱 。
如需使用此修補方法的詳細數據和需求,請參閱 Windows Installer 檔:
此方法的缺點是,如果遊戲不是從 Windows XP 上的卸除式媒體安裝,則修補需要系統管理員許可權。 不過,這不會過於嚴格,因為在 Windows XP 上大多數的用戶是系統管理員,而且對於從卸除式媒體安裝的軟體的限制在 Windows Vista 上並不存在。
此方法的主要優點是,一般使用者帳戶可以套用修補程式,而不需要提示和提升權限的驗證。 這可提供更佳的使用者體驗,因為為了玩遊戲,具有標準使用者帳戶的使用者不需要要求具有系統管理員帳戶的人員安裝修補程式,或提供標準用戶帳戶的永久系統管理員許可權。
這個方法可能適用於需要頻繁修補程式的遊戲,但使用 Windows Installer 套件的額外負荷,在組建整合和支援大量檔案方面,可能會讓此方法比其他人更不受歡迎。
方法 2:要求系統管理員許可權套用修補程式
在此方法中,套用修補程式的可執行檔需要系統管理員許可權才能執行。 使用系統管理員許可權,修補可執行檔可以直接修改位於 \Program Files %SystemDrive%的遊戲檔案。
此方法的優點是其簡單性。 不過,如果遊戲需要頻繁的修補程式,這個方法是不合適的,因為如果具有標準用戶帳戶的使用者想要玩需要頻繁修補程式的遊戲,例如大量多玩家的在線遊戲,則該使用者有兩個選項:
- 請系統管理員登入並修補遊戲,這對雙方可能會造成不便。
- 將其帳戶永久提升為擁有系統管理員權限。
注意
後者的解決方案不僅削弱了整個系統的安全性,而且防止了家長控制等重要功能無法運作。
實作此方法時,套用修補程式的可執行檔必須與遊戲可執行檔不同。 修補可執行檔的指令清單應指定 requestedExecutionLevel 的 requireAdministrator,將它表示為需要系統管理員許可權的應用程式。 如需有關如何執行此項作業的詳細資訊,請參閱 「在最低特權環境中應用程式的開發人員最佳實踐和指導方針」,以及「應用程式清單架構」。
使用此方法時,即使搭配指令清單中的設定,在兩種情況下,可執行檔仍可能會啟動,而沒有系統管理員許可權:
- 如果作業系統是 Windows XP,且使用者帳戶是受限用戶。
- 如果作系統是 Windows Vista 或 Windows 7,則使用者帳戶是標準使用者,且 UAC 已停用。
這兩者都是罕見的消費者情境。 不過,修補程式應要求清單需要系統管理員權限,而且它應該呼叫 IsUserAnAdmin;如果此函式傳回 FALSE,則會顯示錯誤訊息「需要系統管理員權限」。
整體而言,方法 1 比較適合需要少量更新的遊戲,尤其是那些在遊戲的整個生命週期內。
需要頻繁修補程序的遊戲
許多以因特網為基礎的遊戲會持續改善,而且通常需要定期修補。 針對這些遊戲,修補程式可以依據每位使用者或每台電腦的需求來套用,如下列主題所討論。 其他可能的解決方案包括改變 ACL 來保護 %SystemDrive%\Program Files 或建立自定義服務。
方法 3:安裝 Per-User
建議且簡單的方法是將整個遊戲安裝到本機應用程式資料資料資料夾的每個使用者子資料夾,您可以透過使用 CSIDL_LOCAL_APPDATA 呼叫SHGetFolderPath 來找到此資料夾。 範例路徑為 C:\Documents and Settings\user name\Local Settings\Application Data\ExampleGame。 這類位置可讓以標準用戶權力執行的應用程式直接修改遊戲檔案。
不過,當計算機有多個使用者時,此方法有缺點:每個使用者已安裝遊戲複本,而且必須下載並套用修補程式。 這不僅浪費用戶的時間和磁碟空間,也會增加對提供修補程式的伺服器使用網路頻寬。 此外,因為任何具有標準用戶權力的應用程式都可以修改遊戲,所以遊戲可執行檔的保護較少;由遊戲製造商決定這是否可接受。
方法 4:安裝至通用 Per-Computer 位置
另一種方法是將非可執行的遊戲數據安裝到SHGetFolderPath CSIDL_COMMON_APPDATA 所指定路徑的子目錄;範例路徑為 C:\Documents and Settings\All Users\Application Data\ExampleGame。 這是所有用戶的共用位置,而且可由以標準使用者許可權執行的應用程式修改。 這個方法可將遊戲從多個帳戶播放時重新套用大型修補程式的需求降到最低。 遊戲的可執行文件應該保留在 %SystemDrive%\Programs Files 中,以將系統上其他帳戶的風險降到最低。 可執行文件應該驗證共享目錄中新內容的完整性,因為該程式或具有標準用戶權力的程式或人員可以修改該位置;請考慮使用 MapFileAndCheckSum 來計算檔案總和檢查碼。
此方法的優點是在 Windows XP 和 Windows Vista 上運作同樣良好,而且不需要系統管理員許可權。
其他可能性
除了已經討論過的方法之外,另一種可能性是在安裝遊戲時,改變 %SystemDrive%\Program Files\Game Folder\ 的 ACL,讓修補工具可以直接寫入遊戲的檔案,即使使用標準用戶權力執行也一樣。 雖然這並不困難,但它確實會略過系統提供給遊戲檔案的安全性保護,並提供惡意程式改變目錄內容的機會。 這是不建議的,強烈建議改用替代方案。
最後一種可能性是撰寫自定義服務。 一般而言,撰寫自定義服務來修補遊戲並不是個好主意,因為這樣做很複雜且容易出錯。 建議您使用本文所討論的其他方法進行修補。 不過,當與反作弊或反盜版解決方案結合時,可能需要自定義服務。 這類服務應該支援大量遊戲並設計,使其只能下載修補程式檔案,並只寫入目標遊戲的安裝目錄。 重要的是,服務很小,具有易受攻擊的最小介面區,並在遊戲未執行時盡可能少使用系統資源。
總結
最後,您必須決定要實作的方法。 您需要權衡對您來說重要的因素。 安全性、修補頻率、客戶容易使用、實作所需的工作負載、解決方案的複雜度,以及平臺功能合規性,都是每個開發人員在決定特定方法之前必須考慮的因素。
如需使用者帳戶保護的詳細資訊,請參閱 Windows Vista Application Development Requirements for User Account Control (UAC)。