AD: поиск по нескольким OU (AD_BASES)
- config.py: AD_BASE -> AD_BASES (кортеж OU) - utils/ad_search.py: новая утилита для поиска по всем OU - utils/ad_checker.py: использовать ad_search - utils/otp_service.py: использовать ad_search - lk/handlers.py: использовать ad_search - transcription_bot/handlers.py: использовать ad_search - service_desk/handlers.py: использовать ad_search - instruct/handlers.py: использовать ad_search - photo_bot/ad_helper.py: использовать ad_search - photo_bot/check_ad_photo.py: использовать ad_search - check_ad_2fa.py: использовать ad_search - debug_ad_filter.py: обновить для AD_BASES - lk/test_lk_payslip.py: обновить для AD_BASES
This commit is contained in:
+16
-23
@@ -7,7 +7,8 @@ from PIL import Image
|
||||
|
||||
# Подтягиваем ваши настройки из конфига
|
||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
from config.config import AD_SERVER, AD_USER, AD_PASSWORD, AD_BASE
|
||||
from config.config import AD_SERVER, AD_USER, AD_PASSWORD
|
||||
from utils.ad_search import search_by_filter as ad_search_all_bases
|
||||
|
||||
logging.basicConfig(level=logging.INFO, format="%(message)s")
|
||||
|
||||
@@ -21,54 +22,46 @@ def check_user_photo(target_user: str):
|
||||
ldap_filter = f"(sAMAccountName={target_user})"
|
||||
|
||||
try:
|
||||
# Подключаемся к AD
|
||||
server = Server(AD_SERVER, get_info=ALL)
|
||||
conn = Connection(server, user=AD_USER, password=AD_PASSWORD, auto_bind=True)
|
||||
|
||||
# Ищем пользователя и просим вернуть атрибуты: имя (cn) и фото (thumbnailPhoto)
|
||||
conn.search(
|
||||
search_base=AD_BASE,
|
||||
search_filter=ldap_filter,
|
||||
attributes=["cn", "thumbnailPhoto"]
|
||||
)
|
||||
|
||||
if not conn.entries:
|
||||
# Подключаемся к AD и ищем по всем OU из AD_BASES
|
||||
entries = ad_search_all_bases(ldap_filter, ["cn", "thumbnailPhoto"])
|
||||
|
||||
if not entries:
|
||||
print("❌ Пользователь с такими данными не найден в AD.")
|
||||
return
|
||||
|
||||
user = conn.entries[0]
|
||||
|
||||
user = entries[0]
|
||||
user_name = user.cn.value if 'cn' in user else target_user
|
||||
print(f"👤 Найден сотрудник: {user_name}")
|
||||
|
||||
|
||||
# Проверяем, есть ли вообще фото
|
||||
if 'thumbnailPhoto' not in user or not user.thumbnailPhoto.value:
|
||||
print("⚠️ У этого пользователя НЕТ фотографии в Active Directory.")
|
||||
return
|
||||
|
||||
|
||||
# Достаем байты фотографии
|
||||
photo_bytes = user.thumbnailPhoto.value
|
||||
size_kb = len(photo_bytes) / 1024
|
||||
|
||||
|
||||
# Читаем картинку прямо из памяти (без сохранения на диск) с помощью Pillow
|
||||
image = Image.open(io.BytesIO(photo_bytes))
|
||||
width, height = image.size
|
||||
|
||||
|
||||
print("\n📊 --- ИНФОРМАЦИЯ О ФОТО В AD ---")
|
||||
print(f"📐 Разрешение : {width}x{height} пикселей")
|
||||
print(f"⚖️ Вес : {size_kb:.1f} KB")
|
||||
print(f"🗂 Формат : {image.format}")
|
||||
print("----------------------------------\n")
|
||||
|
||||
|
||||
# Бонус: сохраняем фото во временную папку, чтобы вы могли на него взглянуть
|
||||
safe_name = target_user.replace('@', '_').replace('.', '_')
|
||||
save_path = f"/tmp/{safe_name}_ad.jpg"
|
||||
|
||||
|
||||
with open(save_path, "wb") as f:
|
||||
f.write(photo_bytes)
|
||||
|
||||
|
||||
print(f"💾 Оригинал из AD сохранен сюда: {save_path}")
|
||||
print("Вы можете скачать его через WinSCP или открыть в TrueConf, чтобы оценить качество глазами.")
|
||||
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Ошибка при подключении к AD: {e}")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user