Python 3.x 让pyad工作有困难吗

Python 3.x 让pyad工作有困难吗,python-3.x,pyad,Python 3.x,Pyad,我以前做过这个。现在,在整平和重建机器后,我似乎无法让pyad工作 我的脚本使用adquery获取域的成员 我已经用正确的版本安装了pyad和pywin32。我正在使用Python 3.6 我不断得到以下错误: pywintypes.com_错误:(-2147352567,‘发生异常’,(0,‘Active Directory’,‘指定的域不存在或无法联系。\r\n’,无,0,-2147217865),无) 脚本以前运行得很好,所以我认为这是安装问题 以下是我编写的函数: from pyad i

我以前做过这个。现在,在整平和重建机器后,我似乎无法让pyad工作

我的脚本使用adquery获取域的成员

我已经用正确的版本安装了pyad和pywin32。我正在使用Python 3.6

我不断得到以下错误:

pywintypes.com_错误:(-2147352567,‘发生异常’,(0,‘Active Directory’,‘指定的域不存在或无法联系。\r\n’,无,0,-2147217865),无)

脚本以前运行得很好,所以我认为这是安装问题

以下是我编写的函数:

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

我不知道为什么我因为问问题而被骂。也许这就是stackoverflow的工作原理

我找到了答案,这并不像改变域名那么简单。安德鲁,我非常感谢你的回应,因为这让我走上了正确的道路

我花了很多时间调试这个。我甚至尝试使用ldap3——一个不同的python广告库。这一个是有缺陷的,但是如果你的结果集小于1000,速度会快得多。我从来没能搜索过一页超过1000条记录——广告限制。最后,我回到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
def call_adquery(域,调试=False):
df=pd.DataFrame()
z_obj=adquery.adquery()
i=0
wc=”“”
objectClass='person'
和SAMAccountType='805306368'
和userAccountControl='512'
"""
dn='OU=UserAccounts,DC={0},DC=corp,DC=microsoft,DC=com'。格式(域)
att=['givenName'、'mail'、'manager',
“姓名”,
“显示名称”、“标题”、“邮件昵称”,
"部门","公司",,
“userPrincipalName”、“sn”、“cn”、“DifferentizedName”,
“physicalDeliveryOfficeName”]
z_obj.default_ldap_server=''
z_obj.execute_query(attributes=att,其中_子句=wc,base_dn=dn,type='GC'))
df=pd.DataFrame()
对于z_obj.get_results()中的行:
i+=1
如果(debug==True)和(i==10):
打破
如果len(df)==0:
df=pd.DataFrame(行,索引=[0])
其他:
df=df.append(行,忽略索引=True)
返回df
我猜我的默认active directory服务器已更改,从而导致我的脆弱代码失败

希望这对其他人有所帮助。

您的域名真的是corp.microsoft.com吗?