我以前用过这个方法。现在,在平整和重建机器后,我似乎不能让pyad工作了。
我的脚本使用adquery来获取域的成员。
我已经安装了正确版本的pyad和pywin32。我使用的是Python 3.6。
我一直收到以下错误:
pywintypes.com_error:(-2147352567,‘发生异常。’,(0,'Active Directory',‘指定的域不存在或无法联系。\r\n’,None,0,-2147217865),None)
这个脚本之前运行的很好,所以我认为这是一个安装问题。
下面是我写的函数:
from pyad import adquery, aduser, adbase
def call_adquery(domain, debug):
global numRow
log.info('Domain: {}'.format(domain))
df = pd.DataFrame()
z_obj = adquery.ADQuery()
t = datetime.today().strftime('%m/%d/%Y')
i = 0
if domain == 'satyan':
wc = "mailNickname='satyan'"
domain = 'redmond'
else:
wc = """
objectClass='user'
and showInAddressBook='*'
and manager='*'
and not mailNickname='b-*'
"""
dn = base_dn = 'OU=UserAccounts,DC={0}, DC=corp,DC=microsoft,DC=com'.format(domain)
att = ['name', 'displayName', 'title', 'company', 'msExchHideFromAddressLists',
'manager', 'mail', 'mailNickname', 'distinguishedName', 'extensionAttribute4',
'extensionAttribute2','sn','cn','givenName', 'instanceType','userPrincipalName',
'objectCategory']
z_obj.execute_query(attributes=att, where_clause=wc, base_dn=dn, type='GC')
for row in z_obj.get_results():
i += 1
numRow += 1
n = pd.Series.from_array(row)
log.info("{0}, {1}, {2}, {3}".format(numRow, i, domain, row['name']))
n['domain'] = domain
n['date'] = t
df = df.append(n, ignore_index=True)
if (debug==True) and (i == 10): break
log.info('Count for {0}: {1}'.format(domain, i))
return df发布于 2017-04-26 08:41:57
不知道为什么我问了个问题就被骗了。也许这就是stackoverflow的工作原理。
我找到了答案,它并不像改变域名那么简单。安德鲁,我非常感谢你的回复,因为它让我走上了正确的道路。
我花了大量的时间来调试它。我甚至尝试过使用ldap3 --一个不同的python AD库。这是一个错误,但如果你有一个小于1000的结果集,速度要快得多。我从来没有做过超过1000条记录的页面搜索-这是AD的限制。最后,我回到pyad解决了这个问题。Pyad是一个更容易使用的模块--以我的浅见。
我学习了LDAP服务器和GC服务器之间的区别。GC服务器能够为林中的所有域提供大多数属性。我能够使用powershell识别网络上的GC服务器:
> $GCs = Get-ADForest
> $GCs.GlobalCatalogs完成后,我在pyad中设置了LDAP服务器:
z_obj.default_ldap_server='xxxx.corp.microsoft.com' 我还从查询中删除了一些属性。不确定这是不是一个因素。
无需向pyad发送用户名和密码,最终结果就能正常工作。以下是工作的代码:
def call_adquery(domain, debug=False):
df = pd.DataFrame()
z_obj = adquery.ADQuery()
i = 0
wc = """
objectClass='person'
and SAMAccountType='805306368'
and userAccountControl='512'
"""
dn = 'OU=UserAccounts,DC={0},DC=corp,DC=microsoft,DC=com'.format(domain)
att = ['givenName', 'mail', 'manager',
'Name',
'displayName','Title','mailNickName',
'Department','Company',
'userPrincipalName','sn','cn', 'DistinguishedName',
'physicalDeliveryOfficeName']
z_obj.default_ldap_server='<gc from powershell>'
z_obj.execute_query(attributes=att, where_clause=wc, base_dn=dn, type='GC')
df = pd.DataFrame()
for row in z_obj.get_results():
i += 1
if (debug==True) and (i == 10):
break
if len(df)==0:
df =pd.DataFrame(row, index=[0])
else:
df= df.append(row, ignore_index=True)
return df我的猜测是,我的默认active directory服务器更改了,从而导致我的脆弱代码失败。
希望这对其他人有帮助。
https://stackoverflow.com/questions/43484280
复制相似问题