доработал
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Diagnostics;
|
||||
|
||||
class FileSearchProgram
|
||||
{
|
||||
@@ -12,9 +13,11 @@ class FileSearchProgram
|
||||
Console.WriteLine("Программа поиска и удаления папки программы на доменных компьютерах");
|
||||
LogToFile("Программа поиска и удаления папки программы на доменных компьютерах");
|
||||
|
||||
string fileName = "DowntimeClassifier.exe";
|
||||
string folderToDelete = "";
|
||||
string searchPath = "D:\\lrpo\\downtimeclassifier";
|
||||
string targetFileName = "DowntimeClassifier.exe";
|
||||
string targetProcessName = Path.GetFileNameWithoutExtension(targetFileName);
|
||||
string targetFolderPath = "D:\\lrpo\\DowntimeClassifier";
|
||||
string targetFolderName = Path.GetFileName(targetFolderPath.TrimEnd('\\'));
|
||||
string parentFolderPath = Path.GetDirectoryName(targetFolderPath.TrimEnd('\\'))!;
|
||||
string computersFile = "computers.txt";
|
||||
|
||||
try
|
||||
@@ -53,48 +56,72 @@ class FileSearchProgram
|
||||
Console.WriteLine($"\n{checkingMsg}");
|
||||
LogToFile(checkingMsg);
|
||||
|
||||
string uncPath = $"\\\\{computer}\\{searchPath.Replace(":", "$")}";
|
||||
string uncFolderPath = $"\\\\{computer}\\{targetFolderPath.Replace(":", "$")}";
|
||||
string uncParentPath = $"\\\\{computer}\\{parentFolderPath!.Replace(":", "$")}";
|
||||
|
||||
if (!Directory.Exists(uncPath))
|
||||
{
|
||||
string pathError = $"Путь {uncPath} недоступен на компьютере {computer}";
|
||||
Console.WriteLine(pathError);
|
||||
LogToFile(pathError);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Режим 1 или 3: поиск файла
|
||||
// Режим 1 или 3: поиск файла внутри папки
|
||||
if (mode == "1" || mode == "3")
|
||||
{
|
||||
bool fileFound = SearchFiles(uncPath, fileName);
|
||||
if (!Directory.Exists(uncFolderPath))
|
||||
{
|
||||
string pathError = $"Путь {uncFolderPath} недоступен на компьютере {computer}";
|
||||
Console.WriteLine(pathError);
|
||||
LogToFile(pathError);
|
||||
}
|
||||
else
|
||||
{
|
||||
bool fileFound = SearchFiles(uncFolderPath, targetFileName);
|
||||
|
||||
if (!fileFound)
|
||||
{
|
||||
string notFoundMsg = $"Файл {fileName} не найден на компьютере {computer}";
|
||||
string notFoundMsg = $"Файл \"{targetFileName}\" не найден на компьютере {computer}";
|
||||
Console.WriteLine(notFoundMsg);
|
||||
LogToFile(notFoundMsg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Режим 2 или 3: удаление папки
|
||||
if (mode == "2" || mode == "3")
|
||||
{
|
||||
DeleteFolder(uncPath, folderToDelete, computer);
|
||||
if (!Directory.Exists(uncParentPath))
|
||||
{
|
||||
string pathError = $"Родительский путь {uncParentPath} недоступен на компьютере {computer}";
|
||||
Console.WriteLine(pathError);
|
||||
LogToFile(pathError);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Сначала убиваем все процессы, которые могут блокировать файлы
|
||||
KillProcessesInFolderOnComputer(computer, uncParentPath, targetFolderName);
|
||||
|
||||
// Затем удаляем папку
|
||||
DeleteFolderOnComputer(uncParentPath, targetFolderName, computer);
|
||||
}
|
||||
}
|
||||
|
||||
// Режим 4: поиск папки
|
||||
if (mode == "4")
|
||||
{
|
||||
bool folderFound = SearchFolder(uncPath, folderToDelete);
|
||||
if (!Directory.Exists(uncParentPath))
|
||||
{
|
||||
string pathError = $"Родительский путь {uncParentPath} недоступен на компьютере {computer}";
|
||||
Console.WriteLine(pathError);
|
||||
LogToFile(pathError);
|
||||
}
|
||||
else
|
||||
{
|
||||
bool folderFound = SearchFolder(uncParentPath, targetFolderName);
|
||||
|
||||
if (!folderFound)
|
||||
{
|
||||
string notFoundMsg = $"Папка \"{folderToDelete}\" не найдена на компьютере {computer}";
|
||||
string notFoundMsg = $"Папка \"{targetFolderName}\" не найдена на компьютере {computer}";
|
||||
Console.WriteLine(notFoundMsg);
|
||||
LogToFile(notFoundMsg);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
string unavailable = $"Компьютер {computer} недоступен";
|
||||
@@ -136,6 +163,121 @@ class FileSearchProgram
|
||||
}
|
||||
}
|
||||
|
||||
static void KillProcessesInFolderOnComputer(string computerName, string parentUncPath, string folderName)
|
||||
{
|
||||
try
|
||||
{
|
||||
string fullFolderPath = Path.Combine(parentUncPath, folderName);
|
||||
|
||||
if (!Directory.Exists(fullFolderPath))
|
||||
{
|
||||
Console.WriteLine($"Папка {fullFolderPath} не найдена на компьютере {computerName}, пропускаем убийство процессов");
|
||||
LogToFile($"Папка {fullFolderPath} не найдена на компьютере {computerName}, пропускаем убийство процессов");
|
||||
return;
|
||||
}
|
||||
|
||||
// Рекурсивно собираем все exe-файлы в папке
|
||||
List<string> exeFiles = new List<string>();
|
||||
CollectExeFiles(fullFolderPath, exeFiles);
|
||||
|
||||
if (exeFiles.Count == 0)
|
||||
{
|
||||
Console.WriteLine($"Не найдено exe-файлов в папке {fullFolderPath} на компьютере {computerName}");
|
||||
LogToFile($"Не найдено exe-файлов в папке {fullFolderPath} на компьютере {computerName}");
|
||||
return;
|
||||
}
|
||||
|
||||
// Убиваем каждый уникальный процесс
|
||||
HashSet<string> killedProcesses = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
|
||||
foreach (string exePath in exeFiles)
|
||||
{
|
||||
string processName = Path.GetFileNameWithoutExtension(exePath);
|
||||
if (killedProcesses.Add(processName))
|
||||
{
|
||||
KillSingleProcessOnComputer(computerName, processName);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
string killError = $"Ошибка при убийстве процессов в папке {folderName} на {computerName}: {ex.Message}";
|
||||
Console.WriteLine(killError);
|
||||
LogToFile(killError);
|
||||
}
|
||||
}
|
||||
|
||||
static void CollectExeFiles(string path, List<string> exeFiles)
|
||||
{
|
||||
try
|
||||
{
|
||||
foreach (string file in Directory.GetFiles(path, "*.exe"))
|
||||
{
|
||||
exeFiles.Add(file);
|
||||
}
|
||||
|
||||
foreach (string dir in Directory.GetDirectories(path))
|
||||
{
|
||||
CollectExeFiles(dir, exeFiles);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
// Если нет доступа к какой-то папке — пропускаем
|
||||
}
|
||||
}
|
||||
|
||||
static void KillSingleProcessOnComputer(string computerName, string processName)
|
||||
{
|
||||
try
|
||||
{
|
||||
Console.WriteLine($"Завершаем процесс \"{processName}\" на компьютере {computerName}...");
|
||||
LogToFile($"Завершаем процесс \"{processName}\" на компьютере {computerName}...");
|
||||
|
||||
ProcessStartInfo psi = new ProcessStartInfo
|
||||
{
|
||||
FileName = "taskkill",
|
||||
Arguments = $"/S {computerName} /IM {processName}.exe /F",
|
||||
RedirectStandardOutput = true,
|
||||
RedirectStandardError = true,
|
||||
UseShellExecute = false,
|
||||
CreateNoWindow = true
|
||||
};
|
||||
|
||||
using (Process process = Process.Start(psi)!)
|
||||
{
|
||||
string output = process.StandardOutput.ReadToEnd();
|
||||
string error = process.StandardError.ReadToEnd();
|
||||
process.WaitForExit(10000);
|
||||
|
||||
if (process.ExitCode == 0)
|
||||
{
|
||||
string successKill = $"Процесс \"{processName}\" успешно завершён на компьютере {computerName}";
|
||||
Console.WriteLine(successKill);
|
||||
LogToFile(successKill);
|
||||
}
|
||||
else if (error.Contains("not found", StringComparison.OrdinalIgnoreCase) ||
|
||||
error.Contains("does not exist", StringComparison.OrdinalIgnoreCase) ||
|
||||
error.Contains("not running", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
Console.WriteLine($"Процесс \"{processName}\" не запущен на компьютере {computerName}");
|
||||
LogToFile($"Процесс \"{processName}\" не запущен на компьютере {computerName}");
|
||||
}
|
||||
else
|
||||
{
|
||||
string warnKill = $"Не удалось завершить процесс \"{processName}\" на {computerName}. Ошибка: {error.Trim()}";
|
||||
Console.WriteLine(warnKill);
|
||||
LogToFile(warnKill);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
string killError = $"Ошибка при попытке завершить процесс \"{processName}\" на {computerName}: {ex.Message}";
|
||||
Console.WriteLine(killError);
|
||||
LogToFile(killError);
|
||||
}
|
||||
}
|
||||
|
||||
static bool SearchFiles(string path, string fileName)
|
||||
{
|
||||
try
|
||||
@@ -204,7 +346,7 @@ class FileSearchProgram
|
||||
}
|
||||
}
|
||||
|
||||
static void DeleteFolder(string basePath, string folderName, string computerName)
|
||||
static void DeleteFolderOnComputer(string basePath, string folderName, string computerName)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user