You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:45:46