Возникли проблемы с получением пядь на работу
У меня было это работает раньше. Теперь, после того, как я установил и восстановил машину, я не могу заставить работать пиад.
Мой скрипт использует adquery для получения членов домена.
Я установил pyad и pywin32 с правильными версиями. Я использую Python 3.6.
Я продолжаю получать следующую ошибку:
pywintypes.com_error: (-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
1 ответ
Не уверен, почему меня обидели за вопрос. Может быть, именно так работает stackru.
Я понял ответ, и это было не так просто, как смена домена. Эндрю, я очень благодарен тебе за то, что ты ответил мне.
Я потратил кучу времени на отладку этого. Я даже пытался использовать ldap3 - другую библиотеку Python AD. Это было с ошибкой, но намного быстрее, если у вас был набор результатов менее 1000. Я так и не смог выполнить поиск страниц по более чем 1000 записей - предел AD. В конце концов я вернулся в пядь и понял проблему. Pyad - более простой в использовании модуль - по моему скромному мнению.
Я узнал разницу между сервером LDAP и сервером GC. Сервер GC может обслуживать большинство атрибутов для всех доменов в лесу. Мне удалось идентифицировать GC-сервер в сети с помощью powershell:
> $GCs = Get-ADForest
> $GCs.GlobalCatalogs
После этого я установил сервер LDAP в pyad:
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
Я предполагаю, что мой активный сервер каталогов по умолчанию изменился и, следовательно, стал причиной сбоя моего хрупкого кода.
Надеюсь, это поможет кому-то еще.