删除Service Fabric创建的目录时遇UnauthorizedAccessException异常
Service Fabric日志目录权限拒绝无法删除:原因与解决办法
问题现象
尝试删除Service Fabric生成的C:\SfDevCluster\log\Traces目录时,执行PowerShell命令报错权限拒绝:
PS C:\SfDevCluster\log> Remove-Item -path .\Traces\ -recurse -force Remove-Item : Cannot remove item C:\SfDevCluster\log\Traces\fabric_traces_9.1.1390.9590_133197288382564134_0.etl: Access to the path is denied. At line:1 char:1 + Remove-Item -path .\Traces\ -recurse -force + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (fabric_traces_9...382564134_0.etl:FileInfo) [Remove-Item], ArgumentException + FullyQualifiedErrorId : RemoveFileSystemItemArgumentError,Microsoft.PowerShell.Commands.RemoveItemCommand Remove-Item : Cannot remove item C:\SfDevCluster\log\Traces\lease_traces_9.1.1390.9590_133197288382737081_0.etl: Access to the path is denied. At line:1 char:1 + Remove-Item -path .\Traces\ -recurse -force + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (lease_traces_9....382737081_0.etl:FileInfo) [Remove-Item], ArgumentException + FullyQualifiedErrorId : RemoveFileSystemItemArgumentError,Microsoft.PowerShell.Commands.RemoveItemCommand Remove-Item : Cannot remove item C:\SfDevCluster\log\Traces\: 目录不为空。 At line:1 char:1 + Remove-Item -path .\Traces\ -recurse -force + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : WriteError: (C:\SfDevCluster\log\Traces\:DirectoryInfo) [Remove-Item], IOException + FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
执行get-acl查看文件权限也被拒绝:
PS C:\SfDevCluster\log\Traces> get-acl * get-acl : 无权访问 At line:1 char:1 + get-acl * + ~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Get-Acl], UnauthorizedAccessException + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.GetAclCommand
目录权限显示管理员组拥有完全控制,但文件权限无法读取:
PS C:\SfDevCluster\log> Get-Acl .\Traces\ | Format-List Path : Microsoft.PowerShell.Core\FileSystem::C:\SfDevCluster\log\Traces\ Owner : BUILTIN\Administratorer Group : NT AUTHORITY\SYSTEM Access : BUILTIN\Administratorer Allow FullControl NT AUTHORITY\SYSTEM Allow FullControl BUILTIN\Users Allow ReadAndExecute, Synchronize NT AUTHORITY\Authenticated Users Allow Modify, Synchronize NT AUTHORITY\Authenticated Users Allow -536805376 Audit : Sddl : O:BAG:SYD:(A;OICIID;FA;;;BA)(A;OICIID;FA;;;SY)(A;OICIID;0x1200a9;;;BU)(A;ID;0x1301bf;;;AU)(A;OICIIOID;SDGXGWGR;;;AU)
确认当前用户属于管理员组,但操作仍受限:
PS C:\SfDevCluster\log\Traces> whoami puter\caec PS C:\SfDevCluster\log\Traces> net user caec|select-string medlem 本地组成员身份 *Administratorer 全局组成员身份: *无
执行takeown仅能获取目录所有权,文件权限仍无法获取:
takeown /F .\Traces\ /R /D Y SUCCESS: 文件夹 "C:\SfDevCluster\log\Traces\" 现在由用户 "puter\caec" 拥有。 INFO: 无权访问。( "C:\SfDevCluster\log\Traces\fabric_traces_9.1.1390.9590_133197288382564134_0.etl" ) INFO: 无权访问。( "C:\SfDevCluster\log\Traces\lease_traces_9.1.1390.9590_133197288382737081_0.etl" )
GUI查看文件权限时提示:
You do not have permission to view or edit this object's permission settings.
重启Windows可临时解决,但该问题多次出现。
根本原因
- 进程文件锁定:Service Fabric的核心进程(如
FabricHost.exe、Fabric.exe)或ETW日志追踪会话仍持有.etl文件的句柄,Windows会阻止对被活跃进程锁定的文件进行删除、权限修改操作。 - 文件级特殊权限:Service Fabric生成
.etl文件时,会单独设置文件权限(中断目录权限继承),仅允许SYSTEM或Service Fabric服务账户访问,即使目录开放管理员权限,文件本身的权限仍会限制操作。 - UAC权限过滤:默认情况下,PowerShell或文件管理器以标准用户权限运行,UAC会过滤部分管理员权限,导致无法访问被严格保护的系统级文件。
- ETW日志特性:
.etl是Windows事件追踪日志文件,若对应的ETW会话未停止,系统会持续锁定文件,直到会话结束。
无需重启的解决办法
1. 停止Service Fabric相关进程
- 任务管理器中结束
FabricHost.exe、Fabric.exe、FabricGateway.exe等进程; - 或通过PowerShell停止服务:
进程停止后再尝试删除或修改权限。Stop-Service FabricHostSvc Stop-Service FabricSvc
2. 定位并释放文件锁
- 使用Process Explorer(微软官方工具),按
Ctrl+F搜索被锁定的.etl文件名,找到持有句柄的进程并结束,即可操作文件。
3. 高权限执行命令
- 右键PowerShell选择以管理员身份运行,依次执行:
# 获取所有.etl文件所有权 takeown /F "C:\SfDevCluster\log\Traces\*.etl" /A # 赋予管理员组完全控制权限 icacls "C:\SfDevCluster\log\Traces\*.etl" /grant Administrators:F /T # 删除目录 Remove-Item -path "C:\SfDevCluster\log\Traces\" -recurse -force
4. 停止ETW追踪会话
- 管理员身份打开命令提示符,查看活跃ETW会话:
logman query -ets - 找到Service Fabric相关会话,执行停止命令:
会话停止后日志文件会被释放。logman stop <会话名称> -ets
预防措施
- 删除日志前先停止Service Fabric集群或日志收集服务;
- 配置Service Fabric日志自动清理策略,减少手动操作需求;
- 定期重启Service Fabric相关服务,避免文件句柄长期锁定。
内容的提问来源于stack exchange,提问作者Jason Hunter
相关产品推荐
相关产品推荐

