0

我正在创建一个 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 跳过这些路径而不停止的方法也非常感谢。

4

2 回答 2

2

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

因此,要么更改所有此类文件夹的权限,要么直接忽略此类文件夹。

更新:

如果不可能,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
    }
}
于 2014-11-26T15:33:19.413 回答
0

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

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

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

于 2014-11-26T15:43:52.987 回答