Скрипт для создания адресных книг Exchange 2010 по штатному расписанию


В какой-то момент я утомился создавать адресные книги Exchange: постоянно меняются подразделения, их названия. Когда их пара десятков жить еще можно, а вот когда их сотни…

Первый вопрос, конечно, есть ли смысл делать несколько сотен адресных книг?

На мой взгляд их вообще не имеет смысла делать при любом количестве – поиск гораздо эффективнее, если им правильно пользоваться. Например, по умолчанию поиск по Главной адресной книге работает только по фамилии, но если переключить в Outlook настройку поиска с «Только по имени» на «Другие столбцы», то можно найти записи по имени подразделения (если знаете, как оно правильно называется), должности и т.п.

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

Наконец, если подразделений и сотрудников много, то найти нужное подразделение (мы говорим об адресных книгах по подразделениям) среди нескольких тысяч – это может оказаться сложной задачей, если не знать точно, что ищешь.

(Есть еще HAB – иерархическая адресная книга, но к ней применимы те же рассуждения, и это другая история)

И так осталось рассмотреть средний вариант по количеству сотрудников и подразделений. Речь о нескольких сотнях подразделений и нескольких тысячах сотрудников. Вот тут может быть некоторая польза от адресных книг: пользователь имеет неплохие шансы быстро сориентироваться в названиях нескольких сотен подразделений и филиалов.

Разумное ограничение числа адресных книг – около 500. Современные экраны имеют хорошее разрешение, и список из 500 элементов вполне хорошо листается в Outlook. Если подразделения достаточно равномерно распределены по филиалам и складно названы, то общий список адресных книг в Outlook выглядит вполне удобно.

Вот для такого случая имеет смысл делать адресные книги. И лучше процесс автоматизировать.

 

И так скрипт создания адресных книг Exchange. (В нем есть некоторый мусор – заготовки на будущее, но работе скрипта это не мешает).

Формат файла CSV со списком подразделений:

Филиал,Подразделение

Филиал1,Отдел11

Филиал1,Отдел12

Филиал2,Отдел21

Филиал2,Отдел22

 

# Статистика

$Stat_ExistAddrLists = 0

$Stat_NewAddrLists = 0

$Stat_RemoveAddrLists = 0

 

 

# Загрузка в два шага: так корректно распознается кодировка русских букв

#

$FullFile = Get-Content «Список подразделений.csv» -Encoding String

$FullList = $FullFile | ConvertFrom-Csv -Delimiter ‘,’

 

Write-Host «Импортировано:» $FullFile.Count -ForegroundColor red

 

$FullFile = $null

 

 

 

$MailServer=«http://ex.domain.ru/PowerShell/»

 

 

$PDCdomaincontroller = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().PdcRoleOwner.Name

 

 

$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri $MailServer -Authentication Kerberos

 

 

# Удаление существующих адресных книг подразделений

   Invoke-Command -Session $Session -ScriptBlock { Get-AddressList Spec1-AL* | Remove-AddressList } | Out-Null

 

#

# Основной цикл по всем подразделениям

#

 

# Служебное имя адресного списка генерируем динамически

# (оно должно быть коротким: есть ограничение на длину)

$AddrListNameNum = 0

 

   $FullList | where {$_.«Филиал«} | ForEach-Object {

 

trap {«Error:»;$DepsFilter;Continue}

 

#$DepsFilter = @{Add = ‘1’,’2′}

   $AddrListNameNum += 1

   $NameAddrList = «Spec1-AL» + $AddrListNameNum.ToString().PadLeft(3, ‘0’)

   $displayname = $_.«Филиал«.TrimEnd() + » « + $_.«Подразделение«.TrimEnd()

   $department = $_.«Подразделение».TrimEnd()

 

   $DepsFilter = ‘((Company -eq »’+ $_.«Филиал« + »’) -and (Department -like »’+ $department + ‘*») -and (Alias -ne $null))’

 

# Создание адресного списка

#   Invoke-Command -Session $Session -ArgumentList $NameAddrList, $displayname, $DepsFilter,$PDCdomaincontroller -ScriptBlock {param ($NameAddrList, $displayname, $DepsFilter, $PDCdomaincontroller) New-AddressList -Name $NameAddrList -DisplayName $displayname  -IncludedRecipients AllRecipients -ConditionalDepartment $DepsFilter -DomainController $PDCdomaincontroller} | Out-Null

   Invoke-Command -Session $Session -ArgumentList $NameAddrList, $displayname, $DepsFilter,$PDCdomaincontroller -ScriptBlock {param ($NameAddrList, $displayname, $DepsFilter, $PDCdomaincontroller) New-AddressList -Name $NameAddrList -DisplayName $displayname -RecipientFilter $DepsFilter -DomainController $PDCdomaincontroller}

# Обновление членства учетных записей в новой адресной книге

   Invoke-Command -Session $Session -ArgumentList $NameAddrList -ScriptBlock {param ($NameAddrList) Update-AddressList -Identity $NameAddrList } | Out-Null

 

   $Stat_NewAddrLists += 1

 

  }

 

