WIN7中的Getfiles() UnAuthorizedAccessAcception

Posted

技术标签:

【中文标题】WIN7中的Getfiles() UnAuthorizedAccessAcception【英文标题】:Getfiles() UnAuthorizedAccessAcception in WIN7 【发布时间】:2011-06-16 09:26:19 【问题描述】:

问题

    UnAuthorizedAccessException:递归搜索目录时,例如 C:\ “访问路径 'c:\Documents and Settings\' 被拒绝。”即使在 UAC 特权升级和管理员组访问权限的情况下也会发生。

尝试的方法

    Try & Catch:使用其中一种方法(异常、UnAuthorizedAccessException、Blank Catch、继续)

问题

    如何处理这种异常并继续正常运行程序?这需要对非管理员和管理员帐户都有效。

示例代码

using System;
using System.IO;

namespace filecheck

    class Program
    
        static void Main(string[] args)
        
            int i = 0;
            int html = 0;
            try
            
                string[] filePaths = Directory.GetFiles(@"c:\", "*.html", SearchOption.AllDirectories);

                foreach (string files in filePaths)
                
                    if (Convert.ToBoolean(files.IndexOf("html")))
                    
                        html++;
                    
                    Console.WriteLine(files);
                    i++;

                
                Console.Write("# Files found: 0 Html: 1)", i, html);
            
            catch (UnauthorizedAccessException e)
            
                Console.WriteLine("The process failed: 0", e.ToString());
            
            catch (Exception e)
            
                Console.WriteLine("The process failed: 0", e.ToString());

            

        
    

【问题讨论】:

据我所知,不允许以编程方式访问文档和设置。甚至不是超级管理员 @Theun:什么是“超级管理员”? @Theun:我假设您在谈论隐藏管理员(内置)帐户。我没有尝试过,但这应该可以让您不受限制地访问系统。我不需要那个。只是在寻找一种方法来绕过我的搜索被这种烦人的未经授权的访问废话所阻止。 【参考方案1】:

不幸的是,处理这个问题的唯一方法是手动进行递归。即使在微软自己的sample code 中,他们也是这样做的,只是为了避免由于一个或多个目录无法访问而导致整个搜索失败。

因此,换句话说,仅当您搜索有限的目录子集时才使用SearchOption.AllDirectories,您确定其中不包含任何您无权访问的目录。

【讨论】:

即使有方法在“C:\”中不起作用,它也不会返回任何东西。如果我将示例目录搜索更改为 c:\user\\Desktop 之类的内容,它也会找到我要求的所有内容。我怎么知道要跳过哪些目录?如果当前用户角色没有权限,我是否必须检查文件夹安全属性并跳过它们?必须有一个可能的解决方案。他们说您可以处理异常并继续前进,但这只是完全阻止您的程序运行它让我感到困惑。 @Nightforce2:在 Windows 7(也可能是 Vista)中,系统驱动器的根目录(通常是 C:\)默认情况下是写保护的,但是由于您的代码只能读取,我会认为它不会因此而失败,所以我不确定你为什么会遇到这个问题。如果您的帐户没有系统驱动器根目录的读取权限,我认为它无法实际运行 Windows... 我认为这是因为 UAC。它导致的问题多于解决方案。【参考方案2】:

要让您的程序同时与管理员和非管理员用户一起工作,您需要模拟用户或重新构建您的应用程序以在任何用户执行或使用它时“以管理员身份运行”。要构建这种应用程序,您需要将 app.manifest 文件添加到您的项目中并取消注释 app.manifest 中的以下设置行

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

更多内容请阅读:http://midnightprogrammer.net/post/How-To-Build-UAC-Compatible-Application-In-NET.aspx

【讨论】:

这不适用,因为我是管理员角色并使用 UAC 升级权限。所以你看到设置这个选项只会让 UAC 在我启动程序时提示我用户升级确认。

以上是关于WIN7中的Getfiles() UnAuthorizedAccessAcception的主要内容,如果未能解决你的问题,请参考以下文章

Directory.GetFiles:如何只获取文件名,而不是完整路径? [复制]

Directory.EnumerateFiles 与 Directory.GetFiles 有啥区别?

您可以使用多个过滤器调用 Directory.GetFiles() 吗?

GetFiles()怎样读取多种格式文件?

getFiles() 与 relayjs 突变反应本机

Directory.GetFiles 不返回文件