C# 以管理员身份运行的程序可以';无法访问某些路径

C# 以管理员身份运行的程序可以';无法访问某些路径,c#,.net,winapi,unauthorizedaccessexcepti,C#,.net,Winapi,Unauthorizedaccessexcepti,我正在创建一个C#程序,用于检查所有.exe文件的签名,并执行一些其他检查。应用程序请求以管理员身份使用UAC运行,并在启动时进行检查(我们确定是以管理员权限运行的) 然而,当我递归地检查一些路径时,我得到了一些我无法访问的文件夹。例如: DirectoryInfo dir = new DirectoryInfo(System.Environment.GetFolderPath(System.Environment.SpecialFolder.CommonApplicationData)); F

我正在创建一个C#程序,用于检查所有.exe文件的签名,并执行一些其他检查。应用程序请求以管理员身份使用UAC运行,并在启动时进行检查(我们确定是以管理员权限运行的)

然而,当我递归地检查一些路径时,我得到了一些我无法访问的文件夹。例如:

DirectoryInfo dir = new DirectoryInfo(System.Environment.GetFolderPath(System.Environment.SpecialFolder.CommonApplicationData));
FileInfo[] files = dir.GetFiles("*.exe", SearchOption.AllDirectories);
正在投掷:

 System.UnauthorizedAccessException: Access to the path 'C:\ProgramData\Application Data' is denied.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileSystemEnumerableIterator`1.AddSearchableDirsToStack(SearchData localSearchData)
   at System.IO.FileSystemEnumerableIterator`1.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.IO.DirectoryInfo.InternalGetFiles(String searchPattern, SearchOption searchOption)
   at "the lines above"

有没有办法访问这些路径?如果这是不可能的,获取文件跳过这些路径而不停止的方法也非常受欢迎。

仅仅因为您是管理员并不意味着您可以访问所有内容
例如,“默认情况下”,管理员也无法访问用户个人文件夹,但作为管理员,您可以“赋予自己该权限”

因此,您要么更改所有此类文件夹的权限,要么干脆不使用此类文件夹

更新:

在不可能的情况下,获取文件的方法跳过这些路径而不停止也是非常值得赞赏的

您可以选择“每个文件夹”的递归扫描(无论如何都应该进行):


您是否已尝试通过命令提示符添加对要访问的文件的读/写权限

如果您只需要临时访问此文件,最好在完成读/写操作后删除权限,否则,我会考虑授予某些用户权限,而不是修改文件系统中的权限。这两种方法都有效,取决于你的目标


你能给我举一个文件夹的例子吗?我想查看此文件夹的权限。
C:\ProgramData\Application Data
与异常消息中一样,它位于异常中,例如“C:\ProgramData\Application Data”。这台电脑是标准的Win 7搜索本网站的
[c#]系统。未经授权的访问例外情况
。这个问题以前在这里被问过很多次(并得到了回答)。我的意思是使用directory.GetAccessControl方法返回目录的Windows访问控制列表(ACL)。这不是个人文件夹。。。“个人文件夹”只是一个例子——重要的事实是,即使您是管理员,也很可能无法访问文件夹。只需打开这样一个文件夹的属性对话框,并在安全选项卡中检查
Administrator
组的权限……很抱歉,这不是一个解决方案,因为我需要在多台PC中的多个路径上运行它,并且应该以编程方式完成。有没有办法获取跳过这些路径的文件?谢谢!这将非常有用:)另一个选项是启用备份权限。这基本上告诉Windows停止检查安全权限。在某些情况下,您还必须向API函数传递一个特殊标志,但不能用于目录枚举。
public void Scan(DirectoryInfo dir = null)
{
    if (dir == null)
    {
        dir = new DirectoryInfo(System.Environment
              .GetFolderPath(System.Environment.SpecialFolder.CommonApplicationData));
    }

    try
    {
        var dirs = dir.GetDirectories();
        foreach (var subDir in dirs)
            Scan(subDir);

        var files = dir.GetFiles("*.exe", SearchOption.TopDirectoryOnly);
        foreach (var file in files)
            // check file
    }
    catch(UnauthorizedAccessException)
    {
        // log error
    }
}