Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Создание, обновление контактов и помещение из в группу рассылки

Ответить
Настройки темы
PowerShell - [решено] Создание, обновление контактов и помещение из в группу рассылки

Пользователь


Сообщения: 112
Благодарности: 20

Профиль | Отправить PM | Цитировать


Здравствуйте, уважаемые коллеги

Столкнулся с такой необходимостью:
Наша компания достаточно большая разветвлённая, имеется несколько организаций в структуре этой компании и не все они с точки зрения топологии сети находиться в одном лесу. Есть компании, которые имею свой собственный лес и собственный 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

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

Отправлено: 11:47, 07-06-2014

 

Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
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
		}

	}
}
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:44, 07-06-2014 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 112
Благодарности: 20

Профиль | Отправить PM | Цитировать


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 изменены !

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

Отправлено: 21:32, 07-06-2014 | #3


Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


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) ДЛя единичного контакта команда выполняется?
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:44, 08-06-2014 | #4


Пользователь


Сообщения: 112
Благодарности: 20

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 14:02, 08-06-2014 | #5



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Создание, обновление контактов и помещение из в группу рассылки

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
V. 2007 - Отправка на группу рассылки, в которой состою я. meateron Microsoft Exchange Server 2 20-07-2012 11:28
PowerShell - [решено] Динамическое создание и изменение групп рассылки в Outlook (DistList) dosperados Скриптовые языки администрирования Windows 4 04-04-2012 14:48
V. 2007 - Ошибка при попытке добавить множество контактов в список рассылки в Outlook Dmitriy_K Microsoft Exchange Server 1 03-04-2009 10:56
[решено] Создание контактов в AD Delirium Microsoft Windows NT/2000/2003 2 05-06-2008 08:30
Exchange 2003: создание списка рассылки keyF Microsoft Exchange Server 0 01-01-2006 18:59




 
Переход