Загрузка данных


import tkinter as tk
from tkinter import ttk, messagebox
from ldap3 import Server, Connection, ALL, SUBTREE

# --- НАСТРОЙКИ (заполни один раз) ---
DC_HOST = "serdar.com"          # Адрес контроллера домена
SERVICE_USER = "serdar_user@serdar.com"  # Служебный пользователь (должен уметь читать пользователей)
SERVICE_PASS = "1qaz2wsx!"      # Пароль служебного пользователя
BASE_DN = "DC=serdar,DC=com"             # Корень поиска (можно узнать через PowerShell: Get-ADRootDSE)
# ------------------------------------

def check_credentials():
    username = entry_login.get().strip()
    password = entry_password.get()

    if not username or not password:
        messagebox.showwarning("Внимание", "Заполните логин и пароль!")
        return

    server = Server(DC_HOST, get_info=ALL)

    # Шаг 1: Подключаемся служебным аккаунтом и ищем пользователя по логину
    try:
        conn_svc = Connection(server, user=SERVICE_USER, password=SERVICE_PASS, auto_bind=True)
        
        # Ищем пользователя по sAMAccountName (логин)
        search_filter = f"(sAMAccountName={username})"
        conn_svc.search(search_base=BASE_DN, search_filter=search_filter, search_scope=SUBTREE, attributes=["distinguishedName"])

        if len(conn_svc.entries) == 0:
            conn_svc.unbind()
            messagebox.showerror("Ошибка", "Пользователь не найден в Active Directory.")
            return
        elif len(conn_svc.entries) > 1:
            # На всякий случай: если вдруг два пользователя с одинаковым логином (редкость)
            conn_svc.unbind()
            messagebox.showerror("Ошибка", "Найдено больше одного пользователя с таким логином. Проверьте данные.")
            return

        # Получаем DN найденного пользователя
        user_dn = conn_svc.entries[0].distinguishedName.value
        conn_svc.unbind()

        # Шаг 2: Пробуем сделать bind от имени найденного пользователя с введённым паролем
        conn_user = Connection(server, user=user_dn, password=password, auto_bind=True)

        if conn_user.bound:
            messagebox.showinfo("Успех", f"Аутентификация успешна!\nПользователь: {username}")
            conn_user.unbind()
        else:
            messagebox.showerror("Ошибка", "Неверный логин или пароль.")
            conn_user.unbind()

    except Exception as e:
        messagebox.showerror("Ошибка подключения", f"Не удалось подключиться к AD:\n{str(e)}")

# --- Интерфейс (Tkinter) ---
root = tk.Tk()
root.title("AD Login Check (автопоиск DN)")
root.geometry("350x220")

tk.Label(root, text="Логин (sAMAccountName)").pack(pady=5)
entry_login = tk.Entry(root, width=30)
entry_login.pack(pady=5)

tk.Label(root, text="Пароль").pack(pady=5)
entry_password = tk.Entry(root, width=30, show="*")
entry_password.pack(pady=5)

btn_check = ttk.Button(root, text="Проверить", command=check_credentials)
btn_check.pack(pady=20)

lbl_hint = tk.Label(
    root,
    text="Для работы нужен служебный аккаунт\nс правом чтения пользователей в AD.",
    fg="gray",
    font=("Arial", 8)
)
lbl_hint.pack(side="bottom", pady=10)

root.mainloop()