доработал
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
using System.Net.NetworkInformation;
|
using System.Net.NetworkInformation;
|
||||||
|
using System.Diagnostics;
|
||||||
|
|
||||||
class FileSearchProgram
|
class FileSearchProgram
|
||||||
{
|
{
|
||||||
@@ -12,9 +13,11 @@ class FileSearchProgram
|
|||||||
Console.WriteLine("Программа поиска и удаления папки программы на доменных компьютерах");
|
Console.WriteLine("Программа поиска и удаления папки программы на доменных компьютерах");
|
||||||
LogToFile("Программа поиска и удаления папки программы на доменных компьютерах");
|
LogToFile("Программа поиска и удаления папки программы на доменных компьютерах");
|
||||||
|
|
||||||
string fileName = "DowntimeClassifier.exe";
|
string targetFileName = "DowntimeClassifier.exe";
|
||||||
string folderToDelete = "";
|
string targetProcessName = Path.GetFileNameWithoutExtension(targetFileName);
|
||||||
string searchPath = "D:\\lrpo\\downtimeclassifier";
|
string targetFolderPath = "D:\\lrpo\\DowntimeClassifier";
|
||||||
|
string targetFolderName = Path.GetFileName(targetFolderPath.TrimEnd('\\'));
|
||||||
|
string parentFolderPath = Path.GetDirectoryName(targetFolderPath.TrimEnd('\\'))!;
|
||||||
string computersFile = "computers.txt";
|
string computersFile = "computers.txt";
|
||||||
|
|
||||||
try
|
try
|
||||||
@@ -53,48 +56,72 @@ class FileSearchProgram
|
|||||||
Console.WriteLine($"\n{checkingMsg}");
|
Console.WriteLine($"\n{checkingMsg}");
|
||||||
LogToFile(checkingMsg);
|
LogToFile(checkingMsg);
|
||||||
|
|
||||||
string uncPath = $"\\\\{computer}\\{searchPath.Replace(":", "$")}";
|
string uncFolderPath = $"\\\\{computer}\\{targetFolderPath.Replace(":", "$")}";
|
||||||
|
string uncParentPath = $"\\\\{computer}\\{parentFolderPath!.Replace(":", "$")}";
|
||||||
|
|
||||||
if (!Directory.Exists(uncPath))
|
// Режим 1 или 3: поиск файла внутри папки
|
||||||
{
|
|
||||||
string pathError = $"Путь {uncPath} недоступен на компьютере {computer}";
|
|
||||||
Console.WriteLine(pathError);
|
|
||||||
LogToFile(pathError);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Режим 1 или 3: поиск файла
|
|
||||||
if (mode == "1" || mode == "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)
|
if (!fileFound)
|
||||||
{
|
{
|
||||||
string notFoundMsg = $"Файл {fileName} не найден на компьютере {computer}";
|
string notFoundMsg = $"Файл \"{targetFileName}\" не найден на компьютере {computer}";
|
||||||
Console.WriteLine(notFoundMsg);
|
Console.WriteLine(notFoundMsg);
|
||||||
LogToFile(notFoundMsg);
|
LogToFile(notFoundMsg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Режим 2 или 3: удаление папки
|
// Режим 2 или 3: удаление папки
|
||||||
if (mode == "2" || mode == "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: поиск папки
|
// Режим 4: поиск папки
|
||||||
if (mode == "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)
|
if (!folderFound)
|
||||||
{
|
{
|
||||||
string notFoundMsg = $"Папка \"{folderToDelete}\" не найдена на компьютере {computer}";
|
string notFoundMsg = $"Папка \"{targetFolderName}\" не найдена на компьютере {computer}";
|
||||||
Console.WriteLine(notFoundMsg);
|
Console.WriteLine(notFoundMsg);
|
||||||
LogToFile(notFoundMsg);
|
LogToFile(notFoundMsg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
string unavailable = $"Компьютер {computer} недоступен";
|
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)
|
static bool SearchFiles(string path, string fileName)
|
||||||
{
|
{
|
||||||
try
|
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
|
try
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user