共用方式為


WDAC 偵錯和疑難排解

注意

Windows Defender 應用程式控制的某些功能僅在特定 Windows 版本上可用。 深入了解 Windows Defender 應用控制功能可用性

本文說明如何在使用 Windows Defender 應用程控 (WDAC) 時,對應用程式和腳本失敗進行偵錯和疑難解答。

1 - 收集 WDAC 診斷數據

在偵錯和疑難解答 WDAC 問題之前,您必須從顯示問題行為的裝置收集資訊。

從提升許可權的 PowerShell 視窗執行下列命令,以收集您可能需要的診斷資訊:

  1. 收集一般 WDAC 診斷數據,並將其複製到 %userprofile%\AppData\Local\Temp\DiagOutputDir\CiDiag:

    cidiag.exe /stop
    

    如果您的 Windows 版本中沒有 CiDiag.exe,請手動收集此資訊:

  2. 將裝置的系統資訊儲存至 CiDiag 資料夾:

    msinfo32.exe /report $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\SystemInformation.txt
    
  3. 使用 CiTool.exe 來清查裝置上的WDAC原則清單。 如果您的 Windows 版本中沒有 CiTool.exe,請略過此步驟。

    citool.exe -lp -json > $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\CiToolOutput.json
    
  4. 將 AppLocker 登入機碼資料匯出至 CiDiag 資料夾:

    reg.exe query HKLM\Software\Policies\Microsoft\Windows\SrpV2 /s > $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerRegistry.txt; reg.exe query HKLM\Software\Policies\Microsoft\Windows\AppidPlugins /s >> $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerRegistry.txt; reg.exe query HKLM\System\CurrentControlSet\Control\Srp\ /s >> $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerRegistry.txt
    

    注意

    您可能會看到系統找不到指定的登錄機碼或值的錯誤。 此錯誤不會指出問題,而且可以忽略。

  5. 將任何 AppLocker 原則檔案從 %windir%System32\AppLocker 複製到 CiDiag 資料夾:

    Copy-Item -Path $env:windir\System32\AppLocker -Destination $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\ -Recurse -Force -ErrorAction Ignore
    
  6. 收集上一個步驟中所收集之 AppLocker 原則檔案的檔案資訊:

    Get-ChildItem -Path $env:windir\System32\AppLocker\ -Recurse | select Mode,LastWriteTime,CreationTime,Length,Name >> $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerPolicyFiles.txt
    
  7. 匯出有效的 AppLocker 原則:

    Get-AppLockerPolicy -xml -Effective > $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLocker.xml
    
  8. 收集 AppLocker 服務設定和狀態資訊:

    sc.exe query appid > $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerServices.txt; sc.exe query appidsvc >> $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerServices.txt; sc.exe query applockerfltr >> $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerServices.txt
    

核心 WDAC 事件記錄檔

WDAC 事件會在兩個位置下產生:

  • 應用程式和服務記錄 - Microsoft - Windows - CodeIntegrity - 作業
  • 應用程式和服務記錄 - Microsoft - Windows - AppLocker - MSI 和腳本

在 CiDiag 輸出目錄中,這些事件記錄檔分別稱為 CIOperational.evtx 和 ALMsiAndScript.evtx。

其他可能很有用的 Windows 事件記錄檔

有時候,您可能可以使用這些其他事件記錄檔中找到的資訊,來補充核心 WDAC 事件記錄檔中包含的資訊。 CIDiag.exe 不會收集斜體中顯示 的斜體

  • 應用程式和服務記錄 - Microsoft - Windows - CodeIntegrity - 詳細資訊
  • 應用程式和服務記錄 - Microsoft - Windows - AppLocker - EXE 和 DLL
  • 應用程式和服務記錄 - Microsoft - Windows - AppLocker - 已封裝應用程式部署
  • 應用程式和服務記錄 - Microsoft - Windows - AppLocker - 已封裝應用程式執行
  • 應用程式和服務記錄 - Microsoft - Windows - AppID - 作業
  • 應用程式和服務記錄 - Microsoft - Windows - CAPI2 - 營運
  • 應用程式和服務記錄 - Microsoft - Windows - DeviceGuard - 作業
  • 應用程式和服務記錄 - Microsoft - Windows - PowerShell - *
  • Windows - 應用程式
  • Windows - 系統

2 - 使用診斷和記錄數據來識別問題

