前言:
现在我们对“python ldap3中文文档”都比较关注,看官们都需要了解一些“python ldap3中文文档”的相关文章。那么小编同时在网络上汇集了一些有关“python ldap3中文文档””的相关知识,希望大家能喜欢,各位老铁们快快来学习一下吧!很多公司都在使用AD域来管理用户及组织架构,我们可以使用Python来进行自动化运维。网上很多资料不全而且都很古老,特地根据最近的代码编写经历,编写了如下通过python查询AD域信息方法总结:
环境:
OS: WindowsPython Version: 3.10.2使用的库:ldap3 - 2.9.1
原理汇总:
通过LDAP协议来连接及访问AD域服务,可以把AD域理解成某种类型数据库,我们通过AD账号和密码来访问其中存储数据库字段信息。为了更好地了解其中字段及含义,建议下载一个ADExplorer.exe绿色工具软件,直接去微软官网下载免费的绿色软件,以下是下载链接(查看左边的菜单Networking Utilities中包含的Active Directory Explorer):
通过这个软件,我们可以很方便地查看各种字段信息,为后面的连接获取足够的前提信息。
#建立和关闭域连接
#域连接:from ldap3 import Server, Connection,SUBTREE #导入所需用到的ldap3库import getpass #安全输入密码使用#定义变量ldap_url='xxx.com' #域控的dns名称uid='your AD Account' #查询所用的域账号pwd=getpass.getpass('Input your password: ') #输入所用的域密码,为了安全,避免保存#定义连接函数def ad_conn(): try: global conn #定义连接公共变量 m_tmp=[] #处理group member临时数组 server = Server(ldap_url, use_ssl=False, get_info='ALL') conn = Connection(server, auto_bind=True, user=uid,password=pwd,authentication='SIMPLE') except Exception as e: print(e) print('连接AD错误!') exit#关闭连接,为节约资源,显式关闭连接def ad_unbind(): conn.unbind()
以上代码把连接和关闭连接分开,是为了避免在一个程序中需要频繁调用连接时,避免经常关闭,可以节省大量的资源和时间,可以在程序开头建立连接,在程序退出时才关闭即可
#模糊查询组信息
#模糊查询组成员,定义好查询范围,可以查找符合规则的组成员base_dn='dc=ad,dc=xxx,dc=com' #根据实际的域信息更改,此为查找范围def adgroup_s(gname): #gname为要模糊查询的组名称,可以为组名称其中的一部分 condition=f'(&(objectclass=group)(cn=*{gname}*))' #查找条件,注意两个查找条件是and关系 att_list=['name','member'] #为需要查询到的信息字段名称,需根据之前介绍的软件来查看 res=conn.search( base_dn,search_scope=SUBTREE, search_filter=condition, attributes=att_list) # #查找无记录 if not res: print(f'未找到{gname}的相关信息') ad_unbind() for ent in conn.entries: #通配符查询时,需用entries,以下取值可以根据自己所需实际情况来编写 n_tmp=json.loads(ent.entry_to_json())['attributes']['name'] m_tmp=[x.split(',')[0] for x in json.loads(ent.entry_to_json())['attributes']['member']] for m in m_tmp: members.append([n_tmp[0],m.split('=')[1]]) return members
备注:查询条件规则参考如下:
(
&
(objectclass=group) #第一个条件
(cn=*{gname}*) #第二个条件
)
具体的规则可参考微软官方文档:
#模糊查询域中的workstation信息
#adou,如ou=workstations,ou=xxxx,ou=xxxxbase_dn='dc=ad,dc=xxx,dc=com' #定义查找范围def adou_computers(adou): computers_t=[] base_dn=','.join([adou,baseDN]) #查找范围 print(base_dn) condition=f'(objectclass=computer)' att_list=['name','whenchanged'] #为需要查询到的信息字段名称,需根据之前介绍的软件来查看 res=conn.search( base_dn,search_scope=SUBTREE, search_filter=condition, attributes=att_list) #如果查找无记录 if not res: print(f'未找到') ad_unbind() for r in conn.response: computers_t.append([','.join([r['dn'].split(',')[1],r['dn'].split(',')[2]]),r['attributes']['name'],datetime.strftime(r['attributes']['whenchanged'],'%Y/%m/%d')]) return computers_t
查询到所需信息以后,还可以直接调用pandas,保存为excel文件
标签: #python ldap3中文文档