- rewrote Directory.Get* to Directory.Enumerate* to improve search speed

This commit is contained in:
makikvues 2021-02-04 21:07:56 +01:00
parent 2f4c58d202
commit 839e4a79ba
13 changed files with 169 additions and 153 deletions

View File

@ -318,7 +318,7 @@ namespace winPEAS.Checks
Beaprint.MainPrint("Looking for possible regs with creds");
Beaprint.LinkPrint("https://book.hacktricks.xyz/windows/windows-local-privilege-escalation#inside-the-registry");
string winVnc4 = RegistryHelper.GetRegValue("HKLM", @"SOFTWARE\RealVNC\WinVNC4", "passwword");
string winVnc4 = RegistryHelper.GetRegValue("HKLM", @"SOFTWARE\RealVNC\WinVNC4", "password");
if (!string.IsNullOrEmpty(winVnc4.Trim()))
{
Beaprint.BadPrint(winVnc4);
@ -731,7 +731,7 @@ namespace winPEAS.Checks
if (Directory.Exists(path))
{
var files = Directory.GetFiles(path, pattern, SearchOption.TopDirectoryOnly);
var files = Directory.EnumerateFiles(path, pattern, SearchOption.TopDirectoryOnly);
foreach (var file in files)
{

View File

@ -128,7 +128,7 @@ namespace winPEAS.Checks
string transcriptsPath = drive + @"transcripts\";
string usersPath = $"{drive}users";
string[] users = Directory.GetDirectories(usersPath, "*", SearchOption.TopDirectoryOnly);
var users = Directory.EnumerateDirectories(usersPath, "*", SearchOption.TopDirectoryOnly);
string powershellTranscriptFilter = "powershell_transcript*";
var colors = new Dictionary<string, string>()
@ -159,7 +159,7 @@ namespace winPEAS.Checks
{
try
{
var files = Directory.GetFiles(path, filter, SearchOption.TopDirectoryOnly).ToList();
var files = Directory.EnumerateFiles(path, filter, SearchOption.TopDirectoryOnly).ToList();
foreach (var file in files)
{

View File

@ -325,8 +325,8 @@ namespace winPEAS.Helpers.AppLocker
try
{
var subfolders = Directory.GetDirectories(path);
var files = Directory.GetFiles(path, "*", SearchOption.TopDirectoryOnly);
var subfolders = Directory.EnumerateDirectories(path);
var files = Directory.EnumerateFiles(path, "*", SearchOption.TopDirectoryOnly);
ruleType = ruleType.ToLower();

View File

@ -264,9 +264,9 @@ namespace winPEAS.Helpers
results[path] = String.Join(", ", GetPermissionsFolder(path, Checks.Checks.CurrentUserSiDs));
if (string.IsNullOrEmpty(results[path]))
{
foreach (string d in Directory.GetDirectories(path))
foreach (string d in Directory.EnumerateDirectories(path))
{
foreach (string f in Directory.GetFiles(d))
foreach (string f in Directory.EnumerateFiles(d))
{
results[f] = String.Join(", ", GetPermissionsFile(f, Checks.Checks.CurrentUserSiDs));
}

View File

@ -115,55 +115,53 @@ namespace winPEAS.Helpers.Search
return result;
}
private static List<DirectoryInfo> GetStartDirectories(string folder, ConcurrentBag<CustomFileInfo> files, string pattern, bool isFoldersIncluded = false)
private static IEnumerable<DirectoryInfo> GetStartDirectories(string folder, ConcurrentBag<CustomFileInfo> files, string pattern, bool isFoldersIncluded = false)
{
DirectoryInfo dirInfo = null;
DirectoryInfo[] directories = null;
try
while (true)
{
dirInfo = new DirectoryInfo(folder);
directories = dirInfo.GetDirectories();
if (isFoldersIncluded)
DirectoryInfo[] directories = null;
try
{
foreach (var directory in directories)
var dirInfo = new DirectoryInfo(folder);
directories = dirInfo.GetDirectories();
if (isFoldersIncluded)
{
files.Add(new CustomFileInfo(null, null, directory.FullName));
foreach (var directory in directories)
{
files.Add(new CustomFileInfo(null, null, directory.FullName));
}
}
}
foreach (var f in dirInfo.GetFiles(pattern))
foreach (var f in dirInfo.GetFiles(pattern))
{
files.Add(new CustomFileInfo(f.Name, f.Extension, f.FullName));
}
if (directories.Length > 1) return new List<DirectoryInfo>(directories);
if (directories.Length == 0) return new List<DirectoryInfo>();
}
catch (UnauthorizedAccessException)
{
files.Add(new CustomFileInfo(f.Name, f.Extension, f.FullName));
return new List<DirectoryInfo>();
}
catch (PathTooLongException)
{
return new List<DirectoryInfo>();
}
catch (DirectoryNotFoundException)
{
return new List<DirectoryInfo>();
}
catch (Exception)
{
return new List<DirectoryInfo>();
}
if (directories.Length > 1)
return new List<DirectoryInfo>(directories);
if (directories.Length == 0)
return new List<DirectoryInfo>();
folder = directories[0].FullName;
isFoldersIncluded = false;
}
catch (UnauthorizedAccessException)
{
return new List<DirectoryInfo>();
}
catch (PathTooLongException)
{
return new List<DirectoryInfo>();
}
catch (DirectoryNotFoundException)
{
return new List<DirectoryInfo>();
}
catch (Exception)
{
return new List<DirectoryInfo>();
}
return GetStartDirectories(directories[0].FullName, files, pattern);
}
internal static void CreateSearchDirectoriesList()
@ -205,15 +203,14 @@ namespace winPEAS.Helpers.Search
internal static void CleanLists()
{
// TODO
//SearchHelper.RootDirUsers = null;
//SearchHelper.RootDirCurrentUser = null;
//SearchHelper.ProgramFiles = null;
//SearchHelper.ProgramFilesX86 = null;
//SearchHelper.DocumentsAndSettings = null;
//SearchHelper.GroupPolicyHistory = null;
SearchHelper.RootDirUsers = null;
SearchHelper.RootDirCurrentUser = null;
SearchHelper.ProgramFiles = null;
SearchHelper.ProgramFilesX86 = null;
SearchHelper.DocumentsAndSettings = null;
SearchHelper.GroupPolicyHistory = null;
//GC.Collect();
GC.Collect();
}
internal static IEnumerable<CustomFileInfo> SearchUserCredsFiles()
@ -253,26 +250,30 @@ namespace winPEAS.Helpers.Search
foreach (var file in SearchHelper.RootDirCurrentUser)
{
string extLower = file.Extension.ToLower();
string nameLower = file.Filename.ToLower();
if (!file.IsDirectory)
{
string extLower = file.Extension.ToLower();
string nameLower = file.Filename.ToLower();
if (Patterns.WhitelistExtensions.Contains(extLower) ||
Patterns.WhiteListExactfilenamesWithExtensions.Contains(nameLower))
{
result.Add(file.FullPath);
}
else
{
foreach (var pattern in Patterns.WhiteListRegexp)
if (Patterns.WhitelistExtensions.Contains(extLower) ||
Patterns.WhiteListExactfilenamesWithExtensions.Contains(nameLower))
{
if (Regex.IsMatch(nameLower, pattern, RegexOptions.IgnoreCase))
result.Add(file.FullPath);
}
else
{
foreach (var pattern in Patterns.WhiteListRegexp)
{
result.Add(file.FullPath);
if (Regex.IsMatch(nameLower, pattern, RegexOptions.IgnoreCase))
{
result.Add(file.FullPath);
break;
break;
}
}
}
}
}
}
return result;
@ -289,11 +290,14 @@ namespace winPEAS.Helpers.Search
foreach (var file in SearchHelper.GroupPolicyHistory)
{
string extLower = file.Extension.ToLower();
if (allowedExtensions.Contains(extLower))
if (!file.IsDirectory)
{
result.Add(file.FullPath);
string extLower = file.Extension.ToLower();
if (allowedExtensions.Contains(extLower))
{
result.Add(file.FullPath);
}
}
}
@ -317,11 +321,14 @@ namespace winPEAS.Helpers.Search
foreach (var file in searchFiles)
{
string filenameToLower = file.Filename.ToLower();
if (allowedFilenames.Contains(filenameToLower))
if (!file.IsDirectory)
{
result.Add(file.FullPath);
string filenameToLower = file.Filename.ToLower();
if (allowedFilenames.Contains(filenameToLower))
{
result.Add(file.FullPath);
}
}
}
@ -349,25 +356,28 @@ namespace winPEAS.Helpers.Search
foreach (var file in SearchHelper.RootDirCurrentUser)
{
string extLower = file.Extension.ToLower();
string nameLower = file.Filename.ToLower();
if (!file.IsDirectory)
{
string extLower = file.Extension.ToLower();
string nameLower = file.Filename.ToLower();
if (allowedExtensions.Contains(extLower))
{
result.Add(file.FullPath);
}
else
{
foreach (var pattern in allowedRegexp)
if (allowedExtensions.Contains(extLower))
{
if (Regex.IsMatch(nameLower, pattern, RegexOptions.IgnoreCase))
result.Add(file.FullPath);
}
else
{
foreach (var pattern in allowedRegexp)
{
result.Add(file.FullPath);
if (Regex.IsMatch(nameLower, pattern, RegexOptions.IgnoreCase))
{
result.Add(file.FullPath);
break;
break;
}
}
}
}
}
}
return result;
@ -394,25 +404,28 @@ namespace winPEAS.Helpers.Search
foreach (var file in SearchHelper.RootDirUsers)
{
string extLower = file.Extension.ToLower();
string nameLower = file.Filename.ToLower();
if (!file.IsDirectory)
{
string extLower = file.Extension.ToLower();
string nameLower = file.Filename.ToLower();
if (allowedExtensions.Contains(extLower))
{
result.Add(file.FullPath);
}
else
{
foreach (var pattern in allowedRegexp)
if (allowedExtensions.Contains(extLower))
{
if (Regex.IsMatch(nameLower, pattern, RegexOptions.IgnoreCase))
result.Add(file.FullPath);
}
else
{
foreach (var pattern in allowedRegexp)
{
result.Add(file.FullPath);
if (Regex.IsMatch(nameLower, pattern, RegexOptions.IgnoreCase))
{
result.Add(file.FullPath);
break;
break;
}
}
}
}
}
}
return result;

View File

@ -343,7 +343,7 @@ namespace winPEAS.Info.ApplicationInfo
try
{
var userDirs = Directory.GetDirectories(usersPath);
var userDirs = Directory.EnumerateDirectories(usersPath);
foreach (var userDir in userDirs)
{
@ -363,7 +363,7 @@ namespace winPEAS.Info.ApplicationInfo
{
try
{
var files = Directory.GetFiles(path, "*", SearchOption.TopDirectoryOnly);
var files = Directory.EnumerateFiles(path, "*", SearchOption.TopDirectoryOnly);
foreach (string filepath in files)
{

View File

@ -70,14 +70,14 @@ namespace winPEAS.Info.ApplicationInfo
var results = new SortedDictionary<string, Dictionary<string, string>>();
try
{
foreach (string f in Directory.GetFiles(fpath))
foreach (string f in Directory.EnumerateFiles(fpath))
{
results[f] = new Dictionary<string, string>
{
{ f, string.Join(", ", PermissionsHelper.GetPermissionsFile(f, Checks.Checks.CurrentUserSiDs)) }
};
}
foreach (string d in Directory.GetDirectories(fpath))
foreach (string d in Directory.EnumerateDirectories(fpath))
{
results[d] = PermissionsHelper.GetRecursivePrivs(d);
}

View File

@ -107,7 +107,7 @@ namespace winPEAS.KnownFileCreds.Browsers.Chrome
if (MyUtils.IsHighIntegrity())
{
string userFolder = $"{Environment.GetEnvironmentVariable("SystemDrive")}\\Users\\";
string[] dirs = Directory.GetDirectories(userFolder);
var dirs = Directory.EnumerateDirectories(userFolder);
foreach (string dir in dirs)
{
string[] parts = dir.Split('\\');
@ -205,7 +205,7 @@ namespace winPEAS.KnownFileCreds.Browsers.Chrome
Console.WriteLine("\r\n\r\n=== Chrome (All Users) ===");
string userFolder = string.Format("{0}\\Users\\", Environment.GetEnvironmentVariable("SystemDrive"));
string[] dirs = Directory.GetDirectories(userFolder);
var dirs = Directory.EnumerateDirectories(userFolder);
foreach (string dir in dirs)
{
string[] parts = dir.Split('\\');

View File

@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using winPEAS.Checks;
using winPEAS.Helpers;
@ -91,7 +92,7 @@ namespace winPEAS.KnownFileCreds.Browsers.Firefox
if (MyUtils.IsHighIntegrity())
{
string userFolder = $"{Environment.GetEnvironmentVariable("SystemDrive")}\\Users\\";
string[] dirs = Directory.GetDirectories(userFolder);
var dirs = Directory.EnumerateDirectories(userFolder);
foreach (string dir in dirs)
{
string[] parts = dir.Split('\\');
@ -102,7 +103,7 @@ namespace winPEAS.KnownFileCreds.Browsers.Firefox
string userFirefoxBasePath = $"{dir}\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\";
if (System.IO.Directory.Exists(userFirefoxBasePath))
{
string[] directories = Directory.GetDirectories(userFirefoxBasePath);
var directories = Directory.EnumerateDirectories(userFirefoxBasePath);
foreach (string directory in directories)
{
string firefoxCredentialFile3 = $"{directory}\\{"key3.db"}";
@ -129,7 +130,7 @@ namespace winPEAS.KnownFileCreds.Browsers.Firefox
if (Directory.Exists(userFirefoxBasePath))
{
string[] directories = Directory.GetDirectories(userFirefoxBasePath);
var directories = Directory.EnumerateDirectories(userFirefoxBasePath);
foreach (string directory in directories)
{
string firefoxCredentialFile3 = $"{directory}\\{"key3.db"}";
@ -163,7 +164,7 @@ namespace winPEAS.KnownFileCreds.Browsers.Firefox
if (MyUtils.IsHighIntegrity())
{
string userFolder = $"{Environment.GetEnvironmentVariable("SystemDrive")}\\Users\\";
string[] dirs = Directory.GetDirectories(userFolder);
var dirs = Directory.EnumerateDirectories(userFolder);
foreach (string dir in dirs)
{
string[] parts = dir.Split('\\');
@ -194,7 +195,7 @@ namespace winPEAS.KnownFileCreds.Browsers.Firefox
// parses a Firefox history file via regex
if (Directory.Exists(path))
{
string[] directories = Directory.GetDirectories(path);
var directories = Directory.EnumerateDirectories(path);
foreach (string directory in directories)
{
string firefoxHistoryFile = string.Format("{0}\\{1}", directory, "places.sqlite");
@ -239,16 +240,16 @@ namespace winPEAS.KnownFileCreds.Browsers.Firefox
try
{
string[] dirs = Directory.GetDirectories(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Mozilla\\Firefox\\Profiles"));
var dirs = Directory.EnumerateDirectories(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Mozilla\\Firefox\\Profiles")).ToList();
if (dirs.Length == 0)
if (!dirs.Any())
{
return logins;
}
foreach (string dir in dirs)
{
string[] files = Directory.GetFiles(dir, "signons.sqlite");
string[] files = Directory.EnumerateFiles(dir, "signons.sqlite").ToArray();
if (files.Length > 0)
{
signonsFile = files[0];
@ -256,7 +257,7 @@ namespace winPEAS.KnownFileCreds.Browsers.Firefox
}
// find &quot;logins.json"file
files = Directory.GetFiles(dir, "logins.json");
files = Directory.EnumerateFiles(dir, "logins.json").ToArray();
if (files.Length > 0)
{
loginsFile = files[0];

View File

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
@ -121,8 +122,8 @@ namespace winPEAS.KnownFileCreds.Browsers
}
string userFolder = string.Format("{0}\\Users\\", Environment.GetEnvironmentVariable("SystemDrive"));
string[] dirs = Directory.GetDirectories(userFolder);
foreach (string dir in dirs)
var dirs = Directory.EnumerateDirectories(userFolder);
foreach (var dir in dirs)
{
string[] parts = dir.Split('\\');
string userName = parts[parts.Length - 1];
@ -132,7 +133,7 @@ namespace winPEAS.KnownFileCreds.Browsers
if (Directory.Exists(userIEBookmarkPath))
{
string[] bookmarkPaths = Directory.GetFiles(userIEBookmarkPath, "*.url", SearchOption.AllDirectories);
string[] bookmarkPaths = Directory.EnumerateFiles(userIEBookmarkPath, "*.url", SearchOption.AllDirectories).ToArray();
if (bookmarkPaths.Length != 0)
{
foreach (string bookmarkPath in bookmarkPaths)
@ -180,7 +181,7 @@ namespace winPEAS.KnownFileCreds.Browsers
string userIEBookmarkPath = string.Format("{0}\\Favorites\\", System.Environment.GetEnvironmentVariable("USERPROFILE"));
string[] bookmarkPaths = Directory.GetFiles(userIEBookmarkPath, "*.url", SearchOption.AllDirectories);
string[] bookmarkPaths = Directory.EnumerateFiles(userIEBookmarkPath, "*.url", SearchOption.AllDirectories).ToArray();
foreach (string bookmarkPath in bookmarkPaths)
{

View File

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
@ -44,7 +45,7 @@ namespace winPEAS.KnownFileCreds
if (MyUtils.IsHighIntegrity())
{
string userFolder = string.Format("{0}\\Users\\", Environment.GetEnvironmentVariable("SystemDrive"));
string[] dirs = Directory.GetDirectories(userFolder);
var dirs = Directory.EnumerateDirectories(userFolder);
foreach (string dir in dirs)
{
string[] parts = dir.Split('\\');
@ -250,7 +251,7 @@ namespace winPEAS.KnownFileCreds
if (MyUtils.IsHighIntegrity())
{
string userFolder = string.Format("{0}\\Users\\", Environment.GetEnvironmentVariable("SystemDrive"));
string[] dirs = Directory.GetDirectories(userFolder);
var dirs = Directory.EnumerateDirectories(userFolder);
foreach (string dir in dirs)
{
string[] parts = dir.Split('\\');
@ -261,7 +262,7 @@ namespace winPEAS.KnownFileCreds
string recentPath = string.Format("{0}\\AppData\\Roaming\\Microsoft\\Windows\\Recent\\", dir);
try
{
string[] recentFiles = Directory.GetFiles(recentPath, "*.lnk", SearchOption.AllDirectories);
string[] recentFiles = Directory.EnumerateFiles(recentPath, "*.lnk", SearchOption.AllDirectories).ToArray();
if (recentFiles.Length != 0)
{
@ -298,7 +299,7 @@ namespace winPEAS.KnownFileCreds
{
string recentPath = string.Format("{0}\\Microsoft\\Windows\\Recent\\", System.Environment.GetEnvironmentVariable("APPDATA"));
string[] recentFiles = Directory.GetFiles(recentPath, "*.lnk", SearchOption.AllDirectories);
var recentFiles = Directory.EnumerateFiles(recentPath, "*.lnk", SearchOption.AllDirectories);
foreach (string recentFile in recentFiles)
{
@ -346,7 +347,7 @@ namespace winPEAS.KnownFileCreds
if (MyUtils.IsHighIntegrity())
{
string userFolder = string.Format("{0}\\Users\\", Environment.GetEnvironmentVariable("SystemDrive"));
string[] dirs = Directory.GetDirectories(userFolder);
var dirs = Directory.EnumerateDirectories(userFolder);
foreach (string dir in dirs)
{
string[] parts = dir.Split('\\');
@ -361,10 +362,10 @@ namespace winPEAS.KnownFileCreds
{
if (System.IO.Directory.Exists(userDPAPIBasePath))
{
string[] directories = Directory.GetDirectories(userDPAPIBasePath);
var directories = Directory.EnumerateDirectories(userDPAPIBasePath);
foreach (string directory in directories)
{
string[] files = Directory.GetFiles(directory);
var files = Directory.EnumerateFiles(directory);
foreach (string file in files)
{
@ -374,11 +375,11 @@ namespace winPEAS.KnownFileCreds
DateTime lastModified = System.IO.File.GetLastWriteTime(file);
string fileName = System.IO.Path.GetFileName(file);
results.Add(new Dictionary<string, string>()
{
{ "MasterKey", file },
{ "Accessed", string.Format("{0}", lastAccessed) },
{ "Modified", string.Format("{0}", lastModified) },
});
{
{ "MasterKey", file },
{ "Accessed", string.Format("{0}", lastAccessed) },
{ "Modified", string.Format("{0}", lastModified) },
});
}
}
}
@ -398,10 +399,10 @@ namespace winPEAS.KnownFileCreds
{
if (System.IO.Directory.Exists(userDPAPIBasePath))
{
string[] directories = Directory.GetDirectories(userDPAPIBasePath);
var directories = Directory.EnumerateDirectories(userDPAPIBasePath);
foreach (string directory in directories)
{
string[] files = Directory.GetFiles(directory);
var files = Directory.EnumerateFiles(directory);
foreach (string file in files)
{
@ -439,7 +440,7 @@ namespace winPEAS.KnownFileCreds
if (MyUtils.IsHighIntegrity())
{
string userFolder = string.Format("{0}\\Users\\", Environment.GetEnvironmentVariable("SystemDrive"));
string[] dirs = Directory.GetDirectories(userFolder);
var dirs = Directory.EnumerateDirectories(userFolder);
foreach (string dir in dirs)
{
@ -455,8 +456,8 @@ namespace winPEAS.KnownFileCreds
{
if (System.IO.Directory.Exists(userCredFilePath))
{
string[] systemFiles = Directory.GetFiles(userCredFilePath);
if ((systemFiles != null) && (systemFiles.Length != 0))
var systemFiles = Directory.EnumerateFiles(userCredFilePath);
if ((systemFiles != null))
{
foreach (string file in systemFiles)
{
@ -481,14 +482,14 @@ namespace winPEAS.KnownFileCreds
string desc = Encoding.Unicode.GetString(descBytes);
results.Add(new Dictionary<string, string>()
{
{ "CredFile", file },
{ "Description", desc },
{ "MasterKey", string.Format("{0}", guidMasterKey) },
{ "Accessed", string.Format("{0}", lastAccessed) },
{ "Modified", string.Format("{0}", lastModified) },
{ "Size", string.Format("{0}", size) },
});
{
{ "CredFile", file },
{ "Description", desc },
{ "MasterKey", string.Format("{0}", guidMasterKey) },
{ "Accessed", string.Format("{0}", lastAccessed) },
{ "Modified", string.Format("{0}", lastModified) },
{ "Size", string.Format("{0}", size) },
});
}
}
}
@ -497,8 +498,8 @@ namespace winPEAS.KnownFileCreds
}
string systemFolder = string.Format("{0}\\System32\\config\\systemprofile\\AppData\\Local\\Microsoft\\Credentials", Environment.GetEnvironmentVariable("SystemRoot"));
string[] files = Directory.GetFiles(systemFolder);
if ((files != null) && (files.Length != 0))
var files = Directory.EnumerateFiles(systemFolder);
if ((files != null))
{
foreach (string file in files)
{
@ -543,9 +544,9 @@ namespace winPEAS.KnownFileCreds
foreach (string userCredFilePath in userCredFilePaths)
{
if (System.IO.Directory.Exists(userCredFilePath))
if (Directory.Exists(userCredFilePath))
{
string[] files = Directory.GetFiles(userCredFilePath);
var files = Directory.EnumerateFiles(userCredFilePath);
foreach (string file in files)
{

View File

@ -67,7 +67,7 @@ namespace winPEAS.KnownFileCreds
if (MyUtils.IsHighIntegrity())
{
string userFolder = string.Format("{0}\\Users\\", Environment.GetEnvironmentVariable("SystemDrive"));
string[] dirs = Directory.GetDirectories(userFolder);
var dirs = Directory.EnumerateDirectories(userFolder);
foreach (string dir in dirs)
{

View File

@ -24,7 +24,7 @@ namespace winPEAS.KnownFileCreds.SuperPutty
try
{
var path = $"{dir}\\Documents\\SuperPuTTY\\";
var files = Directory.GetFiles(path, filter, SearchOption.TopDirectoryOnly);
var files = Directory.EnumerateFiles(path, filter, SearchOption.TopDirectoryOnly);
foreach (var file in files)
{