如何通过Python win32调用Windows LDAP批量查询域用户邮箱
批量查询域用户信息的Python实现
方案一:用ctypes调用Windows原生TranslateName API
由于pywin32的win32api未封装TranslateName函数,我们可以直接用ctypes调用Windows系统的secur32.dll实现用户名转换,自动使用当前域登录身份认证:
import ctypes from ctypes import wintypes # 定义用户名格式常量 NameSamCompatible = 2 # 输入格式:域\用户名 或 纯用户名 NameUserPrincipal = 8 # 输出格式:用户邮箱(UPN) NameDisplay = 3 # 输出格式:用户全名 # 加载系统库 secur32 = ctypes.WinDLL('secur32.dll') # 定义函数参数与返回值类型 secur32.TranslateNameW.argtypes = [ wintypes.LPCWSTR, wintypes.DWORD, wintypes.DWORD, wintypes.LPWSTR, wintypes.LPDWORD ] secur32.TranslateNameW.restype = wintypes.BOOL def translate_user(username, output_format=NameUserPrincipal): # 先获取所需缓冲区大小 buf_size = wintypes.DWORD(0) secur32.TranslateNameW(username, NameSamCompatible, output_format, None, ctypes.byref(buf_size)) # 分配缓冲区并调用函数 buffer = ctypes.create_unicode_buffer(buf_size.value) success = secur32.TranslateNameW(username, NameSamCompatible, output_format, buffer, ctypes.byref(buf_size)) if not success: raise ctypes.WinError() return buffer.value # 示例:查询用户邮箱和全名 print(translate_user("auser001")) # 返回邮箱格式的UPN print(translate_user("auser001", NameDisplay)) # 返回用户全名
方案二:用pyad库(简洁高效)
pyad是专为Windows AD设计的Python库,自动使用当前域身份认证,无需手动配置LDAP信息。先安装依赖:
pip install pyad
批量查询代码示例:
from pyad import aduser def get_user_details(username): try: # 通过用户名获取AD用户对象 user = aduser.ADUser.from_cn(username) return { "全名": user.get_attribute("displayName")[0], "邮箱": user.get_attribute("mail")[0], "用户名": user.get_attribute("sAMAccountName")[0], "用户主体名": user.get_attribute("userPrincipalName")[0] } except Exception as e: return f"查询失败: {str(e)}" # 批量查询示例 user_list = ["auser001", "auser002", "auser003"] for user in user_list: print(f"=== {user} 信息 ===") print(get_user_details(user))
方案三:用pywin32的win32net模块
无需第三方库,直接用pywin32的win32net查询域用户信息,自动使用当前域身份:
import win32api import win32net def query_domain_user(username): domain_name = win32api.GetDomainName() try: # 级别2包含邮箱、全名等详细信息 user_info = win32net.NetUserGetInfo(domain_name, username, 2) return { "全名": user_info.get("full_name"), "邮箱": user_info.get("email_address"), "用户名": user_info.get("name"), "描述": user_info.get("comment") } except win32net.error as e: return f"查询失败: {str(e)}" # 示例 print(query_domain_user("auser001"))
内容的提问来源于stack exchange,提问作者strongbad03
相关产品推荐
相关产品推荐

