Неправильные учетные данные Диспетчера учетных записей Windows с помощью скрипта Python

Вопрос или проблема

Я пишу скрипт на Python, который должен получать учетные данные из Диспетчера учетных данных Windows для соединения. Для этого я использую pramiko, win32cred и traceback. Я встроил функцию проверки для этого. Каждый раз, когда я запускаю ее, она говорит мне, что учетные данные неверны. Если я выполняю установку USER=xxx и установку PASS=xxx в CMD, это работает без проблем, и я могу подключиться к серверу Debian. В чем может быть причина этого?

import paramiko
import win32cred
import traceback

# Функция для получения учетных данных из Диспетчера учетных данных Windows
def get_credentials(target_name):
    try:
        print(f"Пытаюсь получить учетные данные для {target_name}...")
        cred = win32cred.CredRead(target_name, win32cred.CRED_TYPE_GENERIC)
        username = cred['UserName']
        password = cred['CredentialBlob'].decode('utf-8')
        print(f"Имя пользователя: {username}, Пароль (скрыт)")
        return username, password
    except Exception as e:
        print(f"Ошибка при получении учетных данных: {e}")
        traceback.print_exc()
        return None, None

# Функция для тестирования соединения
def test_sftp_connection(hostname, port, username, password):
    try:
        client = paramiko.SSHClient()
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        client.connect(hostname, port=port, username=username, password=password)
        sftp = client.open_sftp()
        print("SFTP-соединение успешно!")
        print(sftp.listdir("."))  # Список каталога
        sftp.close()
        client.close()
    except paramiko.AuthenticationException:
        print("Ошибка аутентификации: неверное имя пользователя или пароль.")
    except paramiko.SSHException as ssh_error:
        print(f"Ошибка SSH: {ssh_error}")
    except Exception as e:
        print(f"Общая ошибка соединения: {e}")
        traceback.print_exc()

# Основная функция
def main():
    # Имя цели для Диспетчера учетных данных Windows
    target_name = "testserver:portssh"
    
    # Получение учетных данных
    username, password = get_credentials(target_name)
    
    if not username or not password:
        print("Не удалось получить учетные данные.")
        return
    
    # Тестирование SFTP-соединения
    test_sftp_connection('testserver', portssh (не 22), username, password)

if __name__ == "__main__":
    main()

Пользователь доступен только для функций SFTP и имеет назначенную оболочку /usr/sbin/nologin. Я также создал тестовый скрипт, чтобы проверить, правильны ли учетные данные, и это так.

Не хватает ли мне чего-то здесь или что я делаю не так?

Спасибо!

Ответ или решение

Судя по вашему коду и описанию проблемы, вы пытаетесь использовать Anmeldeinformationen (учетные данные) из Windows Credential Manager для подключения к серверу Debian по протоколу SFTP с помощью библиотеки Paramiko. Несмотря на то, что использование переменных окружения (set USER=xxx и set PASS=xxx) работает, подключение с использованием учетных данных из Credential Manager вызывает ошибку аутентификации.

Вот несколько возможных причин, почему ваши учетные данные могут считаться неверными, и решения для устранения этой проблемы:

Возможные причины и решения

  1. Неправильное имя целевого объекта:
    Проверьте, что target_name правильно соответствует тому, что вы указали в Windows Credential Manager. Убедитесь, что вы используете именно то имя, которое было установлено для учета и что оно правильно указано в коде:

    target_name = "testserver:portssh"  # Убедитесь, что это имя совпадает с тем, что в Credential Manager
  2. Кодировка пароля:
    Убедитесь, что пароль корректно декодируется. Если в пароле есть символы, которые могут быть неправильно интерпретированы, это может привести к проблемам. Попробуйте вывести декодированный пароль и проверить его в ручном режиме:

    password = cred['CredentialBlob'].decode('utf-8')
    print(f"Пароль: {password}")  # Временно, для отладки
  3. Правильный порт для подключения:
    Убедитесь, что установлен корректный порт для подключения. В вашем коде вы упомянули portssh (не 22), но не указали значение. Убедитесь, что этот порт доступен для подключения:

    test_sftp_connection('testserver', portssh, username, password)
  4. Неверные параметры подключения:
    Используйте библиотеку Paramiko в комбинации с правильными параметрами подключения. Вы также можете использовать print() для отладки, чтобы удостовериться, что все параметры действительно передаются правильно:

    print(f"Параметры подключения - Хост: {hostname}, Порт: {port}, Пользователь: {username}, Пароль: {password}")
  5. Права доступа:
    Убедитесь, что пользователь, которого вы пытаетесь использовать для подключения, имеет права доступа к SFTP и соответствующей директории на дебайсе. Проверьте настройки SSH и ограничения для этого пользователя.

  6. Ошибки в библиотеке Paramiko:
    Проверьте, что библиотека Paramiko установлена и настроена правильно на вашей системе. Попробуйте обновить библиотеку до последней версии:

    pip install --upgrade paramiko

Заключение

Если после выполнения всех этих шагов проблема не решится, рекомендуется создать минимальный тестовый скрипт (без использования Windows Credential Manager) с статическими учетными данными для исключения других факторов. Это поможет определить, связана ли проблема с Credential Manager или есть другие ошибки.

Постарайтесь использовать логирование для более облегченной отладки, и, если возможно, проверьте настройки безопасности на вашем сервере Debian. Если у вас есть дополнительные детали или ошибка, которую вы получаете, пожалуйста, поделитесь ими — это поможет более точно диагностировать проблему.

Оцените материал
Добавить комментарий

Капча загружается...