def get_containers_list():
"""Получить список контейнеров на токене с правильным парсингом имен с пробелами"""
try:
# Запускаем csptest с нужными параметрами
result = subprocess.run([
CSPTEST, "-keyset", "-enum_cont", "-fqcn", "-verifyc"
], capture_output=True, text=True)
containers = []
# Разбиваем вывод на строки
for line in result.stdout.split('\n'):
line = line.strip()
# Пропускаем пустые строки
if not line:
continue
# Пропускаем служебные строки csptest
if line.startswith("CSP Version"):
continue
if line.startswith("---"):
continue
if line.startswith("Acquire context"):
continue
if line.startswith("Get CryptoProvInfo"):
continue
if "CSP CryptAcquireContext" in line:
continue
if "Error:" in line:
continue
# Строка с именем контейнера обычно НЕ начинается с ключевых слов выше
# и содержит символы \\.\ для полного имени
# Имя может содержать пробелы, поэтому берем всю строку целиком
# Вариант 1: Полное имя контейнера с префиксом \\.\
if line.startswith('\\\\.\\'):
containers.append(line)
# Вариант 2: Если контейнер без префикса (маловероятно с -fqcn, но на всякий случай)
elif not any(skip in line for skip in ["not found", "Error", "Failed"]):
# Проверяем, что это похоже на имя контейнера (содержит хотя бы один обратный слеш)
if '\\' in line or '_' in line or line.isalnum():
containers.append(line)
# Удаляем дубликаты (могут появиться из-за разных форматов вывода)
containers = list(dict.fromkeys(containers))
return containers
except Exception as e:
show_error(f"Не удалось получить список контейнеров:\n{e}")
return []