问题描述
我想获取驱动器 C 中的所有文件和文件夹。 事实上,我想要一个驱动器上所有文件的列表。所有文件及其路径。 我使用此代码。但遇到错误。
static void Main(string[] args)
{
System.IO.DriveInfo di = new System.IO.DriveInfo(@"C:\");
System.IO.DirectoryInfo dirInfo = di.RootDirectory;
System.IO.FileInfo[] fileNames = dirInfo.GetFiles("*.*");
System.IO.DirectoryInfo[] dirInfos = dirInfo.GetDirectories("*.*");
foreach (System.IO.DirectoryInfo d in dirInfos)
{
string[] filePaths = Directory.GetFiles(d.FullName,"*.*",SearchOption.AllDirectories);
}
}
解决方法
您可以简单地排除无法访问的目录,方法是一一搜索它们并使用 try-catch 块包围所有搜索。下面是一个例子:
Console.WriteLine("Input search pattern (or empty to search all):");
string pattern = Console.ReadLine();
if (pattern == "")
{
pattern = "*";
}
List<string> allDirectories = new List<string>{ @"C:\" });
Stack<string> directories = new Stack<string>(allDirectories);
List<string[]> allFiles = new List<string[]>();
while (directories.Count > 0)
{
try
{
Console.WriteLine("Searching " + directories.Peek() + " for " + pattern);
foreach (string dir in Directory.GetDirectories(directories.Pop()))
{
directories.Push(dir);
allDirectories.Add(dir);
try
{
allFiles.Add(Directory.GetFiles(dir,pattern,SearchOption.TopDirectoryOnly));
}
catch (UnauthorizedAccessException e)
{
Console.WriteLine(e.Message);
}
}
}
catch (UnauthorizedAccessException e)
{
Console.WriteLine(e.Message);
}
}
Console.WriteLine("FINISHED");
这会将所有文件收集到 allFiles 列表(作为路径)并将目录收集到 allDirectories 列表中。 这对我来说运行了大约 10 分钟,所以不要调试很多次。
,您需要做的第一件事是使用要求 root 权限的清单文件编译您的 C# 应用程序(按照以下说明操作:How do I force my .NET application to run as administrator?)。 接下来,您应该做的是获得具有管理员权限的任何类型的用户/正在运行的应用程序,并让它启动您的 C# 应用程序。 我认为,如果您通过具有 root 权限的应用程序执行上述操作,那么在 C# 应用程序启动时不会向用户弹出 UAC。
如果您的应用没有 root 权限,您将无法读取未授权文件夹的目录树。 C# 是一种托管语言,这意味着 C# 依靠操作系统来运行,因此它不能绕过操作系统。即使有 root 权限,操作系统也会知道您的应用操作。
但是如果你的目标是弄清楚 C# dll 是否可以恶意读取 C 盘的文件夹树,我认为这是可能的:
- 如上所述,您需要将 C# 代码编译为带有清单的 exe 文件。
- 然后,创建一个批处理文件,该文件将使用 root 权限启动 CLR 进程(它可能会通过 UAC 提示提醒用户,但普通用户不会怀疑 CLR)。
- 确保您的批处理将使用用户权限而不是默认权限运行,否则下一步将不起作用。
- 您的批处理应该告诉 clr 加载 C# exe,我相信不会提示任何 UAC,或者批处理可以代表用户在没有任何提示的情况下接受。 4'。如果我错了,也许这篇文章https://www.codeproject.com/Articles/607352/Injecting-NET-Assemblies-Into-Unmanaged-Processes#PuttingItAllTogether会帮助你在没有 UAC 提示的情况下将 exe 注入到 clr 中。
让我知道你是否按照我的建议继续研究以及结果是什么:-)