2017-04-19 5 views
0

Ich hatte das vorher arbeiten. Jetzt, nachdem ich die Maschine geplättet und wieder aufgebaut habe, kann ich nicht glauben, dass Pyad funktioniert.Haben Probleme, pyad zu arbeiten

Mein Skript verwendet Adquery, um die Mitglieder einer Domäne abzurufen.

Ich habe pyad und pywin32 mit den richtigen Versionen installiert. Ich benutze Python 3.6.

Ich halte die folgende Fehlermeldung erhalten:

pywintypes.com_error: 'Ausnahme ist aufgetreten' (-2147352567, (0, 'Active Directory', ‚Die angegebene Domäne ist nicht sein könnte existiert oder nicht kontaktiert . \ r \ n ', None, 0, -2147217865), None)

Das Skript lief vorher einwandfrei, also gehe ich davon aus, dass es sich um ein Installationsproblem handelt. Hier

ist die Funktion, die ich schrieb:

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 
+0

Ist Ihre Domain * wirklich * corp.microsoft.com? –

Antwort

1

nicht sicher, warum ich eine Frage stellen dinged wurde. Vielleicht funktioniert Stackoverflow so.

Ich fand die Antwort und es war nicht so einfach wie das Ändern der Domäne. Andrew, ich weiß es zu schätzen, dass du reagierst, weil es mich auf den richtigen Weg geschickt hat.

Ich verbrachte eine Menge Zeit mit der Fehlersuche. Ich habe sogar versucht, ldap3 - eine andere Python-AD-Bibliothek - zu verwenden. Das war fehlerhaft, aber viel schneller, wenn Sie weniger als 1000 Ergebnisse hatten. Ich konnte nie eine Seite durchsuchen, die mehr als 1000 Datensätze durchsucht hat - das AD-Limit. Irgendwann ging ich zurück zu Pyad und fand das Problem heraus. Pyad ist ein einfacher zu benutzendes Modul - meiner bescheidenen Meinung nach.

Ich lernte den Unterschied zwischen und LDAP-Server und einem GC-Server. Der GC-Server kann die meisten Attribute für alle Domänen in der Gesamtstruktur bereitstellen. Ich konnte einen GC-Server im Netzwerk mithilfe von Powershell identifizieren:

> $GCs = Get-ADForest 
> $GCs.GlobalCatalogs 

Einmal hatte ich, dass ich den LDAP-Server in pyad gesetzt:

z_obj.default_ldap_server='xxxx.corp.microsoft.com' 

ich auch ein paar Attribute aus der Abfrage entfernt . Nicht sicher, ob das ein Faktor war.

Das Endergebnis funktioniert gut, ohne den Benutzernamen und das Passwort an pyad zu senden. Hier ist der Code, das funktioniert:

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 

Meine Vermutung ist mein Standard-Active-Directory-Server geändert und damit mein fragiler Code verursacht scheitern.

Hoffe das hilft jemand anderem.