AppLocker 無法阻止未核准的 PowerShell 模組

Service 盛达 40 信譽點數
2026-08-14T03:30:09.8933333+00:00

目前發現一般網域使用者可以透過 Invoke-Expression 將未核准的 PowerShell 模組直接載入記憶體,從而繞過 AppLocker Script Rules。

請問要如何透過 AppLocker 與系統環境設定,在整個網域強制啟用 PowerShell Constrained Language Mode(CLM),並限制這類未簽署模組的執行?

Windows 商務版 | Windows 365 企業版
0 則留言 沒有留言

1 個回答

排序依據: 最實用
  1. Harry Phan 36,050 信譽點數 獨立顧問
    2026-08-14T09:11:32.0833333+00:00

    你好,

    要在整個網域強制啟用 PowerShell Constrained Language Mode (CLM),並避免使用者透過 Invoke-Expression 載入未簽署模組繞過 AppLocker Script Rules,必須結合 AppLocker 與系統環境的設定來達成。單純依靠 AppLocker Script Rules 不足,因為 CLM 的啟用條件是 PowerShell 在受限環境下執行,例如當 AppLocker 或 Device Guard (Windows Defender Application Control, WDAC) 的規則生效時。

    正確做法是透過 AppLocker 或 WDAC 的強制策略,讓 PowerShell 自動進入 CLM。當 AppLocker 或 WDAC 對 PowerShell.exe 或 powershell_ise.exe 套用明確的允許/拒絕規則時,PowerShell 會偵測到並切換到 CLM。這樣一來,任何嘗試載入未簽署模組或使用 Add-Type、Invoke-Expression 等高風險 API 都會被限制。

    建議步驟如下:

    在網域 GPO 中建立 AppLocker 規則,針對 Scripts 及 DLLs 類別,僅允許已簽署或特定路徑下的檔案。確保 PowerShell.exe 本身有明確的允許規則。

    啟用 AppLocker 的強制模式,而非僅僅是 Audit 模式。這樣 PowerShell 在執行時會偵測到 AppLocker 的存在並自動進入 CLM。

    若環境允許,優先考慮使用 WDAC (Windows Defender Application Control),因為 WDAC 比 AppLocker 更強制且能涵蓋驅動程式與核心層級。當 WDAC Policy 生效時,PowerShell 也會自動進入 CLM。

    驗證方式:在受控用戶端執行 $ExecutionContext.SessionState.LanguageMode,應顯示 ConstrainedLanguage。

    需要注意的是,CLM 無法單純透過登錄或環境變數強制開啟,必須依靠 AppLocker 或 WDAC 的策略。這是 Microsoft 官方設計的安全機制,避免被簡單繞過。若目前只部署了 AppLocker Script Rules 而沒有對 PowerShell.exe 套用完整的允許規則,PowerShell 可能仍然在 FullLanguage 模式下執行,導致您觀察到的繞過情況。

    因此,解決方案是:在網域 GPO 中針對 PowerShell 制定完整的 AppLocker 或 WDAC 規則並強制執行,這樣才能保證所有一般網域使用者都在 CLM 下運行,並阻止未簽署模組的載入。

    我希望這裡的說明能幫您釐清問題並提供可行的方向。我希望你已經在這裡找到一些有用的資訊。如果這能幫助你更深入了解問題,請接受這個答案。如果還有其他問題,隨時留言。祝你有美好的一天!

    HP.

    此回答有幫助嗎?

    0 則留言 沒有留言

您的回答

答案可由問題作者標示為「已接受」,而由仲裁者標示為「推薦」,這可協助使用者知道答案解決了作者的問題。