我正在创建一个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不停止跳过这些路径的方法也非常受欢迎。
答案 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)
您是否尝试过对您尝试通过命令提示符访问的文件添加读/写权限?
如果您只需要临时访问此文件,最好在完成读/写操作后删除权限,否则,我会考虑授予某些用户权限,而不是修改文件系统中的权限。无论哪种方式都有效,取决于你的目标。