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

AD用户查询结果格式化及CSV导出技术求助

问题描述

我想编写一款程序,读取Active Directory(AD)中的全部用户,根据办公地点、职位头衔(title)和职位代码将其分配至对应的AD组。目前我能通过部门编号查询AD用户,查询功能正常,但返回结果为如下大型列表格式:

[{'physicalDeliveryOfficeName': 'Denver, Colorado', 'title': 'Logistics Account Executive Trainee', 'cn': 'Jim Beam'}, {'physicalDeliveryOfficeName': 'Denver, Colorado', 'title': 'Logistics Account Executive', 'cn': 'Joseph Coots'}, ...]

我希望调整结果格式,使其更易读并能导出至CSV文件供后续使用。以下是我目前编写的代码:

from sqlite3 import Row
from unicodedata import name
from pyad import*
from pyad import adquery
import pyad.adquery
import re
import csv

UserName = "122"

q = pyad.adquery.ADQuery()

q.execute_query(
    attributes = ["cn","title", "physicalDeliveryOfficeName"],
    where_clause = f"departmentNumber = '{UserName}'",
    base_dn="OU=*** Users,OU=**,DC=***,DC=com"
)

result = list(q.get_results())
for list in result():
  namead = list["cn"]

name = namead.pop

# group = pd.Dataframe({'P1': [x['parameter1'] for x in result], 'P2':[x['parameter2'] for x in result], 'P3':[x['parameter3'] for x in result]}) #'P3':[x['parameter3'] for x in result]

# f= open(r'C:\Users\justin\Denver.csv', 'w+', newline='') 

# writer = csv.writer(f)

# writer.writerow(group)

print(name)
解决方案

1. 修正代码基础错误

现有代码存在语法和逻辑问题:

  • result已经是列表对象,无需加()调用,循环应改为for item in result:
  • namead.pop是方法调用,需加括号namead.pop(),且原逻辑仅保留最后一个用户的cn值,无实际意义

2. 生成可读输出格式

若要让查询结果更易读,可使用pprint模块格式化打印,或循环逐个输出用户信息:

from pprint import pprint

# 格式化打印完整结果
pprint(result)

# 逐个输出用户明细
for user in result:
    print(f"用户名: {user['cn']}")
    print(f"职位头衔: {user['title']}")
    print(f"办公地点: {user['physicalDeliveryOfficeName']}")
    print("-" * 30)

3. 导出结果至CSV文件

使用Python内置csv模块即可完成导出,无需额外依赖,示例代码如下:

import csv

# 方式1:使用DictWriter直接写入字典格式数据
with open(r'C:\Users\justin\Denver.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.DictWriter(f, fieldnames=["cn", "title", "physicalDeliveryOfficeName"])
    writer.writeheader()  # 写入表头
    writer.writerows(result)  # 批量写入所有用户数据

# 方式2:自定义表头,手动映射数据
with open(r'C:\Users\justin\Denver.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerow(["用户名", "职位头衔", "办公地点"])  # 自定义表头
    for user in result:
        writer.writerow([user['cn'], user['title'], user['physicalDeliveryOfficeName']])

4. 后续分组思路

要根据办公地点、头衔等维度分配AD组,可先对查询结果进行分组:

grouped_users = {}
for user in result:
    # 用「办公地点+职位头衔」作为分组键
    group_key = (user['physicalDeliveryOfficeName'], user['title'])
    if group_key not in grouped_users:
        grouped_users[group_key] = []
    grouped_users[group_key].append(user['cn'])

# 打印分组结果
for (office, title), users in grouped_users.items():
    print(f"办公地点: {office}, 职位: {title}")
    print(f"用户列表: {', '.join(users)}")
    print("-" * 50)

基于分组结果,可调用pyad的API将用户批量添加至对应AD组。

内容的提问来源于stack exchange,提问作者DaHawg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 04:15:09