none
GAL, Две разные организации. RRS feed

  • Общие обсуждения

  • Добрый день. Есть две организации в которых развернут Exchange 2010. Необходимо в организации 1 добавить адресную книгу организации 2. Доверительные отношения между организациями делать не можно. Как можно организовать GAL без доверительных отношений, да еще и что бы поддерживать актуальный список контактов ?

    Заранее спасибо.


Все ответы

  • Если только добавить пользователей организации 2 в виде контактов в организацию 1.

    Do not multiply entities beyond what is necessary

  • Да вот как сделать что бы сервисная учетка, ломилась в организацию 2 сканировала юзеров в АД, и в организации 1 создавала контакты ?

  • Без доверительных отношений между лесами сделать это не получится. Как вариант - получить csv файл с требуемыми контактами из второй организации и импортировать его в первой. Почитайте пример.

    Do not multiply entities beyond what is necessary

  • Без доверительных отношений между лесами сделать это не получится. Как вариант - получить csv файл с требуемыми контактами из второй организации и импортировать его в первой. Почитайте пример.

    Do not multiply entities beyond what is necessary

    Почему не получится ?

    Если из одной организации можно подключиться по LDAP к контроллеру домена другой, то все будет работать. Достаточно выгрузить список объектов у которых атрибут msExchMailboxGUID не нулевой и вот информация для создания контактов в локальном домене. Естественно при этом должна быть учетная запись удаленного домена с правом чтения данных

  • И как импортировать в АД 2008 R2 контакты с разными атрибутами ? телефон, описание, заметкии т.д. ?
    пытаюсь сделать так но не получается

    Import-CSV -Path "C:\ADUsers.csv" | ForEach-Object -process {New-ADObject -Path "OU=Contract,DC=contoso,DC=loc" -Name $_.Name -Type  contact -DisplayName $_.Name -OtherAttributes @{'Mail'=$_.EmailAddress; 'proxyAddresses'=$_.EmailAddress; 'targetAddress'=$_.EmailAddress; 'Description'=$_.Description; 'Company'=$_.Company; 'Office'=$_.Office; 'OfficePhone'=$_.OfficePhone 'GivenName'=$_.GivenName }}


  • Что у вас не получается ?

    Не создаются контакты; Создаются но не видны в GAL. Опишите пожалуйста более подробней

  • не получается создать контакт в Active Diretory с определенными атрибутами. Выше написал через какой скрипт это делаю.
  • В Active Directory нет атрибута OfficePhone и Office. Атрибуты targetAddress и proxyaddress обычно имеют вид типа smtp:<usermail>

    Если и после этого у вас не создастся контакт то просьба все же предоставить тех инфу с текстом ошибки powershell. Пока приходится только гадать о причинах

  • То есть контакт может содержать только ФИО и электронный адрес?
    я пока что уперся в атрибуты(создание контактов с CSV-файла), т.к. руководство хочет видеть не только ФИО и адрес но и кабинет, отдел и т.д.
  • Это не проблемы контакта. Таких атрибутов нет вообще в стандартном Active Directory (у пользователей в том числе)

    То что вы видите как Office в AD хранится в виде атрибута physicalDeliveryOfficeName

    Если под OfficePhone  вы подразумевает Telephone Number то это атрибут telephonenumber.

    Для просмотра атрибутов Включите в ADUC Advanced Features либо воспользуйтесь ADSI Edit. Те названия которые вы видите в карточке сотрудника могут отличаться от реальных атрибутов AD


  • Спасибо, немного ошибся с атрибутами....
    5 июня 2014 г. 11:07
  • Есть:
    1. Скрипт экспорта

    Get-ADUser  -searchbase “dc=contoso,dc=loc” -Properties Company, Department, Description, DisplayName, GivenName, info, l, Mail, Mobile, sn, PhysicalDeliveryOfficeName, TelephoneNumber, Title |  select-object Company, Department, Description, DisplayName, GivenName, info, l, Mail, Mobile, sn, PhysicalDeliveryOfficeName, TelephoneNumber, Title | Export-csv D:\ADUsers.csv -Encoding Unicode

    как сюда добавить поиск только для тех у кого заполненный атрибут msExchMailboxGUID  ( where {$_.msExchMailboxGUID -eq '?????'} )

    2. Создание с CVS контактов

    Import-CSV -Path "C:\ADUsers.csv" | ForEach-Object -process {New-ADObject -Path "OU=contoso,DC=adatum,DC=loc" -Name $_.DisplayName -Type  contact -DisplayName $_.DisplayName -OtherAttributes @{'Company'=$_.Company;'Department'=$_.Department;'GivenName'=$_.GivenName; 'info'=$_.info; 'l'=$_.l; 'Mail '=$_.Mail; 'Mobile'=$_.Mobile; 'sn'=$_.sn;'PhysicalDeliveryOfficeName'=$_.PhysicalDeliveryOfficeName;'TelephoneNumber'=$_.TelephoneNumber; 'Title'=$_.Title }}

    т.к. скрипт будет отрабатывать ежедневно будут объекты которые существуют, как сделать замену старых объектов на новые  ? 



    5 июня 2014 г. 12:02
  • 1. $_.msExchMailboxGUID -ne $null

    2. Определите для себя какое-то поле как ключевое и проверяйте по нему. Как вариант при создании контакта прописывайте ему в отдельный атрибут SID оригинальной учетной записи. Соответственно при импорте проверяйте есть ли у вас контакт с таким SID или нет.

    Вообще, если вы планируете запускать данный скрипт на регулярной основе, то продумайте все варианты развития событий. Т.к. у пользователя с той стороны может меняться должность,офис, фамилия, e-mail и даже SID. 

    В итоге у вас должно получиться 4 сценария (насколько я это вижу):

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

    Реализация данных проверок и действий при их обнаружении остается полностью на ваше усмотрение.

    5 июня 2014 г. 12:23
  • Синхронизацию GAL можно делать с помощью продукта FIM 2010. Это не требует доверительных отношений.

    Либо можно использовать скрипт. Например, http://www.wapshere.com/missmiis/a-galsync-powershell-script


    Сазонов Илья http://isazonov.wordpress.com/

    Модератор
  • 1. $_.msExchMailboxGUID -ne $null

    2. Определите для себя какое-то поле как ключевое и проверяйте по нему. Как вариант при создании контакта прописывайте ему в отдельный атрибут SID оригинальной учетной записи. Соответственно при импорте проверяйте есть ли у вас контакт с таким SID или нет.

    Вообще, если вы планируете запускать данный скрипт на регулярной основе, то продумайте все варианты развития событий. Т.к. у пользователя с той стороны может меняться должность,офис, фамилия, e-mail и даже SID. 

    В итоге у вас должно получиться 4 сценария (насколько я это вижу):

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

    Реализация данных проверок и действий при их обнаружении остается полностью на ваше усмотрение.

    Я в PowerShell'е не очень, и  есть два вопроса
    1. Когда сценарий новый человек,  как написать что если контакт(человек) с атрибутом DisplayName отсутствует, то создается новый контакт.  проверка по имени, если такой же человек есть то не добавляет, а если нету - добавляет.

    2. "Пользователь был удален из оригинального леса. Вы должны удалить контакт в своем лесу" - какой командой или функцией выполнить проверку, вот был человек с ID 5, при создании контакта а его в списке уже нету.

  • И в первом и во втором случае вам необходимо сравнивать 2 списка.

    1. Список который вы получили в виде csv с удаленного AD

    2. Ваш непосредственный список. На мой взгляд лучше создавать контакты в каком-то одном OU

    Если принять что $local - список локальных контактов а $remote - список полученный из csv, то я бы сделал примерно следующее:

    # Проверяем существование контакта в локальной адресной книге foreach ($remotcontact in $remote){ if (!($local |where-object {$_.DisaplayName -eq $remotecontact})) { AddContact($remotecontact) } } #Проверяем необходимость удалить контакт Foreach ($localcontact in $local){ if (!($remot |where-object {$_.DisaplayName -eq $localContact.DisplayName})) { RemoveContact($localContact) } }

    Главное не сравнивайте объекты контакта из AD и csv файла напрямую. Они будут 100% разные даже если будут содержать одни и те же значения полей.

    Также рекомендую посмотреть срипты, которые скинул Илья. В них обрабатывается создание, удаление и обновление контактов

    6 июня 2014 г. 11:25
  • Добрый день.

    Посмотрите вот этот документ, может будет полезен.

    Gal Sync between Two exchange Forest Using Power Shell


    Blog - Smtp25.ru
    | Exchange Tools | Exchange Planning Tools | Exchange 2013 Books | Exchange Guided Walkthroughs |

    Отвечающий
  • Добрый день, столкнулся с проблемой что при импорте те у кого атрибуты не заполнены, импортировать не хочет. Как осуществить, что бы даже с пустыми атрибутами производился импорт.
    10 июня 2014 г. 6:57
  • Киньте пожалуйста ошибку которую выдает powershell
    10 июня 2014 г. 7:11
  • New-ADObject : Сервер не склонен обработать запрос
    строка:1 знак:74
    + Import-CSV -Path "C:\ADUsers.csv" | ForEach-Object -process {New-ADObject <<<<  -Path "OU=Adatum,DC=contoso,DC=loc" -Name $_.DisplayName -Type  contact -DisplayName $_.DisplayName -OtherAttributes @{'Company'=$_.Company;'Department'=$_.Department;'GivenName'=$_.GivenName; 'info'=$_.info; 'l'=$_.l; 'Mail '=$_.Mail; 'Mobile'=$_.Mobile; 'sn'=$_.sn;'PhysicalDeliveryOfficeName'=$_.PhysicalDeliveryOfficeName;'TelephoneNumber'=$_.TelephoneNumber; 'Title'=$_.Title }}
      + CategoryInfo          : NotSpecified: (cn=(Уволен) Син...s,DC=contoso,DC=loc:String) [New-ADObject], ADException
      + FullyQualifiedErrorId : Сервер не склонен обработать запрос,Microsoft.ActiveDirectory.Management.Commands.NewADObject

    10 июня 2014 г. 7:21
  • Какой атрибут отсутствует у пользователя ? если DisplayName, тогда не получится создать контакт и надо его откуда-то брать.

    А зачем вам в адресной книге уволенные сотрудники ?

    10 июня 2014 г. 7:29
  • Какой атрибут отсутствует у пользователя ? если DisplayName, тогда не получится создать контакт и надо его откуда-то брать.

    А зачем вам в адресной книге уволенные сотрудники ?

    Я потом сделаю фильтр при импорте, пока что просто проверяю. Да вот Displayname у всех есть, а вот телефон, адрес не у всех....
    10 июня 2014 г. 7:35
  • Попробуйте внутри цикла ForEach использовать временную переменную и проверять поля, которые пустые.

    Должно быть что-то типа такого

    Foreach-Object {
    $tmp = $_
    If (!$tmp.TelephoneNumber) {$tmp.telephonenumber = ""}
    #Добавляете таким образом все поля и пробуете после этого создать контакт, только вместо $_ используйте $tmp.
    } 


    10 июня 2014 г. 7:47
  • Попробуйте внутри цикла ForEach использовать временную переменную и проверять поля, которые пустые.

    Должно быть что-то типа такого

    Foreach-Object {
    $tmp = $_
    If (!$tmp.TelephoneNumber) {$tmp.telephonenumber = ""}
    #Добавляете таким образом все поля и пробуете после этого создать контакт, только вместо $_ используйте $tmp.
    } 


    Глупый вопрос от незнания, и как его вставить в этот текст скрипта ? ( я так понимаю его нужно переписать)

    Import-CSV -Path "C:\ADUsers.csv" | ForEach-Object -process {New-ADObject -Path "OU=contoso,DC=adatum,DC=loc" -Name $_.DisplayName -Type  contact -DisplayName $_.DisplayName -OtherAttributes @{'Company'=$_.Company;'Department'=$_.Department;'GivenName'=$_.GivenName; 'info'=$_.info; 'l'=$_.l; 'Mail '=$_.Mail; 'Mobile'=$_.Mobile; 'sn'=$_.sn;'PhysicalDeliveryOfficeName'=$_.PhysicalDeliveryOfficeName;'TelephoneNumber'=$_.TelephoneNumber; 'Title'=$_.Title }}

    10 июня 2014 г. 9:16
  • Import-CSV -Path "C:\ADUsers.csv" | ForEach-Object -process {
    $tmp = $_
    If (!$tmp.TelephoneNumber) {$tmp.telephonenumber = ""}
    if (!$tmp.info){!$tmp.info=""}
    #---------
    #Тут добавляете столько проверок? сколько полей хотите проверять
    #-------
    New-ADObject -Path "OU=contoso,DC=adatum,DC=loc" -Name $tmp_.DisplayName -Type  contact -DisplayName $tmp_.DisplayName -OtherAttributes @{'Company'=$tmp_.Company;'Department'=$tmp_.Department;'GivenName'=$tmp_.GivenName; 'info'=$tmp_.info; 'l'=$tmp_.l; 'Mail '=$tmp_.Mail; 'Mobile'=$tmp_.Mobile; 'sn'=$tmp_.sn;'PhysicalDeliveryOfficeName'=$tmp_.PhysicalDeliveryOfficeName;'TelephoneNumber'=$tmp_.TelephoneNumber; 'Title'=$tmp_.Title }}


    10 июня 2014 г. 9:38
  • Вообщем переделал все т.к. даже когда создались контакты, то Exchange их не подхватил (нужно делать Enable-mailContact)

    сделал вот так

    $CSV = Import-CSV C:\ADUsers.csv

    $Contact =  Get-MailContact -OrganizationalUnit "Adatum" $_.DisplayName | Select DisplayName

    foreach ($entry in $CSV) {

    if ($entry.DisplayName -ne $Contact.DisplayName )

    {

    New-MailContact -Name $entry.DisplayName -FirstName $entry.GivenName –LastName $entry.sn -ExternalEmailAddress $entry.Mail -OrganizationalUnit Adatum -Alias $entry.sAMAccountName;

    set-contact -identity $entry.sAMAccountName -Phone $entry.TelephoneNumber -MobilePhone $entry.Mobile -Office $entry.PhysicalDeliveryOfficeName -Title $entry.Title -Department $entry.Department –Company $entry.Company –City $entry.l

     }

    Else

    { set-contact -identity $entry.sAMAccountName -Phone $entry.TelephoneNumber -MobilePhone $entry.Mobile -Office $entry.PhysicalDeliveryOfficeName -Title $entry.Title -Department $entry.Department –Company $entry.Company –City $entry.l

    }

    }

    Вопрос, правильно ли я сделал с New-MailContact и Set-contact, если контакта нету то он создает его и назначает атрибуты. В случае если контакт есть, то обновляет атрибуты. 
    Если проверять каждый атрибут то делать не через if, а через switch ?

    Заранее спасибо.


    12 июня 2014 г. 6:27