В какой-то момент я утомился создавать адресные книги 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; }
Filed under: Exchange | Tagged: Exchange 2010, exchange server, Powershell |
Добавить комментарий