以管理员身份运行的程序无法访问某些路径

时间:2014-11-26 15:24:50

标签: c# .net winapi unauthorizedaccessexcepti

我正在创建一个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"

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

2 个答案:

答案 0 :(得分:2)

仅仅因为你是管理员并不意味着你可以访问所有内容! 例如。管理员也无法访问用户个人文件夹"默认情况下",但作为管理员,您可以'#34;给自己这个权利"。

因此,您要么更改所有此类文件夹的权限,要么只留下这些文件夹。

更新:

  

如果不可能,GetFiles跳过这些路径而不停止的方法也非常受欢迎。

您可以选择递归扫描"每个文件夹" (应该以任何方式完成IMO):

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
    }
}

答案 1 :(得分:0)

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

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

http://support.microsoft.com/kb/308419