首页 > 解决方案 > .NET 进程失去对共享的访问权限;进程重启时恢复访问

问题描述

我遇到了一个奇怪的问题,它只出现在生产中,并且只有在流程运行了几天,有时是几周之后才会出现。触发错误的代码非常简单。它正在查看报告目录以删除旧数据:

public void DeleteOldReports(){
    DateTime now=DateTime.Now;
    foreach(String filePath in 
        new DirectoryInfo(ReportPath)
            .GetFiles()
            .Where(x=>x.Name.StartsWith("webReport-",StringComparison.CurrentCultureIgnoreCase) && (now-x.LastWriteTime)>WebReportLifetime)
            .Select(x=>x.FullName)
            .ToList()
    ){File.Delete(filePath);}
}

调用时抛出异常new DirectoryInfo(ReportPath).GetFiles(),这是一个简单的文件读取操作。

例外是:

System.UnauthorizedAccessException:对路径“\\inst7\appsupp\btc_webreports”的访问被拒绝。在 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 在 System.IO.FileSystemEnumerableIterator 1.CommonInit() at System.IO.FileSystemEnumerableIterator1..ctor(String path, String originalUserPath, String searchPattern, SearchOption searchOption, SearchResultHandler`1 resultHandler, Boolean checkHost) 在 System.IO .DirectoryInfo.InternalGetFiles(String searchPattern, SearchOption searchOption) 在 cf.core.WebReportManager.DeleteOldReports() 在 WebReportManager.cs:line 26

这个例程可以在几天或几周内正常工作,但是一旦抛出第一个异常,它将在每次访问尝试时继续抛出异常。在重新启动该过程之前,它永远不会再次工作。

现在,如果它只发生一次然后恢复,我不会担心。也许“inst7”暂时离线。或者,在确定对共享的访问方面发挥作用的域控制器或其他一些 VM 可能暂时不可用。但这不是这里发生的事情。就好像某些允许我的进程访问该路径的特定令牌或权限已过期或已被撤销。重新启动该过程会立即解决问题。

一旦进程进入这种不良状态,据我所知,就无法重新获得访问权限。尽管事实上我可以在 Windows 资源管理器中毫无问题地导航到有问题的文件夹,此外,通过“查看有效访问”进行的权限测试表明没有问题。

参与交互的所有 VM 都在 AWS 上运行 Windows 2016 Server。

我该如何解决这个问题?

最好的,

非斯都

标签: c#.netfile-permissionsfile-access

解决方案


推荐阅读