你好,
要在整個網域強制啟用 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.