Remove-PSSession $Session

 

Write-Host «Обработано существующих адресных книг: « $Stat_ExistAddrLists -ForegroundColor red

Write-Host «Создано новых адресных книг:           « $Stat_NewAddrLists -ForegroundColor red

Write-Host «Удалено адресных книг:                 « $Stat_RemoveAddrLists -ForegroundColor red

 

 

Тоже самое, но более удобное для копирования:

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, «Courier New», courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

 

# Статистика
$Stat_ExistAddrLists = 0
$Stat_NewAddrLists = 0
$Stat_RemoveAddrLists = 0


# Загрузка в два шага: так корректно распознается кодировка русских букв
#
$FullFile = Get-Content "Список подразделений.csv" -Encoding String
$FullList = $FullFile | ConvertFrom-Csv -Delimiter ','

Write-Host "Импортировано:" $FullFile.Count -ForegroundColor red

$FullFile = $null



$MailServer="http://ex.domain.ru/PowerShell/"


$PDCdomaincontroller = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().PdcRoleOwner.Name


$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri $MailServer -Authentication Kerberos


# Удаление существующих адресных книг подразделений
   Invoke-Command -Session $Session -ScriptBlock { Get-AddressList Spec1-AL* | Remove-AddressList } | Out-Null

#
# Основной цикл по всем подразделениям
#

# Служебное имя адресного списка генерируем динамически
# (оно должно быть коротким: есть ограничение на длину)
$AddrListNameNum = 0

   $FullList | where {$_."Филиал"} | ForEach-Object {

trap {"Error:";$DepsFilter;Continue}

#$DepsFilter = @{Add = '1','2'}
   $AddrListNameNum += 1
   $NameAddrList = "Spec1-AL" + $AddrListNameNum.ToString().PadLeft(3, '0')
   $displayname = $_."Филиал".TrimEnd() + " " + $_."Подразделение".TrimEnd()
   $department = $_."Подразделение".TrimEnd()

   $DepsFilter = '((Company -eq '''+ $_."Филиал" + ''') -and (Department -like '''+ $department + '*'') -and (Alias -ne $null))'

# Создание адресного списка
#   Invoke-Command -Session $Session -ArgumentList $NameAddrList, $displayname, $DepsFilter,$PDCdomaincontroller -ScriptBlock {param ($NameAddrList, $displayname, $DepsFilter, $PDCdomaincontroller) New-AddressList -Name $NameAddrList -DisplayName $displayname  -IncludedRecipients AllRecipients -ConditionalDepartment $DepsFilter -DomainController $PDCdomaincontroller} | Out-Null
   Invoke-Command -Session $Session -ArgumentList $NameAddrList, $displayname, $DepsFilter,$PDCdomaincontroller -ScriptBlock {param ($NameAddrList, $displayname, $DepsFilter, $PDCdomaincontroller) New-AddressList -Name $NameAddrList -DisplayName $displayname -RecipientFilter $DepsFilter -DomainController $PDCdomaincontroller}
# Обновление членства учетных записей в новой адресной книге
   Invoke-Command -Session $Session -ArgumentList $NameAddrList -ScriptBlock {param ($NameAddrList) Update-AddressList -Identity $NameAddrList } | Out-Null

   $Stat_NewAddrLists += 1

  }

Remove-PSSession $Session

Write-Host "Обработано существующих адресных книг: " $Stat_ExistAddrLists -ForegroundColor red
Write-Host "Создано новых адресных книг:           " $Stat_NewAddrLists -ForegroundColor red
Write-Host "Удалено адресных книг:                 " $Stat_RemoveAddrLists -ForegroundColor red

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, «Courier New», courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: