none
Выборка пользователей в группе AD RRS feed

  • Вопрос

  • Доброго времени суток!!

    Сталкнулся со следующей проблемой. Есть AD на WIN2003. Есть група безопасности, в которой около 2500 пользователей. Делаю выборку скриптом пользователей из группы получается ровно 1500 пользователей. Ниже листинг скрипта

    'Option Explicit
    Dim strMember
    Dim arrMemberOf
    Const ADS_SCOPE_SUBTREE = 2
    '********************************LOG_FILE********************************************************
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set LogFile = fso.OpenTextFile("c:\sub\log.txt", 8, True)
    LogFile.WriteLine "********************************************************************************"
    LogFile.WriteLine now()& " Начало работы скрипта "

    Set fso1 = CreateObject("Scripting.FileSystemObject")
    Set LogFile1 = fso1.OpenTextFile("c:\sub\log1.txt", 8, True)
    LogFile1.WriteLine "********************************************************************************"
    LogFile1.WriteLine now()& " Начало работы скрипта "
    '********************************Log_FILE*********************************************************
    Set MyDB = CreateObject("ADODB.Connection")
    MyDB.ConnectionTimeout = 30
    MyDB.CommandTimeout = 30
    MystrDB = "Driver={MySQL ODBC 5.1 Driver};"
    MyDB.Open MystrDB
    '********************************LOG_FILE********************************************************
    Set rs_delete=CreateObject("ADODB.Recordset")
    SQL_USERS_delete="DELETE FROM ad_list_table"
    Set rs_delete = MyDB.Execute(SQL_USERS_delete)
    Set rs_delete=Nothing
    Set objCmd = CreateObject("ADODB.Command")
    Set objCmd.ActiveConnection = MyDB
    Set rs_insert=CreateObject("ADODB.Recordset")
    Set objConnection = CreateObject("ADODB.Connection")
    Set objCommand =   CreateObject("ADODB.Command")
    objConnection.Provider = "ADsDSOObject"
    objConnection.Open "Active Directory Provider"
    Set objCommand.ActiveConnection = objConnection
    objCommand.Properties("Page Size") = 3000
    objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
    objCommand.Properties("Cache Results") = False
    objCommand.Properties("Timeout") = 60
    objCommand.CommandText = "SELECT name, mail, distinguishedName FROM 'LDAP://OU' WHERE objectCategory='group'" 
    Set objRecordSet = objCommand.Execute
    Do Until objRecordSet.EOF
    i=i+1
    st=""
    Name=objRecordSet.Fields("name").Value
    mail=objRecordSet.Fields("mail").Value
    patch=objRecordSet.Fields("distinguishedName").Value
    LogFile1.WriteLine now()&";"& patch &";"
    Set objGroup = GetObject ("LDAP://"& patch)
    objGroup.getInfo
    arrMemberOf = objGroup.GetEx("member")
    For Each strMember in arrMemberOf
    Set objuser = GetObject ("LDAP://"& strMember)
    objuser.getInfo
    mail1 = objuser.Get("mail")
    LogFile.WriteLine now()&";"& name &";"& mail &";"& mail1 &";"
    SQL_STR_SET= "INSERT INTO ad_list_table (list_name,list_mail,list_user) VALUES ('"&name&"','"& mail &"','"& mail1 &"')"
    objCmd.CommandText=SQL_STR_SET
    objCmd.Execute
    Set objUser = Nothing
    Next
    objRecordSet.MoveNext
    Loop

    Полные пути в листинге, я заведомо убрал, скрипт работает без вопросов, только проблема с "большой" групппой.

    Не могу понять где может быть ограничение?

    6 декабря 2011 г. 14:00

Ответы

  • Большое спасибо за ссылки. Нашёл в них решение проблемы.

    Есть такой параметр MaxValRange в политиках LDAP, который означает "Максимальное количество значений, которые могут быть извлечены из многозначный атрибут в одном запросе поиска (1500 значений). Эта политика доступна только в Windows Server 2003 и Windows Server 2008."(перевод Google). В LDAP стояло значение по умолчанию 0, изменил на 3000 и всё заработало.

    • Помечено в качестве ответа schrek 8 декабря 2011 г. 6:31
    8 декабря 2011 г. 6:31

Все ответы

  • Есть довольно интересная статья на данную тему: http://www.osp.ru/win2000/2010/01/13001643/

    Прямого ответа на ваш вопрос она не дает, но...

    И ещё. По-моему по умолчанию максимально возможное значение параметра PageSize = 1000. (http://technet.microsoft.com/ru-ru/library/cc770976(WS.10).aspx) Соответственно ваше значение может просто игнорироваться.

    http://support.microsoft.com/kb/315071
    6 декабря 2011 г. 16:25
  • Большое спасибо за ссылки. Нашёл в них решение проблемы.

    Есть такой параметр MaxValRange в политиках LDAP, который означает "Максимальное количество значений, которые могут быть извлечены из многозначный атрибут в одном запросе поиска (1500 значений). Эта политика доступна только в Windows Server 2003 и Windows Server 2008."(перевод Google). В LDAP стояло значение по умолчанию 0, изменил на 3000 и всё заработало.

    • Помечено в качестве ответа schrek 8 декабря 2011 г. 6:31
    8 декабря 2011 г. 6:31