共用方式為


針對 Azure 檔案儲存體 中的 ClientOtherErrors 進行疑難解答

適用於: ✔️ SMB Azure 檔案共用

本文列出使用 SMB Azure 檔案共享時可能會遇到的 ClientOtherErrors。 一般而言,ClientOtherErrors 大多是無害且預期的錯誤。 要求失敗,但系統會繼續如預期般運作。 正常情況是看到記錄的這些錯誤數量。

什麼是 ClientOtherErrors?

ClientOtherError 通常表示預期的用戶端錯誤,例如「找不到」和「資源已經存在」。在伺服器端記憶體記錄檔中,這些作業會以 ClientOtherErrors 的交易狀態來記錄。

例如,與遠端文件系統互動的 Windows SMB 用戶端不一定知道遠端檔案系統的功能。 它可以是 Windows Server、Azure 檔案儲存體 或其他 SMB 伺服器實作。 因此,SMB 用戶端會使用特定 API 呼叫遠端檔案伺服器。 如果這些 API 失敗,它會回復為使用不同的 API,甚至只忽略這些錯誤。 根據SMB的要求/回應通訊協定,即使系統已正確運作,仍會失敗大量的要求。 這可能是因為授權失敗、嘗試建立名稱已經存在的檔案,或嘗試開啟不存在的檔案。

記錄與報告

若要針對 ClientOtherErrors 進行疑難解答,您可以建立診斷設定,並使用 Azure 監視器 進行報告。 您也可以 分析記錄 以檢視失敗的要求,包括 ClientOtherErrors,或使用 Kusto 查詢

您也可以從符合記錄中顯示的IP位址的用戶端收集 ProcMon 追蹤 。 新增篩選,只查看 Azure 檔案儲存體 的流量。

在 Log Analytics 中查詢 ClientOtherErrors

啟用儲存帳號的診斷日誌後,你可以使用 Log Analytics 查詢特定的 ClientOtherError。 ClientOtherErrors 會以 StatusText 開頭,然後包含特定的錯誤代碼記錄下來,格式為 "ClientOtherError"。

查詢以檢視 ClientOtherErrors

StorageFileLogs
| where StatusText startswith "ClientOtherError"
| project TimeGenerated, StatusText, StatusCode, OperationName, Uri, CallerIpAddress
| order by TimeGenerated desc

查詢以依類型計數錯誤

StorageFileLogs
| where StatusText startswith "ClientOtherError"
| summarize Count = count() by StatusText, OperationName
| order by Count desc

常見的 ClientOtherError 代碼與說明

下表將特定錯誤代碼對應到其說明。 這些錯誤在欄位中 StatusText 顯示為「ClientOtherError;[ErrorCode];[ErrorName]」(例如,「ClientOtherError;492;STATUS_ACCESS_DENIED」)。

