應用程控偵錯和疑難解答
注意
商務用應用程控的某些功能僅適用於特定的 Windows 版本。 深入了解 應用程控功能可用性。
本文說明如何在使用商務用應用程控時,對應用程式和腳本失敗進行偵錯和疑難解答。
1 - 收集應用程控診斷數據
在偵錯和疑難解答應用程控問題之前,您必須從呈現問題行為的裝置收集資訊。
從提升許可權的 PowerShell 視窗執行下列命令,以收集您可能需要的診斷資訊:
收集一般應用程控診斷數據,並將其複製到 %userprofile%\AppData\Local\Temp\DiagOutputDir\CiDiag:
cidiag.exe /stop
如果您的 Windows 版本中沒有 CiDiag.exe,請手動收集此資訊:
- 來自 Windows 和 EFI 系統分割區的應用程控原則二進位檔
- 應用程控事件記錄檔
- AppLocker 事件記錄檔
- 其他事件記錄檔,其中可能包含 來自其他 Windows 應用程式和服務的實用資訊
將裝置的系統資訊儲存至 CiDiag 資料夾:
msinfo32.exe /report $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\SystemInformation.txt
使用 CiTool.exe 來清查裝置上的應用程控原則清單。 如果您的 Windows 版本中沒有 CiTool.exe,請略過此步驟。
citool.exe -lp -json > $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\CiToolOutput.json
將 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
注意
您可能會看到系統找不到指定的登錄機碼或值的錯誤。 此錯誤不會指出問題,而且可以忽略。
將任何 AppLocker 原則檔案從 %windir%System32\AppLocker 複製到 CiDiag 資料夾:
Copy-Item -Path $env:windir\System32\AppLocker -Destination $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\ -Recurse -Force -ErrorAction Ignore
收集上一個步驟中所收集之 AppLocker 原則檔案的檔案資訊:
Get-ChildItem -Path $env:windir\System32\AppLocker\ -Recurse | select Mode,LastWriteTime,CreationTime,Length,Name >> $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerPolicyFiles.txt
匯出有效的 AppLocker 原則:
Get-AppLockerPolicy -xml -Effective > $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLocker.xml
收集 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
核心應用程控事件記錄檔
應用程式程式控事件會在兩個位置下產生:
- 應用程式和服務記錄 - Microsoft - Windows - CodeIntegrity - 作業
- 應用程式和服務記錄 - Microsoft - Windows - AppLocker - MSI 和腳本
在 CiDiag 輸出目錄中,這些事件記錄檔分別稱為 CIOperational.evtx 和 ALMsiAndScript.evtx。
其他可能很有用的 Windows 事件記錄檔
有時候,您可以使用這些其他事件記錄檔中找到的資訊,來補充核心應用程控事件記錄檔中包含的資訊。 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 - 使用診斷和記錄數據來識別問題
從裝置收集必要的診斷信息之後,您就可以開始分析上一節中所收集的診斷數據。
確認一組作用中和強制執行的應用程控原則。 確認目前只有您預期作用中的原則才有效。 請注意可能也是作用 中的 Windows 收件匣原則 。 您可以使用下列其中一種方法:
- 如果適用,請檢閱 來自CiTool.exe -lp 的輸出,此輸出會以CiToolOutput.json方式儲存至 CIDiag 輸出目錄。 請參閱 使用 Microsoft Edge 來檢視格式化的 json 檔案。
- 從應用程式和服務記錄 - Microsoft - Windows - CodeIntegrity - 操作中找到的核心應用程控事件記錄檔,檢閱所有原則啟用事件。 在 CIDiag 輸出目錄中,此事件記錄檔稱為 CIOperational.evtx。
從應用程式和服務記錄 - Microsoft - Windows - CodeIntegrity - Operational 中找到的核心應用程控事件記錄檔,檢閱可執行檔、dll 和驅動程式的任何封鎖事件。 在 CIDiag 輸出目錄中,此事件記錄檔稱為 CIOperational.evtx。 使用區塊事件及其相互關聯的 3089 簽章詳細數據事件 () 來調查任何無法解釋或未預期的區塊。 如需參考,請參閱本文稍後所述的封鎖可執行檔範例。
從應用程式和服務記錄 - Microsoft - Windows - AppLocker - MSI 和腳本中找到的核心腳本強制事件記錄檔,檢閱已封裝應用程式、MSI 安裝程式、腳本和 COM 物件的任何封鎖事件。 在 CIDiag 輸出目錄中,此事件記錄檔稱為 ALMsiAndScript.evtx。 使用區塊事件及其相互關聯的 8038 簽章詳細數據事件 () 來調查任何無法解釋或未預期的區塊。
大部分的應用程控相關問題,包括應用程式和腳本失敗,都可以使用上述步驟來診斷。
範例封鎖可執行檔的事件分析
以下是來自一般應用程控強制模式區塊事件 3077 的詳細 EventData 範例,以及其其中一個相互關聯的 3089 簽章資訊事件。 每個事件螢幕快照後面的數據表都會描述事件中包含的一些元素。 遵循事件描述是逐步解說,說明如何使用事件來瞭解區塊發生的原因。
事件 3077 - 應用程控強制封鎖事件
元素名稱 | 描述 |
---|---|
系統 - 相互關聯 - [ActivityID] |
螢幕快照中未顯示 使用相互關聯 ActivityID 來比對應用程控區塊事件與一或多個 3089 簽章事件。 |
檔名 | 磁碟上遭到封鎖而無法執行的檔案路徑和名稱。 因為磁碟上的名稱是可變動的,所以這個值不是使用 建立應用程控檔案規則時所使用的值。-Level FileName 請改為參閱本表稍後的 OriginalFileName 元素。 |
進程名稱 | 嘗試執行封鎖檔案之檔案的路徑和名稱。 也稱為父進程。 |
要求的簽署層級 | Windows 簽署授權層級,這是執行所需的程式代碼。 請參閱 要求和驗證的簽署層級。 |
已驗證的簽署層級 | 已提供程式碼的 Windows 簽署授權層級。 請參閱 要求和驗證的簽署層級。 |
狀態 | Windows NT 狀態代碼。 您可以使用 certutil.exe -error <status> 來查閱狀態代碼的意義。 |
SHA1 哈希 | 已封鎖檔案的 SHA1 Authenticode 哈希。 |
SHA256 哈希 | 已封鎖檔案的SHA256 Authenticode 哈希。 |
SHA1 一般哈希 | 已封鎖檔案的 SHA1 一般檔案哈希。 |
SHA256 一般哈希 | 已封鎖檔案的SHA256一般檔案哈希。 |
PolicyName | 造成封鎖事件之應用程控原則的易記名稱。 系統會針對封鎖檔案執行的每個原則,顯示個別的 3077 區塊事件 (或 3076 稽核封鎖事件) 。 |
PolicyId | 造成封鎖事件之應用程控原則的易記標識碼值。 |
PolicyHash | 造成封鎖事件之應用程控原則二進制檔的SHA256 Authenticode 哈希。 |
OriginalFileName | 開發人員在封鎖檔案的資源標頭中設定的不可變檔名。 這個值是使用 建立應用程控檔案規則時所使用的值。-Level FileName |
InternalName | 開發人員在封鎖檔案的資源標頭中設定的另一個不可變值。 您可以在檔案規則中將此值取代為 OriginalFileName。-Level FileName -SpecificFileNameLevel InternalName |
FileDescription | 開發人員在封鎖檔案的資源標頭中設定的另一個不可變值。 您可以在檔案規則中將此值取代為 OriginalFileName。-Level FileName -SpecificFileNameLevel FileDescription |
ProductName | 開發人員在封鎖檔案的資源標頭中設定的另一個不可變值。 您可以在檔案規則中將此值取代為 OriginalFileName。-Level FileName -SpecificFileNameLevel ProductName |
FileVersion | 原則的 VersionEx 值,用來對已簽署的原則強制執行版本控制。 |
PolicyGUID | 造成封鎖事件之應用程控原則的 PolicyId。 |
UserWriteable | 布爾值,指出檔案是否位於用戶可寫入的位置。 此資訊適用於診斷 FilePath 規則允許時的問題。 |
PackageFamilyName | 已封裝應用程式的套件系列名稱 (包含封鎖檔案的 MSIX) 。 |
事件 3089 - 應用程控簽章資訊事件
元素名稱 | 描述 |
---|---|
系統 - 相互關聯 - [ActivityID] | 使用相互關聯 ActivityID 來比對應用程控簽章事件與其區塊事件。 |
TotalSignatureCount | 針對封鎖的檔案偵測到的簽章總數。 |
簽章 | 從 0 開始的索引計數,是此 3089 事件中顯示的目前簽章。 如果檔案有多個簽章,您會發現其他簽章有其他 3089 個事件。 |
Hash | 應用程控用來比對檔案的哈希值。 此值應符合 3077 或 3076 區塊事件上顯示的四個哈希之一。 如果找不到檔案的簽章 (TotalSignatureCount = 0) ,則只會顯示哈希值。 |
SignatureType | 簽 章的類型。 |
ValidatedSigningLevel | 簽章符合的 Windows 簽署授權層級。 請參閱 要求和驗證的簽署層級。 |
VerificationError | 此特定簽章無法通過應用程控原則的原因。 請參閱 VerificationError。 |
PublisherName | 從分葉憑證 (CN) 值的一般名稱。 |
IssuerName | 憑證鏈結中最高可用憑證的 CN 值。 此層級通常是根目錄下方的一個憑證。 |
PublisherTBSHash | 分葉憑證的 TBS 哈希。 |
IssuerTBSHash | 憑證鏈結中最高可用憑證的 TBS 哈希。 此層級通常是根目錄下方的一個憑證。 |
範例 3077 和 3089 事件的逐步解說
現在讓我們逐步解說如何使用範例 3077 和 3089 事件中的事件數據,以瞭解應用程控原則封鎖此檔案的原因。
瞭解哪些檔案遭到封鎖,以及封鎖內容
參考 3077 事件,找出識別原則的信息、封鎖的檔案,以及嘗試執行該原則的父進程。 請考慮此內容資訊,以判斷區塊是否為預期和需要。
在此範例中,會 PowerShell.exe 封鎖的檔案,這是 Windows 的一部分,通常預期會執行。 不過,在此情況下,原則是以 Windows in S 模式原則範本為基礎,不允許腳本主機以限制受攻擊面的方式執行。 針對 S 模式,此區塊事件是成功的。 但假設原則作者在選擇範本時未察覺到該條件約束,並將此區塊視為非預期。
判斷應用程控拒絕檔案的原因
再次參考 3077 事件,我們看到要求的簽署層級 2 表示程式碼必須通過應用程控原則。 但驗證的簽署層級 1 表示程式代碼被視為未簽署。 「未簽署」可能表示檔案確實未簽署、已簽署,但憑證無效或已簽署,但應用程控原則不允許任何憑證。
現在,讓我們檢查已封鎖檔案的相互關聯 3089 事件 () 。 在此範例中,我們只會查看在具有多個簽章的檔案上找到的第一個簽章 (簽章索引 0) 。 針對此簽章,ValidatedSigningLevel 為 12,表示其具有Microsoft Windows 產品簽章。 21 的 VerificationError 表示簽章未通過應用程控原則。
請務必檢閱每個相互關聯 3089 事件的信息,因為每個簽章可能有不同的 ValidatedSigningLevel 和 VerificationError。
重要
請注意,3077 事件的驗證簽署層級與 3089 事件上的 ValidatedSigningLevel 的解譯方式非常不同。
在 3077 事件的案例中,驗證的簽署層級會告訴我們 Windows 實際處理二進位檔的方式。
另一方面,在 3089 事件的情況下,ValidatedSigningLevel 會告訴我們簽章可能收到 的最大 層級。 我們必須使用 VerificationError 來瞭解簽章遭到拒絕的原因。
3 - 解決常見問題
分析應用程控診斷數據之後,您可以採取步驟來解決問題,或執行更多偵錯步驟。 以下是您可以嘗試解決或進一步隔離根問題的一些常見問題和步驟:
問題:已封鎖您想要允許的檔案
- 使用核心應用程控事件記錄檔中的數據來新增規則,以允許封鎖的檔案。
- 如果您的原則信任受管理的安裝程式,請使用受管理的安裝程式重新部署檔案或應用程式。
問題:原則作用中且非預期
如果下列情況可能存在:
- 已移除原則,但系統尚未重新啟動。
- 已部分移除原則,但系統或 EFI 磁碟分區中仍存在原則複本。
- 原則標識符為 {A244370E-44C9-4C06-B551-F6016E563076} 的原則 (單一原則格式) 在啟用前複製到多重原則格式原則位置,導致磁碟上有重複的原則二進位檔。 檢查 System 和 EFI 分割區中的 SiPolicy.p7b 和 {A244370E-44C9-4C06-B551-F6016E563076}.cip 檔案。
- 原則未正確部署至裝置。
- 具有系統管理員存取權的攻擊者已套用原則,以對某些重要程式造成阻斷服務。
若要解決這類問題,請遵循移除已識別原則 之應用程控 原則的指示。
問題:發生未處理的應用程式失敗,且未觀察到任何應用程控事件
某些應用程式會在使用者模式應用程控原則作用中時改變其行為,這可能會導致非預期的失敗。 對於未正確處理腳本主機所實作之強制執行行為的應用程式,它也可以是腳本強制執行的副作用。
請嘗試執行下列動作來找出根本原因:
- 檢查本文第 1 節所列的其他事件記錄檔,以瞭解與非預期的應用程式失敗對應的事件。
- 暫時將應用程控原則取代為另一個 停用腳本強制執行 和重新測試的原則。
- 暫時將應用程控原則取代為允許 所有 COM 物件 並重新測試的另一個原則。
- 將應用程控原則暫時取代為另一個放寬其他 原則規則 並重新測試的原則。
問題:受控安裝程式部署的應用程式無法運作
若要使用受管理的安裝程式偵錯問題,請嘗試下列步驟:
- 檢查封鎖應用程式的應用程控原則是否包含啟用受控安裝程序的選項。
- 檢查有效的 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偵錯問題,請嘗試下列步驟:
- 檢查封鎖應用程式的應用程控原則是否包含啟用智慧型手機安全性圖表的選項。
- 檢查 AppLocker 服務是否正在執行。 此資訊可在本文第 1 節中建立的 $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerServices.txt 中找到。
- 使用 fsutil.exe 來確認檔案具有ISG原點擴充屬性。 如果沒有,請使用Managed安裝程式重新部署檔案,然後再次檢查。
- 檢查應用程式是否遇到 ISG的已知限制。
4 - 視需要向Microsoft回報問題
如果遵循本文所涵蓋的指引之後,您認為您已識別出產品問題,請將問題回報給Microsoft。
- 具有Microsoft頂級支援的客戶應該透過一般通道記錄服務要求。
- 所有其他客戶都可以透過 Windows 意見反應中樞,直接向應用程控產品小組回報問題。 選取 [ 安全性 & 隱私權 - 應用程控 ] 類別,以確保問題已正確地路由傳送至應用程控產品小組。
回報問題時,請務必提供下列資訊:
- 先前所述的所有 應用程控診斷數據 。
- 可能的話,封鎖的檔案會 () 。
- 清除重現問題的指示。