Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 6, 2011 16:12:31

Rakdos
От:
Зарегистрирован: 2011-09-06
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Список пользователей из AD

Для получения списка пользователей из AD решил использовать следующий код:

import codecs, sys
import win32com.client
count=1
conn = win32com.client.Dispatch("ADODB.Connection")
conn.Provider = "ADSDSOObject"
conn.Open("ADs Provider")
query = "SELECT ADsPath FROM 'LDAP://MyDamain.ru' WHERE objectClass='user' AND objectCategory='person'"
rs = conn.Execute(query)[0]
while not rs.EOF:
obj = win32com.client.GetObject(rs.Fields(0).Value)
print (obj.Class, obj.Name, count)
rs.MoveNext()
count+=1
conn.Close()
Проблема в том, что после 1000-го юзера скрипт отваливается с ошибкой:

Traceback (most recent call last):
File “C:\Users\Desktop\test.py”, line 12, in <module>
rs.MoveNext()
File “<COMObject Execute>”, line 2, in MoveNext
pywintypes.com_error: (-2147352567, ‘Ошибка.’, (0, ‘Provider’, ‘Для этого запроса превышен предел размера.’, None, 1240640, -2147016669), None)


Т.к. Питоном занялся недавно, пока не могу понять в какую сторону копать. Пожалуйста помогите советом



Офлайн

#2 Сен. 6, 2011 16:54:04

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Список пользователей из AD

Ошибка не в вашем коде - она внутри pywintypes. Скорее всего вы пытаетесть ‘впихнуть’ ему слишком много данных.
Что если брать не всех сразу, а по-одному?

Отредактировано (Сен. 6, 2011 16:55:37)

Офлайн

#3 Сен. 6, 2011 21:18:22

InPython
От:
Зарегистрирован: 2011-01-31
Сообщения: 69
Репутация: +  0  -
Профиль   Отправить e-mail  

Список пользователей из AD

а где этот серв стоит что там 1к юзверей в ад? просто интересно…



Офлайн

#4 Сен. 7, 2011 07:04:57

Rakdos
От:
Зарегистрирован: 2011-09-06
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Список пользователей из AD

Ковдорский ГОК



Офлайн

#5 Сен. 7, 2011 10:40:08

Rakdos
От:
Зарегистрирован: 2011-09-06
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Список пользователей из AD

Переписал код для последовательного чтения из AD для каждого OU отдельно:

import codecs, sys
import win32com.client

#функция получает из AD список пользователей одного OU и
#записывает его в файл. OU передаeтся в качестве аргумента
def queryAD(OU):
conn = win32com.client.Dispatch("ADODB.Connection")
conn.Provider = "ADSDSOObject"
conn.Open("ADs Provider")
query = "SELECT ADsPath FROM '"+OU+"' WHERE objectClass='user' and objectCategory='person'"
rs = conn.Execute(query)[0]
while not rs.EOF:
obj = win32com.client.GetObject(rs.Fields(0).Value)
print (obj.Name[3:], file=file)
rs.MoveNext()
conn.Close()

#Открываем файл для сохранения результатов
file=open('user.txt','a')

#В цикле считываем из файла OUpath.txt пути к OU
#и передаем их функции для обработки
for x in open('OUpath.txt'):
queryAD(x[:-1])

#Закрываем файл
file.close()
В таком виде все отлично работает. Единственный недостаток - пришлось ручками пути OU в файл забивать
Спасибо s0rg за подсказку :D



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version