運算 狀態代碼 狀態名稱 錯誤的說明
QueryFullEaInformation 0xC00000BB STATUS_NOT_IMPLEMENTED 因為 Azure 檔案儲存體 未實作此 API,因此會傳回此失敗。 Azure 檔案儲存體 目前不支援擴充屬性。
UnknownFileClass=48 0xC00000BB STATUS_NOT_SUPPORTED 這是 FileNormalizedNameInformation API 呼叫。 這是 Windows Server 的新支援,目前 Azure 檔案儲存體 不支援此 API。
FileOpen 0xC0000022(492) STATUS_ACCESS_DENIED 呼叫端沒有開啟檔案的必要許可權。 在 Kerberos 存取的情況下,ACL 會拒絕呼叫端存取。
FileOpen 0xC0000033(257) 物件名稱無效狀態 開啟要求的路徑無效(例如路徑太長或太深)。
FileOpen 0xC00000BA(12) 狀態_檔案_是_目錄 呼叫端正在開啟目錄,而不使用正確的 CreateFile 參數(例如備份意圖)。
FileOpen 0xC0000043(8) 共享狀態違規 呼叫端正在開啟已以限制開啟的檔案(例如,獨佔或其他人只能讀取)。
FileOpen 0xC0000034(6) 狀態_物件_名稱_未找到 呼叫端正在開啟不存在的檔案。
FSCTL_QUERY_NETWORK_INTERFACE_INFO (IOCTL) 0xC0000010 STATUS_INVALID_DEVICE_REQUEST 這隻適用於客戶啟用多重通道功能時 Azure 檔案儲存體。 在其他情況下,不需要,而且我們從客戶端查詢時會傳回無效的裝置要求。
QueryStreamInformation 0xC00000BB STATUS_NOT_IMPLEMENTED 某些文件系統具有替代數據流或其他數據流的概念,例如重新分析點數據流。 Azure 檔案儲存體 沒有這個概念,因此我們不支援 API。
非預期 (IOCTL) 0xC0000010 STATUS_INVALID_DEVICE_REQUEST 這是 FSCTL_QUERY_FILE_REGIONSNTFS/refs 特有的區域概念,與 Azure 檔案儲存體 無關。 因此,我們不實作這段 FSCTL 程式碼。
ChangeNotify 0xC0000120 STATUS_CANCELLED Windows Shell Explorer 之類的應用程式會訂閱檔案的變更通知。 如此一來,當檔案上的屬性變更時,Windows Shell Explorer 會自動在檢視中更新。 用戶端可以選擇取消此訂用帳戶(例如,如果使用者已在 [總管] 中變更檢視,且不再需要它)。 在此情況下,我們會傳送 STATUS_CANCELLED 回用戶端,以確認訂用帳戶已取消。
FSCTL_DFS_GET_REFERRALS (IOCTL) 0xC000019C STATUS_FS_DRIVER_REQUIRED 這是 DFS 轉介要求。 Azure 檔案儲存體 不支援 DFS,而且當系統不支援 DFS 時,這是傳回的正確狀態。
FileSupersede 0xC0000022 STATUS_ACCESS_DENIED 檔案取代是刪除現有檔案並放置新檔案的作業。 如果呼叫端沒有刪除現有檔案的許可權,呼叫將會失敗。
FileCreate 0xC0000033(7) 物件名稱無效狀態 當建立新檔案的要求具有無效的要求名稱時,就會發生這種情況(例如,使用不支援的字元)。
FileCreate 0xC0000035(3) STATUS_OBJECT_NAME_COLLISION (物件名稱衝突) 當建立新檔案的要求具有符合現有檔案的要求名稱時,就會發生這種情況。
參閱 0xC0000022 STATUS_ACCESS_DENIED 當具有未授與讀取存取權的句柄的檔案上完成讀取要求時,就會發生這種情況(例如,檔案是以所需的寫入許可權開啟的)。
TreeConnect 0xC0000022 STATUS_ACCESS_DENIED 在 Kerberos 認證的情境下,呼叫者沒有透過 RBAC 指派的共享層級權限,也沒有預設的共享層級權限。 如果沒有設定共享層級的權限,電腦帳戶會在共享資源上持續遇到這種存取失敗。

常見情境查詢範例

以下是一些常見的 Kusto 查詢範例,可能對你有幫助。

認證與權限失敗

StorageFileLogs
| where StatusText has "STATUS_ACCESS_DENIED"
| where OperationName in ("FileOpen", "TreeConnect", "Read", "FileSupersede")
| project TimeGenerated, OperationName, Uri, CallerIpAddress, AuthenticationType, RequesterUpn
| order by TimeGenerated desc

檔案未找到錯誤

StorageFileLogs
| where StatusText has "STATUS_OBJECT_NAME_NOT_FOUND"
| project TimeGenerated, Uri, CallerIpAddress, OperationName
| order by TimeGenerated desc

無效的檔案操作,如命名錯誤、路徑錯誤及共享錯誤

StorageFileLogs
| where StatusText has_any ("STATUS_OBJECT_NAME_INVALID", "STATUS_SHARING_VIOLATION", "STATUS_OBJECT_NAME_COLLISION")
| project TimeGenerated, StatusText, OperationName, Uri, CallerIpAddress
| order by TimeGenerated desc

產生 ClientOtherErrors 的主要客戶端

StorageFileLogs
| where StatusText startswith "ClientOtherError"
| summarize ErrorCount = count() by CallerIpAddress, bin(TimeGenerated, 1h)
| order by ErrorCount desc

另請參閱