Войти

Показать полную графическую версию : [решено] Создание, обновление контактов и помещение из в группу рассылки


ratibor79
07-06-2014, 11:47
Здравствуйте, уважаемые коллеги

Столкнулся с такой необходимостью:
Наша компания достаточно большая разветвлённая, имеется несколько организаций в структуре этой компании и не все они с точки зрения топологии сети находиться в одном лесу. Есть компании, которые имею свой собственный лес и собственный Exchange сервер. Как и во многих организациях, сотрудники приходят, уходят, переводиться в другие подразделения (организации), меняются электронные адреса, меняются телефоны, в общем, идет обычный кадровый процесс.

Теперь к самой сути.
Имеется Exchange 2010
- Требуется периодическое обновление членства группы рассылки на основе контактов.
- Необходимо максимально облегчить этот процесс на основе скрипта PowerShell
- Имеется, постоянно обновляющийся CSV файл контактов.

Что требуется от скрипта:
Сверка содержимого CSV и OU в Active Directory на предмет совпадения контактов. Если контакт существует в OU и в CSV, то ни каких действий не происходит. Если контакт отсутствует в OU, то контакт создается на основе полученных данных из CSV. Если существующий контакт в OU отсутствует в CSV, то контакт удаляется из AD.

Дополнительно, должно происходить обновление атрибутов контактов (объектов Active Directory - contacts) на основе CSV файла, а именно мобильный телефон, должность, компания.
И было бы замечательно, если бы вновь созданные контакты помещались в группу рассылки.

Я наклепал небольшой скрипт создающий контакты и меняющий в них атрибуты, но на этом мои знания иссякли. Не могу сообразить, как мне соблюсти условия.

Вот мой скрипт.


Import-Module ActiveDirectory

$Contacts = Import-Csv -Delimiter ";" -Path "C:\SCRIPTS\CreateContactsCSV\ContactsList.csv"

