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
相关产品推荐
相关产品推荐