從裝置收集必要的診斷信息之後,您就可以開始分析上一節中所收集的診斷數據。

  1. 確認作用中並強制執行的 WDAC 原則集合。 確認目前只有您預期作用中的原則才有效。 請注意可能也是作用 中的 Windows 收件匣原則 。 您可以使用下列其中一種方法:

    • 如果適用,請檢閱 來自CiTool.exe -lp 的輸出,此輸出會以CiToolOutput.json方式儲存至 CIDiag 輸出目錄。 請參閱 使用 Microsoft Edge 來檢視格式化的 json 檔案
    • 檢閱在應用程式和服務記錄檔中找到的核心 WDAC 事件記錄檔中的所有原則 啟用事件- Microsoft - Windows - CodeIntegrity - Operational。 在 CIDiag 輸出目錄中,此事件記錄檔稱為 CIOperational.evtx。
  2. 從應用程式和服務記錄 - Microsoft - Windows - CodeIntegrity - Operational 找到的核心 WDAC 事件記錄檔中,檢閱可執行檔、dll 和驅動程式的任何封鎖事件。 在 CIDiag 輸出目錄中,此事件記錄檔稱為 CIOperational.evtx。 使用區塊事件及其相互關聯的 3089 簽章詳細數據事件 () 來調查任何無法解釋或未預期的區塊。 如需參考,請參閱本文稍後所述的封鎖可執行檔範例。

  3. 從應用程式和服務記錄 - Microsoft - Windows - AppLocker - MSI 和腳本中找到的核心腳本強制事件記錄檔,檢閱已封裝應用程式、MSI 安裝程式、腳本和 COM 物件的任何封鎖事件。 在 CIDiag 輸出目錄中,此事件記錄檔稱為 ALMsiAndScript.evtx。 使用區塊事件及其相互關聯的 8038 簽章詳細數據事件 () 來調查任何無法解釋或未預期的區塊。

大部分的 WDAC 相關問題,包括應用程式和腳本失敗,都可以使用上述步驟來診斷。

範例封鎖可執行檔的事件分析

以下是來自一般 WDAC 強制模式區塊事件 3077 的詳細 EventData 範例,以及其其中一個相互關聯的 3089 簽章資訊事件。 每個事件螢幕快照後面的數據表都會描述事件中包含的一些元素。 遵循事件描述是逐步解說,說明如何使用事件來瞭解區塊發生的原因。

事件 3077 - WDAC 強制封鎖事件

PowerShell.exe 的範例 3077 區塊事件。

元素名稱 描述
系統 - 相互關聯 - [ActivityID] 螢幕快照中未顯示
使用相互關聯 ActivityID 來比對 WDAC 區塊事件與一或多個 3089 簽章事件。
檔名 磁碟上遭到封鎖而無法執行的檔案路徑和名稱。 因為磁碟上的名稱是可變動的,所以這個值不是使用 建立 WDAC 檔案規則時所使用的值。-Level FileName 請改為參閱本表稍後的 OriginalFileName 元素。
進程名稱 嘗試執行封鎖檔案之檔案的路徑和名稱。 也稱為父進程。
要求的簽署層級 Windows 簽署授權層級,這是執行所需的程式代碼。 請參閱 要求和驗證的簽署層級
已驗證的簽署層級 已提供程式碼的 Windows 簽署授權層級。 請參閱 要求和驗證的簽署層級
狀態 Windows NT 狀態代碼。 您可以使用 certutil.exe -error <status> 來查閱狀態代碼的意義。
SHA1 哈希 已封鎖檔案的 SHA1 Authenticode 哈希。
SHA256 哈希 已封鎖檔案的SHA256 Authenticode 哈希。
SHA1 一般哈希 已封鎖檔案的 SHA1 一般檔案哈希。
SHA256 一般哈希 已封鎖檔案的SHA256一般檔案哈希。
PolicyName 造成封鎖事件之 WDAC 原則的易記名稱。 系統會針對封鎖檔案執行的每個原則,顯示個別的 3077 區塊事件 (或 3076 稽核封鎖事件) 。
PolicyId 造成封鎖事件之 WDAC 原則的易記標識碼值。
PolicyHash 造成封鎖事件之 WDAC 原則二進位檔的 SHA256 Authenticode 哈希。
OriginalFileName 開發人員在封鎖檔案的資源標頭中設定的不可變檔名。 這個值是使用 建立 WDAC 檔案規則時所使用的值。-Level FileName
InternalName 開發人員在封鎖檔案的資源標頭中設定的另一個不可變值。 您可以在檔案規則中將此值取代為 OriginalFileName。-Level FileName -SpecificFileNameLevel InternalName
FileDescription 開發人員在封鎖檔案的資源標頭中設定的另一個不可變值。 您可以在檔案規則中將此值取代為 OriginalFileName。-Level FileName -SpecificFileNameLevel FileDescription
ProductName 開發人員在封鎖檔案的資源標頭中設定的另一個不可變值。 您可以在檔案規則中將此值取代為 OriginalFileName。-Level FileName -SpecificFileNameLevel ProductName
FileVersion 原則的 VersionEx 值,用來對已簽署的原則強制執行版本控制。
PolicyGUID 造成封鎖事件之 WDAC 原則的 PolicyId。
UserWriteable 布爾值,指出檔案是否位於用戶可寫入的位置。 此資訊適用於診斷 FilePath 規則允許時的問題。
PackageFamilyName 已封裝應用程式的套件系列名稱 (包含封鎖檔案的 MSIX) 。

