none
Импорт контактов в AD на PowerShell RRS feed

  • Вопрос

  • Подскажите пожалуйста, начинаю разбираться с powershell, возникла следующая задача:
    есть два домена, нужно получить всех пользователей одного домена и добавить их в другой как контакты
    Пока что у меня получилось написать только вот это
    $OU = [ADSI]"LDAP://OU=unitname,OU=outdomain,DC=dcname,DC=local"
    $selector = New-Object system.DirectoryServices.DirectorySearcher
    $Selector.SearchRoot = $OU
    $selector.Filter = "(&(objectCategory=User)(objectClass=contact))" 
    $selector.FindAll() | ForEach-Object {
    New-QADObject -type 'Contact' –parentContainer "OU=Test_Contact,DC=dcname,DC=local"  -Name $_.properties.cn -ObjectAttributes @{mail=$_.properties.mail;telephonenumber=$_.properties.telephonenumber}
    }
    Но этот код не работает... ругается на " -ObjectAttributes @{mail="EMAIL"} ", хотя если выполнять тот же код не в цикле то поля "Эмэйл" и "телефон" заполняются нормально. Подскажите что я делаю не так? И вообще как правильнее решить мою задачу?
    23 сентября 2009 г. 6:37

Ответы

  • У меня в блоге есть скрипт, который выполняет задачу импортирования учеток пользователей как контактов из одно домена в другой:
    http://sazonov.spaces.live.com/blog/cns!C80884C5BEC6A15D!199.entry?&_c02_vws=1
    Сазонов Илья http://www.itcommunity.ru/blogs/sie-wl/
    • Помечено в качестве ответа -hidden- 23 сентября 2009 г. 8:57
    23 сентября 2009 г. 8:25
    Модератор
  • Еще если мне не изменяет память, можно было запрашивать более 1000 объектов с помощью командлетов Quest, соответственно указав какой то ключ.
    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com

    Можно проще:

       {
       $searcher = new-object DirectoryServices.DirectorySearcher([ADSI]"")
       $searcher.filter = "(&(objectCategory=person)(objectClass=user))"
       $Searcher.CacheResults = $true
       $Searcher.SearchScope = Subtree
       $Searcher.PageSize = 3000
       $searcher.findall()
       }

    Если ответ Вам помог, нажмите на изображение зеленой галочки - «пометить как ответ». Если ответ был для Вас полезен, Вы можете пометить это сообщение как «полезное», нажав на ссылку "проголосовать за полезное сообщение".
    • Помечено в качестве ответа Vasily GusevModerator 24 сентября 2009 г. 4:52
    23 сентября 2009 г. 17:29

