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()