事件 3089 - WDAC 簽章資訊事件

PowerShell.exe 的範例 3089 簽章資訊事件。

元素名稱 描述
系統 - 相互關聯 - [ActivityID] 使用相互關聯 ActivityID 來比對 WDAC 簽章事件與其區塊事件。
TotalSignatureCount 針對封鎖的檔案偵測到的簽章總數。
簽章 從 0 開始的索引計數,是此 3089 事件中顯示的目前簽章。 如果檔案有多個簽章,您會發現其他簽章有其他 3089 個事件。
Hash WDAC 用來比對檔案的哈希值。 此值應符合 3077 或 3076 區塊事件上顯示的四個哈希之一。 如果找不到檔案的簽章 (TotalSignatureCount = 0) ,則只會顯示哈希值。
SignatureType 章的類型
ValidatedSigningLevel 簽章符合的 Windows 簽署授權層級。 請參閱 要求和驗證的簽署層級
VerificationError 此特定簽章無法通過 WDAC 原則的原因。 請參閱 VerificationError
PublisherName 從分葉憑證 (CN) 值的一般名稱。
IssuerName 憑證鏈結中最高可用憑證的 CN 值。 此層級通常是根目錄下方的一個憑證。
PublisherTBSHash 分葉憑證的 TBS 哈希。
IssuerTBSHash 憑證鏈結中最高可用憑證的 TBS 哈希。 此層級通常是根目錄下方的一個憑證。

範例 3077 和 3089 事件的逐步解說

現在讓我們逐步解說如何使用範例 3077 和 3089 事件中的事件數據,以瞭解 WDAC 原則封鎖此檔案的原因。

瞭解哪些檔案遭到封鎖,以及封鎖內容

參考 3077 事件,找出識別原則的信息、封鎖的檔案,以及嘗試執行該原則的父進程。 請考慮此內容資訊,以判斷區塊是否為預期和需要。

在此範例中,會 PowerShell.exe 封鎖的檔案,這是 Windows 的一部分,通常預期會執行。 不過,在此情況下,原則是以 Windows in S 模式原則範本為基礎,不允許腳本主機以限制受攻擊面的方式執行。 針對 S 模式,此區塊事件是成功的。 但假設原則作者在選擇範本時未察覺到該條件約束,並將此區塊視為非預期。

判斷 WDAC 拒絕檔案的原因

再次參考 3077 事件,我們看到要求的簽署層級 2 表示程式碼必須通過 WDAC 原則。 但驗證的簽署層級 1 表示程式代碼被視為未簽署。 「未簽署」可能表示檔案確實未簽署、已簽署,但憑證無效或已簽署,但 WDAC 原則不允許任何憑證。

現在,讓我們檢查已封鎖檔案的相互關聯 3089 事件 () 。 在此範例中,我們只會查看在具有多個簽章的檔案上找到的第一個簽章 (簽章索引 0) 。 針對此簽章,ValidatedSigningLevel 為 12,表示它有 Microsoft Windows 產品簽章。 21 的 VerificationError 表示簽章未通過 WDAC 原則。

請務必檢閱每個相互關聯 3089 事件的信息,因為每個簽章可能有不同的 ValidatedSigningLevel 和 VerificationError。

重要

請注意,3077 事件的驗證簽署層級與 3089 事件上的 ValidatedSigningLevel 的解譯方式非常不同。

在 3077 事件的案例中,驗證的簽署層級會告訴我們 Windows 實際處理二進位檔的方式。

另一方面,在 3089 事件的情況下,ValidatedSigningLevel 會告訴我們簽章可能收到 的最大 層級。 我們必須使用 VerificationError 來瞭解簽章遭到拒絕的原因。

3 - 解決常見問題

分析 WDAC 診斷數據之後,您可以採取步驟來解決問題,或執行更多偵錯步驟。 以下是您可以嘗試解決或進一步隔離根問題的一些常見問題和步驟:

問題:已封鎖您想要允許的檔案

  • 使用核心 WDAC 事件記錄檔中的數據來新增規則,以允許封鎖的檔案。
  • 如果您的原則信任受管理的安裝程式,請使用受管理的安裝程式重新部署檔案或應用程式。

問題:原則作用中且非預期

