共用方式為


商務用應用程控和 .NET

以 C#) 等高階語言撰寫的 .NET 應用程式 (會編譯成中繼語言 (IL) 。 IL 是可在任何作業系統或架構上支援的精簡程式代碼格式。 大部分的 .NET 應用程式都使用多個環境中支援的 API,只需要執行 .NET 運行時間。 IL 必須編譯成原生程序代碼,才能在CPU上執行,例如Arm64或 x64。 當 .NET 在具有應用程控使用者模式原則的裝置上,將 IL 編譯為原生映射 (NI) 時,它會先檢查原始 IL 檔案是否通過目前的應用程控原則。 如果是,.NET 會在產生的 NI 檔案上設定 EA) (NTFS 擴充屬性,讓應用程控也知道信任它。 當 .NET 應用程式執行時,應用程控會在 NI 檔案上看到 EA 並允許它。

NI 檔案上設定的 EA 僅適用於目前作用中的應用程控原則。 如果其中一個作用中的應用程控原則已更新或套用新的原則,NI 檔案上的 EA 就會失效。 下次執行應用程式時,應用程控會封鎖 NI 檔案。 .NET 會正常處理區塊,並回復為原始 IL 程式代碼。 如果 IL 仍然通過最新的應用程控原則,則應用程式會執行,而不會影響任何功能。 由於 IL 目前正在運行時間編譯,因此您可能會注意到對應用程式效能有些微影響。 當 .NET 必須回復到 IL 時,.NET 也會排程在下一個維護期間執行的程式,以重新產生所有 NI 檔案,因而重新建立傳遞最新應用程控原則之所有程式代碼的應用程控 EA。

在某些情況下,如果 NI 檔案遭到封鎖,您可能會在 CodeIntegrity - Operational 事件記錄檔中看到「誤判」區塊事件,如應用程控 管理員 提示 & 已知問題中所述。

若要減輕應用程控 EA 無效或遺失時所造成的任何效能影響:

  • 請避免經常更新應用程控原則。
  • ngen update 在所有計算機架構上執行 () ,以強制 .NET 在將變更套用至您的應用程控原則之後,立即重新產生所有 NI 檔案。
  • 將應用程式移轉至 .NET Core (.NET 6 或更新版本) 。

應用程控和 .NET 強化

安全性研究人員發現一些 .NET 功能,可讓應用程式從外部來源載入連結庫,或在運行時間產生新的程式碼,可用來規避應用程控控件。 為了解決這個潛在的弱點,應用程控包含稱為 動態程序代碼安全 性的選項,可與 .NET 搭配使用,以驗證在運行時間載入的程序代碼。

啟用 [動態程式代碼安全性] 選項時,應用程控原則會套用至 .NET 從外部來源載入的連結庫。 例如,任何遠端來源,例如因特網或網路共用。

重要

如果已啟用 UMCI 的任何應用程控原則已設定選項 19 Enabled:Dynamic Code Security,就會開啟並強制執行 .Net 動態程式代碼安全性強化。 此功能沒有稽核模式。 在大量裝置上開啟應用程式之前,您應該先設定此選項來測試應用程式。

此外,它會偵測 .NET 對磁碟產生的程式代碼遭到竄改,並封鎖載入遭竄改的程序代碼。

根據預設,不會啟用動態程式碼安全性,因為現有原則可能不考慮外部載入的連結庫。 此外,啟用動態程式代碼安全性時,目前不支援一些 .NET 載入功能,包括載入以 System.Reflection.Emit 建置的未簽署元件。 Microsoft建議在強制執行動態程式代碼安全性之前,先在稽核模式中測試動態程式碼安全性,以探索原則中是否應該包含任何新的連結庫。

此外,客戶只能預先編譯部署,以防止允許的可執行檔遭到終止,因為它會嘗試載入未簽署的動態產生程序代碼。 請參閱 ASP.NET 先行編譯概觀 檔中的一節,以瞭解如何修正此問題。

若要啟用動態程式碼安全性,請將下列選項新增至 <Rules> 應用程控原則的 區段:

<Rule>
    <Option>Enabled:Dynamic Code Security</Option>
</Rule>