Все ответы

  • У меня в блоге есть скрипт, который выполняет задачу импортирования учеток пользователей как контактов из одно домена в другой:
    http://sazonov.spaces.live.com/blog/cns!C80884C5BEC6A15D!199.entry?&_c02_vws=1
    Сазонов Илья http://www.itcommunity.ru/blogs/sie-wl/
    • Помечено в качестве ответа -hidden- 23 сентября 2009 г. 8:57
    23 сентября 2009 г. 8:25
    Модератор
  • Спасибо, все замечательно работает, но есть одно "но" импортируются только первая тысяча записей, я подозреваю это ограничение самого powershell. Как бы его обойти?
    23 сентября 2009 г. 13:21
  • Это ограничение LDAP. По умолчанию результат возвращаемый по запросу ограничен 1000 записей, чтобы в больших каталогах не подвешивать компьютеры администраторов за невнимательность при составлении запросов :) На самом деле конечно скорее для усложнения DOS атак на AD :)
    Обойти можно либо глобально изменив лимит:
    http://support.microsoft.com/default.aspx?scid=kb;en-us;315071&sd=tech 
    http://support.microsoft.com/default.aspx?scid=kb;en-us;243281 
    либо используя "paged search":
    http://msdn.microsoft.com/en-us/library/aa746414(VS.85).aspx
    его использует для запросов например утилита ADFind - http://www.joeware.net/freetools/tools/adfind/index.htm (Автор MVP: Active Directory). К сожалению примера на PS я не смог быстро найти, но если попадётся несложный код например на C# - можно попробовать сконвертировать.
    Еще если мне не изменяет память, можно было запрашивать более 1000 объектов с помощью командлетов Quest, соответственно указав какой то ключ.


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    • Предложено в качестве ответа Vasily GusevModerator 23 сентября 2009 г. 15:19
    23 сентября 2009 г. 15:17
    Модератор
  • Еще если мне не изменяет память, можно было запрашивать более 1000 объектов с помощью командлетов Quest, соответственно указав какой то ключ.
    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com

    Можно проще:

       {
       $searcher = new-object DirectoryServices.DirectorySearcher([ADSI]"")
       $searcher.filter = "(&(objectCategory=person)(objectClass=user))"
       $Searcher.CacheResults = $true
       $Searcher.SearchScope = Subtree
       $Searcher.PageSize = 3000
       $searcher.findall()
       }

    Если ответ Вам помог, нажмите на изображение зеленой галочки - «пометить как ответ». Если ответ был для Вас полезен, Вы можете пометить это сообщение как «полезное», нажав на ссылку "проголосовать за полезное сообщение".
    • Помечено в качестве ответа Vasily GusevModerator 24 сентября 2009 г. 4:52
    23 сентября 2009 г. 17:29
  • Попробовал данный скрипт между доменами с доверительными отношениями. скрипт сработал без ошибок правда ничего не произошло. синхронизация не прошла. Как я понимаю его можно запускать на любой машине под правами админа домена. Может что посоветуете?
    28 февраля 2010 г. 7:52
  • Какой скрипт? :-)


    Сазонов Илья http://www.itcommunity.ru/blogs/sie-wl/
    1 марта 2010 г. 11:47
    Модератор
  • А вы его под себя поправили? Ссылки на контейнеры и т.п.?


    Сазонов Илья http://www.itcommunity.ru/blogs/sie-wl/
    3 марта 2010 г. 6:08
    Модератор
  • конечно поправил может потому что контроллеры доменов русские? вот что у меня есть там где надо править.

    $base = [ADSI] "LDAP://OU=Кадры,OU=domKPSP,DC=domain1,DC=ru" <-- куда класть контакты

    $users = (new-object System.DirectoryServices.DirectorySearcher([ADSI] "LDAP://OU=Users,OU=Кадры,OU=Отделы,DC=domain2,DC=ru","(&(&(objectCategory=person)(objectClass=user)(!userAccountControl:1.2.840.113556.1.4.803:=2)(title=*)))")).findAll()  <-- откуда брать

    просто ничего не происходит. если OU не правильно указать ругается что не может найти.

    3 марта 2010 г. 6:55
  • короче немного подразобрался убрал в строке поиска title=* , так как в домене откуда беру в учетках должности нету , скрипт начал ругатся что не может записать остальные атрибуты , говорит нету таких параметров типа вот так

    "Нельзя вызвать метод для выражения со значением NULL" 

    правда когда выполняю просто поиск

    $users = (new-object System.DirectoryServices.DirectorySearcher([ADSI] "LDAP://OU=Users,OU=Кадры,OU=Отделы,DC=domain2,DC=ru","(&(&(objectCategory=person)(objectClass=user)(!userAccountControl:1.2.840.113556.1.4.803:=2)(title=*)))")).findAll()

    потом даю команду

    $users[0].GetDirectoryEntry().cn

    вижу отдельных юзеров

    дальше ничего не понимаю ПАМАГИТЕ!!!
    4 марта 2010 г. 6:38
  • Вы копируйте строки из скрипта в командную строку и выполняйте их последовательно - так найдете, где ошибка. Скорее всего какое-то поле у вас не имеет значения так же как Title.
    Сазонов Илья http://www.itcommunity.ru/blogs/sie-wl/
    5 марта 2010 г. 3:37
    Модератор
  • Спасибо проверил - была ошибка. Респект за скрипт!
    5 марта 2010 г. 10:13
  • есть два домена, нужно получить всех пользователей одного домена и добавить их в другой как контакты
    Посмотрите, пожалуйста, мою утилиту для синхронизации контактов ContactsADGenerator (CADG2). Она с интерфейсом и протестирована на домене с 12К контактов:
    http://forum.ru-board.com/topic.cgi?forum=2&topic=4011#1
    17 марта 2010 г. 6:47