foreach ($Contact in $Contacts)
{
$FN = $Contact.FN
$LN = $Contact.LN
$N = ($Contact.FN +" "+ $Contact.LN)
$A = ($Contact.FN +"."+ $Contact.LN)
$T = $Contact.T
$M = $Contact.M
$OU = $Contact.OU
$SMTP = 'SMTP:' + $Contact.E

New-MailContact `
-FirstName $FN `
-LastName $LN `
-Name $N `
-Alias $A `
-OrganizationalUnit $OU `
-ExternalEmailAddress $SMTP

Get-ADObject -LDAPFilter "objectCLASS=contact" -SearchBase 'OU=Contacts,DC=domain,DC=local' | `
Where-Object {$_.Name -like $N} | Set-ADObject -Replace @{mobile=$M;title=$T}
}


А вот образец CSV файла:

FN;LN;T;M;E;OU
Vladimir;Putin;President;+7 777 1111111;V.Putin@pochta.kz;domain.local/Contacts
Barak;Obama;Assistant of the President;+7 777 2222222;B.Obama@pochta.kz;domain.local/Contacts



Надеюсь на Вашу помощь. Спасибо.

Kazun
07-06-2014, 19:44
Import-Module ActiveDirectory

$FContacts = Import-Csv -Delimiter ";" -Path "C:\SCRIPTS\CreateContactsCSV\ContactsList.csv" | Foreach {
$_ | Add-Member -Type NoteProperty -Name Name -Value ($_.FN +" "+ $_.LN) -PassThru
}
$AContacts = Get-ADObject -LDAPFilter "objectCLASS=contact" -SearchBase 'OU=Contacts,DC=domain,DC=local' -Property proxyAddresses,mobile,title

Compare-Object $FContacts $AContacts -Property Name -IncludeEqual -PassThru | Foreach {
if($_.SideIndicator -eq "==") {
$T = $_.T
$M = $_.M
$E = $_.E
$N = $_.Name
$AContacts | Where {Name -eq $N -and proxyAddresses -match $E -and (Mobile -ne $M -or Title -ne $T)} | Foreach {
Set-ADObject -Identity $_.DistinguishedName -Replace @{mobile=$M;title=$T}
}
}

if($_.SideIndicator -eq "=>") {
Remove-ADObject -Identity $_.DistinguishedName -Confirm:$false
}

if($_.SideIndicator -eq "<=") {
$FN = $_.FN
$LN = $_.LN
$N = ($_.FN +" "+ $_.LN)
$A = ($_.FN +"."+ $_.LN)
$T = $_.T
$M = $_.M
$OU = $_.OU
$SMTP = 'SMTP:' + $_.E

New-MailContact `
-FirstName $FN `
-LastName $LN `
-Name $N `
-Alias $A `
-OrganizationalUnit $OU `
-ExternalEmailAddress $SMTP

Get-ADObject -LDAPFilter "(&(objectClass=contact)(name=$N))" -SearchBase 'OU=Contacts,DC=domain,DC=local' | Foreach {
Set-ADObject $_ -Replace @{mobile=$M;title=$T}
Add-DistributionGroupMember -Identity "MY_GROUP" -Member $_.DistinguishedName
}

}
}

ratibor79
07-06-2014, 21:32
Kazun,
огромнейшее ВАМ спасибо. Великолепное решение.

Но есть маленькие нюансы, если не сложно помогите понять и разобраться.

1. Выводит ошибку при выполнении этой части кода:

$AContacts | Where {Name -eq $N -and proxyAddresses -match $E -and (Mobile -ne $M -or Title -ne $T)} | Foreach {
Set-ADObject -Identity $_.DistinguishedName -Replace @{mobile=$M;title=$T}

вот ошибка (повторяющаяся ошибка):

The term 'Name' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was
included, verify that the path is correct and try again.
At C:\TEMP\SCRIPTS\CreateContactsCSV\TEST.ps1:16 char:27
+ $AContacts | Where {Name <<<< -eq $N -and proxyAddresses -match $E -and (Mobile -ne $M -or Title -ne $T)} | Foreach {
+ CategoryInfo : ObjectNotFound: (Name:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException


2. Ошибка при добавлении контакта в группу рассылки. В этой части кода:

Add-DistributionGroupMember -Identity "MY_GROUP" -Member $_.DistinguishedName


Вот сама ошибка:

Add-DistributionGroupMember : Couldn't find object "domain.local/Contacts/Barak Obama". Please make sure that it was spelled correctly or specif
y a different object.
At C:\TEMP\SCRIPTS\CreateContactsCSV\TEST.ps1:45 char:31
+ Add-DistributionGroupMember <<<< -Identity "MY_GROUP" -Member $_.DistinguishedName
+ CategoryInfo : NotSpecified: (0:Int32) [Add-DistributionGroupMember], ManagementObjectNotFoundException
+ FullyQualifiedErrorId : F1FA247D,Microsoft.Exchange.Management.RecipientTasks.AddDistributionGroupMember


P.S. ! Имя группы и путь в AD изменены !

Еще раз СПАСИБО.

Kazun
08-06-2014, 11:44
1) Заменить на:
$AContacts | Where {$_.Name -eq $N -and $_.proxyAddresses -match $E -and ($_.Mobile -ne $M -or $_.Title -ne $T)} | Foreach {
Set-ADObject -Identity $_.DistinguishedName -Replace @{mobile=$M;title=$T}
}

2) ДЛя единичного контакта команда выполняется?

ratibor79
08-06-2014, 14:02
Kazun,
Спасибо Вам большое
1) Сработало. Прошу прощения, забыл изначально сообщить Вам, что запускаю скрипт на Windows Server 2008 R2 с PowerShell 2.0.
По началу тоже была такая мысль, внести аналогичные изменения.
2) ДЛя единичного контакта команда выполняется? »
Раз, через раз. Иногда выполняется только один контакт, иногда ни один.

Спасибо Вам большое за отзывчивость и помощь.




© OSzone.net 2001-2012