import os import csv import time import pathlib from datetime import datetime # Пути для поиска файлов SEARCH_DIRS = ["Desktop", "Downloads", "Documents"] EXTENSIONS = (".mov", ".avi", ".mp3", ".mp4", ".mkv", ".wav", ".flac") # Файлы с хостами и результатами HOSTS_FILE = "hosts.txt" OUTPUT_CSV = "found_files.csv" FAILED_CSV = "failed_hosts.csv" # Системные папки, которые не нужно сканировать EXCLUDE_FOLDERS = {"Administrator", "DefaultAccount", "Public", "All Users", "Default", "WDAGUtilityAccount"} # Список недоступных ПК failed_hosts = [] def format_size(size_bytes): """ Форматирование размера файла в MB/GB """ if size_bytes >= 1_073_741_824: return f"{size_bytes / 1_073_741_824:.2f} GB" elif size_bytes >= 1_048_576: return f"{size_bytes / 1_048_576:.2f} MB" return f"{size_bytes} bytes" def get_users_from_folders(host): """ Получает список пользователей, проверяя папки в \\host\c$\Users """ users_path = f"\\\\{host}\\c$\\Users" try: if not os.path.exists(users_path): print(f"[Ошибка] ПК {host} недоступен!") failed_hosts.append(host) return [] users = [u for u in os.listdir(users_path) if u not in EXCLUDE_FOLDERS] print(f"[{host}] Найдено {len(users)} пользователей: {users}") return users except Exception as e: print(f"[Ошибка] Не удалось получить пользователей с {host}: {e}") failed_hosts.append(host) return [] def get_file_info(file_path): """ Получает информацию о файле """ try: file_stat = os.stat(file_path) return { "size_bytes": file_stat.st_size, "size_formatted": format_size(file_stat.st_size), "created": datetime.fromtimestamp(file_stat.st_ctime).strftime("%Y-%m-%d %H:%M:%S"), "last_accessed": datetime.fromtimestamp(file_stat.st_atime).strftime("%Y-%m-%d %H:%M:%S"), } except Exception as e: print(f"[Ошибка] Не удалось получить данные о файле {file_path}: {e}") return None def wait_for_folder_access(path, timeout=10): """ Открывает проводник для доступа к скрытым файлам и ждет индексации """ try: print(f"[Открытие проводника] {path}") os.startfile(path) time.sleep(3) start_time = time.time() while time.time() - start_time < timeout: if os.path.exists(path) and os.listdir(path): print(f"[Готово] Папка доступна: {path}") return True print(f"[Ожидание] Файлы еще не загружены... ({int(time.time() - start_time)}/{timeout} сек)") time.sleep(2) print(f"[Ошибка] Не удалось получить доступ к {path}") return False except Exception as e: print(f"[Ошибка] Не удалось открыть {path}: {e}") return False def scan_host(host): """ Сканирует ПК и находит файлы с нужными расширениями """ results = [] users = get_users_from_folders(host) if not users: return results for user in users: base_path = f"\\\\{host}\\c$\\Users\\{user}" if not os.path.exists(base_path): print(f"[Пропуск] Папка {base_path} не найдена") continue if not wait_for_folder_access(base_path): continue for folder in SEARCH_DIRS: search_path = os.path.join(base_path, folder) if not os.path.exists(search_path): print(f"[Пропуск] Нет папки {search_path}") continue print(f"[Поиск] {search_path}") for root, _, files in os.walk(search_path): for file in files: if file.lower().endswith(EXTENSIONS): file_path = os.path.join(root, file) file_info = get_file_info(file_path) if file_info: results.append([ host, user, pathlib.Path(file).suffix, file_info["size_bytes"], file_info["size_formatted"], file_info["created"], file_info["last_accessed"], file_path ]) print(f"[Найден файл] {file_path} ({file_info['size_formatted']})") return results def main(): with open(HOSTS_FILE, "r") as f: hosts = [line.strip() for line in f.readlines() if line.strip()] all_results = [] for host in hosts: print(f"\n🔍 [Сканирование] ПК: {host}") results = scan_host(host) all_results.extend(results) # Сохранение найденных файлов в CSV with open(OUTPUT_CSV, "w", newline="", encoding="utf-8") as csv_file: writer = csv.writer(csv_file) writer.writerow(["PC Name", "User", "File Type", "Size (bytes)", "Size (Formatted)", "Created Date", "Last Accessed", "File Path"]) writer.writerows(all_results) print(f"\n✅ Поиск завершен! Результаты сохранены в {OUTPUT_CSV}") # Сохранение списка недоступных ПК if failed_hosts: with open(FAILED_CSV, "w", newline="", encoding="utf-8") as csv_file: writer = csv.writer(csv_file) writer.writerow(["PC Name"]) writer.writerows([[host] for host in failed_hosts]) print("\n❌ [Ошибка] Не удалось подключиться к следующим ПК:") for host in failed_hosts: print(f" - {host}") print(f"📄 Список недоступных ПК сохранен в {FAILED_CSV}") if __name__ == "__main__": main()