如果下列情況可能存在:

  • 已移除原則,但系統尚未重新啟動。
  • 已部分移除原則,但系統或 EFI 磁碟分區中仍存在原則複本。
  • 原則標識符為 {A244370E-44C9-4C06-B551-F6016E563076} 的原則 (單一原則格式) 在啟用前複製到多重原則格式原則位置,導致磁碟上有重複的原則二進位檔。 檢查 System 和 EFI 分割區中的 SiPolicy.p7b 和 {A244370E-44C9-4C06-B551-F6016E563076}.cip 檔案。
  • 原則未正確部署至裝置。
  • 具有系統管理員存取權的攻擊者已套用原則,以對某些重要程式造成阻斷服務。

若要解決這類問題,請依照指示移除已識別原則的 WDAC 原則。

問題:發生未處理的應用程式失敗,且未觀察到任何 WDAC 事件

某些應用程式會在使用者模式 WDAC 原則作用中時改變其行為,這可能會導致非預期的失敗。 對於未正確處理腳本主機所實作之強制執行行為的應用程式,它也可以是腳本強制執行的副作用。

請嘗試執行下列動作來找出根本原因:

  • 檢查本文第 1 節所列的其他事件記錄檔,以瞭解與非預期的應用程式失敗對應的事件。
  • 將 WDAC 原則暫時取代為另一個 停用腳本強制執行 和重新測試的原則。
  • 暫時將 WDAC 原則取代為允許 所有 COM 物件 並重新測試的另一個原則。
  • 將 WDAC 原則暫時取代為另一個放寬其他 原則規則 並重新測試的原則。

問題:受控安裝程式部署的應用程式無法運作

若要使用受管理的安裝程式偵錯問題,請嘗試下列步驟:

  • 檢查封鎖應用程式的 WDAC 原則是否包含啟用受控安裝程式的選項。
  • 檢查有效的 AppLocker 原則 $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLocker.xml 是否正確,如 自動允許受管理安裝程式部署的應用程式中所述。
  • 檢查 AppLocker 服務是否正在執行。 此資訊可在本文第 1 節中建立的 $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerServices.txt 中找到。
  • 檢查 AppLocker 檔案是否存在,稱為 MANAGEDINSTALLER。APPLOCKER 存在於稍早建立的 CiDiag 資料夾中。 如果沒有,請重複部署和啟用受管理安裝程式 AppLocker 設定的步驟。
  • 重新啟動受管理的安裝程式程式,並使用 PolicyName = MANAGEDINSTALLER,檢查受管理安裝程式進程的 AppLocker - EXE 和 DLL 事件記錄檔中是否觀察到 8002 事件。 如果您改為看到具有 PolicyName = MANAGEDINSTALLER 的 8003 或 8004 事件,請檢查 AppLocker 原則 XML 中的 ManagedInstaller 規則,並確定規則符合受管理的安裝程式程式。
  • 使用 fsutil.exe 來確認受管理安裝程式程式所寫入的檔案具有 Managed 安裝程式原始擴充屬性。 如果沒有,請使用Managed安裝程式重新部署檔案,然後再次檢查。
  • 使用受控安裝程序測試不同應用程式的安裝。
  • 將另一個受管理的安裝程式新增至 AppLocker 原則,並使用其他受管理的安裝程式來測試安裝。
  • 檢查應用程式是否遇到 受控安裝程式的已知限制。 如果是,您必須使用其他方法來授權應用程式。

問題:您預期允許的 Intelligent Security Graph (ISG) 應用程式無法運作

若要使用ISG偵錯問題,請嘗試下列步驟:

  • 檢查封鎖應用程式的 WDAC 原則是否包含啟用智慧型手機的安全性圖表的選項。
  • 檢查 AppLocker 服務是否正在執行。 此資訊可在本文第 1 節中建立的 $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerServices.txt 中找到。
  • 使用 fsutil.exe 來確認檔案具有ISG原點擴充屬性。 如果沒有,請使用Managed安裝程式重新部署檔案,然後再次檢查。
  • 檢查應用程式是否遇到 ISG的已知限制

4 - 視需要向 Microsoft 回報問題

如果遵循本文所涵蓋的指引之後,您認為您已識別出產品問題,請向 Microsoft 回報問題。

  • 具有 Microsoft 頂級支援的客戶應該透過一般通道記錄服務要求。
  • 所有其他客戶都可以透過 Windows 意見反應中樞,直接向 WDAC 產品小組回報問題。 選取 [ 安全性 & 隱私權 - 應用程控 ] 類別,以確保問題正確地路由傳送給 WDAC 產品小組。

回報問題時,請務必提供下列資訊:

  • 先前所述的所有 WDAC 診斷數據
  • 可能的話,封鎖的檔案會 () 。
  • 清除重現問題的指示。