作为系统运行的Windows服务无法访问C:\ users \

时间:2012-02-01 02:20:28

标签: c#

我已将Windows服务安装为本地系统帐户,有时它会在计算机上构建目录列表。它在Windows 7下的c:\ users ...目录下失败。我检查了这些文件夹,它们似乎在系统帐户的完全控制下。为什么我无法访问这些目录?

System.UnauthorizedAccessException: Access to the path 'C:\Users\Public\Documents\My         Videos' is denied.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.InternalGetFileDirectoryNames(String path, String userPathOriginal,   String searchPattern, Boolean includeFiles, Boolean includeDirs, SearchOption searchOption)
at System.IO.Directory.GetDirectories(String path, String searchPattern, SearchOption searchOption)
at LS.Core.Backup.DirectoryMapper.GetDirectories(String SeedDir, Int32 Count)

更新

有关详细信息,请参阅下面的答案,但我还发布了我用来解决此问题的课程。见GitHub Gist - DirectoryHelper

3 个答案:

答案 0 :(得分:1)

当你在我的帖子上发表一个想法时,我想我会回报你的帮助。是的,我知道你已经找到了解决方案......

我在MSDN上使用了这种迭代搜索的变体 - Iterate Through a Directory Tree

如果您希望访问未经授权的文件或文件夹,则可以在错误处理中提示提升权限。

希望它有所帮助。

干杯,

答案 1 :(得分:1)

所以我最终自己回答了这个问题。问题在于使用Directory.GetFiles()Directory.GetDirectories()。在Windows 7中,使用这些方法,在C:\ Users ...树下搜索时会遇到连接点和/或硬链接,因为为了向后兼容XP生成应用程序而添加了连接点。当您尝试读取其中一个联结时,MS会触发UnauthorizedAccessException(以防止在这些联结的排列中出现可能的无限循环),并导致整个GetFiles()GetDirectories()调用失败,不返回任何内容。作为一个解决方案,我实现了http://tom-shelton.net/index.php/2010/01/02/using-extension-methods-and-the-win32-api-to-efficiently-enumerate-the-file-system/的变体,它将一次迭代一个文件,允许您在遇到交汇点时继续处理异常。非常迟钝的问题,希望它有助于某人。

答案 2 :(得分:0)

使用来自Sysinternals(Microsoft Technet)的Process Monitor等工具,查看更具体的错误详细信息。该消息可能具有误导性; “拒绝访问”错误的一些常见情况包括打开文件和防病毒软件。