Полезные командлеты Powershell для Exchange

BlowFish

Участник
Друзья привет! Собираем тут полезные командлеты для exchange server, то что необходимо каждый день, в одном месте.
Формат такой - код powershell и то что он делает. Возможно пояснить походу для масс.
Не стесняемся добавлять.:cool:
Погнали.
Дать права на экспорт почтового ящика в PST
Код:
New-ManagementRoleAssignment -Role "Mailbox Import Export" -User "<username>"
Команда выгружает содержимое почтового ящика пользователя username@mailbox.com в файл PST
Код:
New-MailboxExportRequest -Mailbox username@mailbox.com -FilePath "\\suse\mailarchive\user.pst"

Выгрузить архив пользователя
New-MailboxExportRequest -Mailbox Kweku -FilePath "\\SERVER01\PSTFileShare\Kweku_Archive.pst" -IsArchive

Экспорт некоторых папок почтового ящика в PST (в примере Входящие и отправленные)
Код:
New-MailboxExportRequest -IncludeFolders "#Inbox#/*","#SentItems#" -Mailbox USERNAME -FilePath \\server1\backup\username.pst
Выгрузка с использованием контентного фильтра
Код:
New-MailboxExportRequest -Mailbox user1 -ContentFilter {(Received -lt '17/02/19') -and (Subject -like 'happy*')} -FilePath \\server\share\temp.pst
Поиск и удаление писем с темой 123 в почтовом ящике username@mailbox.com
Код:
Get-mailbox username@mailbox.com | search-mailbox –searchquery “Subject:’123’” –DeleteContent
Импорт ящика из pst
Код:
New-MailboxImportRequest -Mailbox username \\server\share\temp.pst
 
Последнее редактирование модератором:
Очистка почтового ящика exchange
Код:
Search-Mailbox username@domain.com -Deletecontent
Узнать размер почтовых ящиков в базе Exchange
Get-Mailbox -Database DATABASE| Get-MailboxStatistics | ft displayname,totaldeleteditemsize,totalitemsize
 
Последнее редактирование:
Для вывода информации почтовых ящиках на сервере.
Код:
Get-Mailbox -Server имя сервера

Для вывода расширенной информации по почтовым ящикам и сортировкой по размеру
Код:
Get-Mailbox -Server имя сервера | Get-MailboxStatistics | sort TotalItemSize -descending | ft DisplayName, TotalItemSize, ItemCount

При перемещении почтового ящика посмотреть информацию
Код:
Get-MoveRequest -Identity имя почтового ящика

Информация о размере почтовых баз на конкретном сервере.
Код:
Get-MailboxDatabase -Server имя сервера -Status | select ServerName,Name,DatabaseSize
или в другом виде
Get-MailboxDatabase -Status -Server имя сервера | fl name, DatabaseSize

Информация о сотрудниках, которые входят в определенную группу
Код:
Get-DistributionGroupMember имя группы

Информация о содержании общих папок
Код:
Get-PublicFolderStatistics -Server имя сервера

Отправка писем с сервера
Код:
[PS] C:\Windows\system32>Send-MailMessage -From имя ящика с которого отправляем -To имя ящика куда отправляем -Subject "Test #01" -Body "Justa test message" -SMTPServer имя сервера отправки
Информация по спискам рассылок
Код:
Get-DistributionGroup

Информация по общим календарям
Код:
Get-Publicfolder -Identity имя -recurse

Переиндексация базы. Иногда требуется, когда возникает ошибка при поиске писем
[PS] C:\Program Files\Microsoft\Exchange Server\V14\scripts>.\ResetSearchIndex.ps1 -Force имя базы
MSExchangeSearch service stopped
Deleting catalog forимя базы
No index for database:имя базы
MSExchangeSearch service Started

Принудительный запрос сертификата
Код:
Get-ExchangeCertificate | FL
 
Последнее редактирование модератором:
Принудительное обновление OAB
Код:
Get-OfflineAddressbook | Update-OfflineAddressbook
Get-ClientAccessServer | Update-FileDistributionService

Включение Архива для всех ящиков из базы
Задание ограничения на архив и политики архивирования
Код:
Get-MailboxDatabase MDB | Get-Mailbox | Enable-Mailbox -Archive -ArchiveDatabase AMDB
Get-MailboxDatabase MDB | Get-Mailbox | Set-Mailbox -ArchiveWarningQuota 3584MB -ArchiveQuota 4GB
Get-MailboxDatabase MDB | Get-Mailbox | Set-mailbox -RetentionPolicy "Default Archive and Retention Policy"

Политика хранения применяется Managed Folder Assistant’ом. В Exchange 2010 RTM он запускался по расписанию (с часа ночи до 9 утра по умолчанию). В Exchange 2010 SP1 этот ассистент включен постоянно, так что политики архивирования к почтовому ящику должны примениться сразу же. Для ручного запуска используется командлет:
Код:
Get-MailboxDatabase | Get-Mailbox | Start-ManagedFolderAssistant

Найти какому почтовому ящику принадлежит определенный электронный адрес
Код:
Get-mailbox -resultsize unlimited | where-object{$_.Emailaddresses -like "*st@*"} | format-list name,emailaddresses,database,servername

Поиск и удаление писем по теме,вложению
Код:
Get-Mailbox -ResultSize unlimited | Search-Mailbox -SearchQuery вложение:"котики.jpg" -DeleteContent

Посмотр статистики по отдельной базе с ограничением числа отображаемых ящиков.
Код:
Get-MailboxDatabase MDB | Get-Mailbox -ResultSize 15

Просмотр статистики по отдельной БД
Код:
Get-MailboxDatabase MDB |Get-MailboxStatistics | Sort totalitemsize -desc | ft displayname, totalitemsize, itemcount

Экспорт статистики в CSV файл
Код:
Get-MailboxDatabase MDB | Get-MailboxStatistics | Sort totalitemsize -desc | ft displayname, totalitemsize, itemcount | Export-CSV C:\MDB.csv -encoding unicode

Ящики которые не использовались за последние 120 дней
Код:
Get-MailboxDatabase | Get-MailboxStatistics | where {$_.Lastlogontime -lt (get-date).AddDays(-120)} | Sort Lastlogontime -desc | ft DisplayName,ItemCount,Lastlogontime

Экспорт статистики в HTML
Код:
Get-MailboxDatabase | Get-MailboxStatistics | where {$_.Lastlogontime -lt (get-date).AddDays(-120)} | Sort Lastlogontime -desc | ConvertTo-Html DisplayName,ItemCount,Lastlogontime > c:\temp\MB.html

[PS] C:\>Get-MailboxDatabase | Get-MailboxStatistics | where {$_.Lastlogontime -lt (get-date).AddDays(-60)} | where {$_.DisconnectReason -ne "Disabled"} | where {$_.Lastlogontime -ne $null} | Sort Lastlogontime | ft DisplayName,ItemCount,Lastlogontime

Предоставить доступ группе «Organization Management» к содержимому всех существующих почтовых ящиков
Код:
Get-Mailbox | Add-MailboxPermission -User "Organization Management" -AccessRights FullAccess -AutoMapping:$False

[PS] C:\>Get-Mailbox | Get-MailboxPermission | ?{($_.AccessRights -like "*fullaccess*") -and ($_.User
-notlike "*nt authority\self*") -and ($_.IsInherited -like "false")}


Эскпорт почтового ящика в PST
Код:
New-MailboxExportRequest -Mailbox "zalozny" -Filepath "\\PC\temp\zalozny.pst" -ContentFilter {(Received -gt "01/04/2014")}
New-MailboxExportRequest -Mailbox "zalozny" -Filepath "\\PC\temp\zalozny.pst"

Просмотреть статус экспорта
Код:
Get-MailboxExportRequest | ft

очистка выполненых запросов
Код:
Get-MailboxExportRequest -Status Completed | Remove-MailboxExportRequest

проверить пустое пространство в почтовых базах
Код:
Get-MailboxDatabase -Status | FL Name,AvailableNewMailboxSpace

Найдено в просторах интернетов
 
Последнее редактирование модератором:
Интересный скрипт для отчетности Exchange
https://gallery.technet.microsoft.com/exchange/Generate-Exchange-2388e7c9
Предлагаемый скрипт позволяет автоматически создавать отчет для серверов и DAG (database availability groups) в Exchange 2003, 2007, 2010 и 2013, а именно:
• Общее количество серверов на версию и SP Exchange
• Общее количество почтовых ящиков на версию и SP Exchange
• Общее количество Exchange ролей в Вашей ИТ-инфраструктуре
• Разбивка по сайтам для следующих параметров:
o Почтовые ящики на сайте
o Exchange серверы, версия, пакет обновления и его версия, уровень службы, установленные роли, версия ОС и service
• Разбивка по каждой Database Availability Group, включая:
o Наименование каждой DAG, число членов и их список
o Информация о базе данных:
— Имя
— Количество почтовых ящиков на базу данных и их средний размер
— Количество архивных почтовых ящиков на базу данных и их средний размер – показывается только если БД включена в архивные почтовые ящики
— Размер БД и свободное место
— % свободного места в БД и логическом диске
— Время и дата последнего бекапа (новое) – показывается, если хотя бы одна база данных DAG имеет полный бекап
— Состояние циклического ведения журнала (Circular Logging) (новое) — показывается, если хотя бы для одной базы данных DAG включено циклическое ведение журнала
— Сервер, на котором находится активная копия
— Список серверов, на которых находятся активные копии и количество копий
• Разбивка по не-DAG базам данных, включая БД Exchange 2007 и 2003 с информацией о базе данных и имени группы хранения Storage Group (где это применимо).

Образец развернутого отчета


Пример запуска
Код:
.\Get-ExchangeEnvironmentReport  -HTMLReport c:\report.html
 
Узнать размер почтовых баз Exchange
Код:
Get-MailboxDatabase -Status | select-object Name,Server,DatabaseSize,Mounted

Удалить "Плохое письмо" из всех ящиков в БД Exchange
Код:
get-mailbox -OrganizationalUnit Needed_OU -ResultSize unlimited | Search-Mailbox -SearchQuery Subject:'Very bad message' -TargetMailbox mailbox@mailbox.com -TargetFolder Inbox –DeleteContent
Приведенный выше командлет позволяет реализовать поиск по ящикам требуемого аккаунта и убрать нежелательное сообщение. В сценарии ниже для примера задана тема письма, почтовый ящик куда мы складываем «плохое» сообщение и целевая папка.

Запретить юзерам возможность соединения по RPC over HTTPS
Код:
Set-CASMailbox -Identity mailbox@mailbox.com -MAPIBlockOutlookRpcHttp $true

Запретить работать с почтовым ящиком юзеру, настроенному не в режиме кэширования
Код:
Set-CASMailbox -Identity mailbox@mailbox.com -MAPIBlockOutlookNonCachedMode $true

Запретить использовать пользователям версии Outlook старее, чем 2003.
Код:
Get-CASMailbox -Resultsize Unlimited | Set-CASMailbox -MAPIBlockOutlookVersions '-5.9.9;7.0.0-10.9.9'

Получить сводную информацию по почтовым ящикам с заданного аккаунта и экспортировать ее в Excel

Код:
Get-Mailbox -OrganizationalUnit groza -Resultsize unlimited | Get-MailboxStatistics | Sort-Object TotalItemSize -Descending | Select-Object DisplayName,@{Name="TotalItemSize(KB)";Expression={$_.TotalItemSize.Value.ToKB()}},ItemCount,lastlogontime,lastlogofftime,lastloggedonuseraccount | Export-Csv c:\xfer\groza.csv | foreach {$_.length=($_.length)/1024/1024/1024; $_}

Проверка возможности логина в определенную базу
Код:
 Test-MAPIConnectivity -Database DB1

Проверка возможность логина в определенный почтовый ящик
Код:
Test-MAPIConnectivity –Identity username@contoso.ru


Test-ActiveSyncConnectivity — тестирует ActiveSync протокол;
Test-CalendarConnectivity – тестирование доступности календаря;
Test-EcpConnectivity – валидация виртуальной директории ECP на выбранном CAS сервере
Test-ImapConnectivity – проверка статуса сервиса IMAP и возможности клиентского подключения по данному протоколу
Test-OutlookWebServices – проверка корректности информации, выдаваемой пользователю сервисом AutoDiscover
Test-OwaConnectivity – валидация виртуальной директории OWA на указанном CAS сервере
Test-WebServicesConnectivity – проверка Exchange Web Services, которые используются, например, Outlook for Mac, Mac Mail и еще некоторыми клиентами.
 
Последнее редактирование модератором:
Поиск писем в журналах exchange с форматированным выводом FL, запись в файл txt
Код:
Get-MessageTrackingLog -Sender [email]sender@domain1.ru[/email] -Recepients [email]recep@domain2.ru[/email] | select timestamp,messageid,messagesubject | FL > c:\result.txt
 
Список всех имеющихся отключенных ящиков во всех базах организации:
Код:
Get-MailboxDatabase | Get-MailboxStatistics | Where { $_.DisconnectReason -eq "Disabled" } | ft DisplayName,Database,DisconnectDate,MailboxGUID

Поиск в конкретной почтовой БД
Код:
Get-MailboxStatistics –database DBNAME | Where { $_.DisconnectReason -eq "Disabled" } | ft DisplayName,Database,DisconnectDate,MailboxGUID

Удаление почтового ящика по GUID
Код:
Remove-StoreMailbox -Database Msk-DB1  -Identity "6398897d-d12a-4975-8ef0-ebca5b1c635b" -MailboxState Disabled

Удаление всех отключенных почтовых ящиков в организации Exchange
Код:
Get-MailboxDatabase | Get-MailboxStatistics | where {$_.DisconnectReason -eq "Disabled"} | foreach {Remove-StoreMailbox -Database $_.database -Identity $_.mailboxguid -MailboxState SoftDeleted}
 
Посмотреть все встречи и события, существующие в календаре exchange в общих папках организации
Код:
 Get-PublicFolderItemStatistics -identity "\30 Day" | Sort-Object CreationTime | Format-List

или

Код:
 Get-PublicFolderItemStatistics -identity "\30 Day" | Sort-Object CreationTime | Format-List Subject,CreationTime,Start,End


Перенести транспортные логи Exchange и транспортную очередь на другой диск

Set-TransportService $env:computername -MessageRetryInterval '00:01:00' -ConnectivityLogPath "D:\ExchData\HUB\Connectivity" -MessageTrackingLogPath "D:\ExchData\MessageTracking" -ReceiveProtocolLogPath "D:\ExchData\HUB\SmtpReceive" -SendProtocolLogPath "D:\ExchData\HUB\SmtpSend" -MessageTrackingLogMaxDirectorySize 'unlimited' -ReceiveProtocolLogMaxDirectorySize 'unlimited' -SendProtocolLogMaxDirectorySize 'unlimited' -ConnectivityLogMaxDirectorySize 'unlimited' -AgentLogPath "D:\ExchData\Hub\AgentLog" -AgentLogMaxAge "30.00:00:00"-AgentLogMaxDirectorySize 'unlimited' -verbose

Set-FrontendTransportService $env:computername -ConnectivityLogPath "D:\ExchData\FrontEnd\Connectivity" -ConnectivityLogMaxDirectorySize 'unlimited' -ReceiveProtocolLogPath "D:\ExchData\FrontEnd\SmtpReceive" -ReceiveProtocolLogMaxDirectorySize 'unlimited' -SendProtocolLogPath "D:\ExchData\FrontEnd\SmtpSend" -SendProtocolLogMaxDirectorySize 'unlimited' -AgentLogPath "D:\ExchData\FrontEnd\AgentLog" -AgentLogMaxAge "30.00:00:00"-AgentLogMaxDirectorySize 'unlimited'-verbose

& $env:ExchangeInstallPath\Scripts\Move-TransportDatabase.ps1 -queueDatabasePath 'D:\ExchData\Queue' -queueDatabaseLoggingPath 'D:\ExchData\Queue'

Get-TransportConfig | Set-TransportConfig -MaxSendSize 50MB -MaxReceiveSize 50MB
Get-ReceiveConnector | Set-ReceiveConnector -MaxMessageSize 50MB -ProtocolLoggingLevel Verbose

restart-service *Transport* -Verbose
 
Последнее редактирование модератором:
Скрипт создания события в общем календаре Outlook (надо проверить)
Код:
```powershell
<#
Скрипт создания события в общем календаре Outlook

03.11.2016 Сатин Павел
#>

#Следующая фигня перезапускает скрипт в однопоточном режиме. Только для дого, что-бы форме работал AutoComplete
if ([System.Threading.Thread]::CurrentThread.ApartmentState -eq [System.Threading.ApartmentState]::MTA)
{
    powershell.exe -Sta -File $MyInvocation.MyCommand.Path
    return
}



#Определяем путь от куда запущен скрипт
$Global:CurrPath = $MyInvocation.MyCommand.Definition | split-path -parent
#Загружаем переменные из конфигурационного файла
Get-Content "$Global:CurrPath\SBS-ATMEvents.conf" | ForEach-Object { $ExecutionContext.InvokeCommand.InvokeScript($_) }

#Заполняем список УС
$Global:FileListUS = "$Global:CurrPath\$Global:FileListUS"
$Global:ListUS = Get-Content $Global:FileListUS


function NewOutlookEvent {

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")

$objForm = New-Object System.Windows.Forms.Form
$objForm.Text = "Новое событие УС"
$objForm.Size = New-Object System.Drawing.Size(300,240)
$objForm.StartPosition = "CenterScreen"


$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(75,160)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$OKButton.Add_Click({$objForm.Close()})
$objForm.Controls.Add($OKButton)

$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Size(150,160)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Text = "Cancel"
$CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$CancelButton.Add_Click({$objForm.Close()})
$objForm.Controls.Add($CancelButton)

$objLabelStart = New-Object System.Windows.Forms.Label
$objLabelStart.Location = New-Object System.Drawing.Size(10,20)
$objLabelStart.Size = New-Object System.Drawing.Size(280,20)
$objLabelStart.Text = "Дата события:"
$objForm.Controls.Add($objLabelStart)


$datePicker = New-Object Windows.Forms.DateTimePicker
$datePicker.ShowUpDown = $false
#$datePicker.MinDate = $now
#$datePicker.MaxDate = $now.AddMonths(3); #arbitrary
#$datePicker.MaxSelectionCount = 1
$datePicker.Location = New-Object System.Drawing.Size(10,40)
$datePicker.Size = New-Object System.Drawing.Size(260,20)
#$datePicker.Width = 350
$datePicker.Format = "Custom"
$datePicker.CustomFormat = "dd.MM.yyyy HH:mm"
$datePicker.Enabled = $true
$objForm.Controls.Add($datePicker)


$objLabelUS = New-Object System.Windows.Forms.Label
$objLabelUS.Location = New-Object System.Drawing.Size(10,60)
$objLabelUS.Size = New-Object System.Drawing.Size(280,20)
$objLabelUS.Text = "Номер УС:"
$objForm.Controls.Add($objLabelUS)

$objComboBoxUS = New-Object System.Windows.Forms.ComboBox
$objComboBoxUS.Location = New-Object System.Drawing.Size(10,80)
$objComboBoxUS.Size = New-Object System.Drawing.Size(260,20)
#$objComboBoxUS.Height = 80

#Заполняем значения
$Global:ListUS | ForEach-Object {[void] $objComboBoxUS.Items.Add($_)}


$objComboBoxUS.Sorted = $true
$objComboBoxUS.AutoCompleteMode = [System.Windows.Forms.AutoCompleteMode]::SuggestAppend
$objComboBoxUS.AutoCompleteSource = [System.Windows.Forms.AutoCompleteSource]::ListItems
$objForm.Controls.Add($objComboBoxUS)

$objLabelDecr = New-Object System.Windows.Forms.Label
$objLabelDecr.Location = New-Object System.Drawing.Size(10,100)
$objLabelDecr.Size = New-Object System.Drawing.Size(280,20)
$objLabelDecr.Text = "Описание события:"
$objForm.Controls.Add($objLabelDecr)

$objEditBoxDescr = New-Object System.Windows.Forms.TextBox
$objEditBoxDescr.Location = New-Object System.Drawing.Size(10,120)
$objEditBoxDescr.Size = New-Object System.Drawing.Size(260,20)
$objForm.Controls.Add($objEditBoxDescr)


$objForm.Topmost = $True

$objForm.Add_Shown({$objForm.Activate()})
$resultForm = $objForm.ShowDialog()


if ($resultForm -eq [System.Windows.Forms.DialogResult]::OK) {


    $EventSubjectUS = $objComboBoxUS.Text
    $EventSubjectDescr = $objEditBoxDescr.Text

    Add-type -assembly "Microsoft.Office.Interop.Outlook" | out-null

    $outlook = new-object -comobject outlook.application
    $namespace = $outlook.GetNameSpace("MAPI")
    $folder = $namespace.GetFolderFromID($olFolders)

    $olAppointmentItem = 1

    $appt = $folder.Items.Add($olAppointmentItem)
    $appt.Start = $datePicker.Value
    #$appt.Duration = 60
    $appt.Subject = "$EventSubjectUS; $EventSubjectDescr"
    #$appt.Body = "Meet with Scripting Guys to discuss upcoming plans."
    $appt.Location = $aptLocation
    #$appt.ReminderMinutesBeforeStart = 15
    $appt.ReminderSet = $False

    $result = $appt.Save()

}

} #End NewOutlookEvent



NewOutlookEvent

```
 
Скрипт выборки событий из общего календаря Outlook
Код:
```powershell
<#
Скрипт выборки событий из общего календаря Outlook

03.11.2016 Сатин Павел
#>

#Определяем путь от куда запущен скрипт
$Global:CurrPath = $MyInvocation.MyCommand.Definition | split-path -parent
#Загружаем переменные из конфигурационного файла
Get-Content "$Global:CurrPath\SBS-ATMEvents.conf" | ForEach-Object { $ExecutionContext.InvokeCommand.InvokeScript($_) }

#$Global:ReportStart =  [datetime]"11/01/2016"
#$Global:ReportEnd = [datetime]"11/07/2016"


Function FormDateQuery {

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")

$objForm = New-Object System.Windows.Forms.Form
$objForm.Text = "Формирование отчета"
$objForm.Size = New-Object System.Drawing.Size(300,240)
$objForm.StartPosition = "CenterScreen"


$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(75,160)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$OKButton.Add_Click({$objForm.Close()})
$objForm.Controls.Add($OKButton)

$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Size(150,160)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Text = "Cancel"
$CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$CancelButton.Add_Click({$objForm.Close()})
$objForm.Controls.Add($CancelButton)

$objLabelStart = New-Object System.Windows.Forms.Label
$objLabelStart.Location = New-Object System.Drawing.Size(10,20)
$objLabelStart.Size = New-Object System.Drawing.Size(280,20)
$objLabelStart.Text = "Дата события:"
$objForm.Controls.Add($objLabelStart)


$datePicker = New-Object Windows.Forms.DateTimePicker
$datePicker.ShowUpDown = $false
#$datePicker.MinDate = $now
#$datePicker.MaxDate = $now.AddMonths(3); #arbitrary
#$datePicker.MaxSelectionCount = 1
$datePicker.Location = New-Object System.Drawing.Size(10,40)
$datePicker.Size = New-Object System.Drawing.Size(260,20)
#$datePicker.Width = 350
$datePicker.Format = "Custom"
$datePicker.CustomFormat = "dd.MM.yyyy HH:mm"
$datePicker.Enabled = $true
$objForm.Controls.Add($datePicker)

$objLabelEnd = New-Object System.Windows.Forms.Label
$objLabelEnd.Location = New-Object System.Drawing.Size(10,60)
$objLabelEnd.Size = New-Object System.Drawing.Size(280,20)
$objLabelEnd.Text = "Дата события:"
$objForm.Controls.Add($objLabelEnd)


$datePickerEnd = New-Object Windows.Forms.DateTimePicker
$datePickerEnd.ShowUpDown = $false
#$datePickerEnd.MinDate = $now
#$datePickerEnd.MaxDate = $now.AddMonths(3); #arbitrary
#$datePickerEnd.MaxSelectionCount = 1
$datePickerEnd.Location = New-Object System.Drawing.Size(10,80)
$datePickerEnd.Size = New-Object System.Drawing.Size(260,20)
#$datePickerEnd.Width = 350
$datePickerEnd.Format = "Custom"
$datePickerEnd.CustomFormat = "dd.MM.yyyy HH:mm"
$datePickerEnd.Enabled = $true
$objForm.Controls.Add($datePickerEnd)

$objForm.Topmost = $True


$objForm.Add_Shown({$objForm.Activate()})
$resultForm = $objForm.ShowDialog()

    if ($resultForm -eq [System.Windows.Forms.DialogResult]::OK) {
        $Global:ReportStart =  $datePicker.Value
        $Global:ReportEnd = $datePickerEnd.Value
    }

} #End FormDateQuery


Function QueryATMEvents {

Add-type -assembly "Microsoft.Office.Interop.Outlook" | out-null
#$olFolders = "Microsoft.Office.Interop.Outlook.OlDefaultFolders" -as [type]
$outlook = new-object -comobject outlook.application
$namespace = $outlook.GetNameSpace("MAPI")

$folder = $namespace.getFolderFromID($Global:olFolders)

$result = $folder.items | Select-Object -Property Start, End, Subject, Location |
    where-object { $_.start -gt $Global:ReportStart -AND $_.start -lt $Global:ReportEnd } | Sort-object Start

if ($result -ne $null) {

$result | Add-Member -MemberType NoteProperty -Name NumberUS -Value ""
$result | Add-Member -MemberType NoteProperty -Name Description -Value ""

foreach ($reselement in $result) {
    $DescStart = $reselement.Subject.IndexOf(";")
    $DescLen = ($reselement.Subject.Length - $DescStart)
    $NumUS = $reselement.Subject.Substring(0, $DescStart)
    $Descr = ($reselement.Subject.Substring($DescStart + 1, $DescLen - 1)).TrimStart(" ")
    #$reselement.Start = ($reselement.Start).Date
    $reselement.NumberUS = $NumUS
    $reselement.Description = $Descr
}

$result | Select-Object -Property Start, End, Location, NumberUS, Description

} else {

    Write-Host "За указанный период событий не найдено!"

}

} #End QueryATMEvents


########################### Main #######################################

if ($args[0] -ne $Null) {
    $Global:ReportStart =  [datetime]$args[0]

    if ($args[1] -ne $Null) {
        $Global:ReportEnd =  [datetime]$args[1]
    } else {
        $Global:ReportEnd =  Get-Date
    }

} else {
    FormDateQuery
}

$ATMEvents = QueryATMEvents
#Выводим без даты окончания события, так как пока в ней нет необходимости
$ATMEvents | Select-Object -Property Start, Location, NumberUS, Description

```
https://webnote.satin-pl.com/2016/12/15/posh_outlook_events/
 
Посмотреть права на календарь:
Код:
Get-MailboxFolderPermission -identity "username@domen.local:\Календарь"
Дать права на редактирование календаря другому пользователю.
Код:
Add-MailboxFolderPermission -identity "username@domen.local:\Календарь" -user USER22@domen.local -AccessRights Editor
 
Удалить успешно завершенные запросы на перемещение при экспорте PST
Код:
Get-MailboxExportRequest -Status Completed | Remove-MailboxExportRequest
или
Код:
Get-MailboxImportRequest | where {$_.status -eq "Completed"} | Remove-MailboxImportRequest
 
Просмотр и настройка всех виртуальных директорий Exchange Server 2016

Код:
Get-MapiVirtualDirectory | Set-MapiVirtualDirectory -InternalUrl https://mail.domain.ru/mapi -ExternalUrl https://mail.domain.ru/mapi - IISAuthenticationMethods Negotiate

Код:
Get-OutlookAnywhere | Set-OutlookAnywhere -InternalHostname mail.domain.ru -ExternalHostname mail.domain.ru -ExternalClientsRequireSSSL $true -InternalClientsRequireSSL $true -InternalClientAuthenticationMethod negotiate -ExternalClientAuthenticationMethod negotiate

Код:
Get-ActiveSyncVirtualDirectory | Set-ActiveSyncVirtualDirectory -InternalUrl "https://mail.domain.ru/Microsoft-Server-ActiveSync" -ExternalUrl "https://mail.domain.ru/Microsoft-Server-ActiveSync"

Код:
Get-OabVirtualDirectory | Set-OabVirtualDirectory -InternalUrl "https://mail.domain.ru/OAB" -ExternalUrl "https://mail.domain.ru/OAB"
Код:
Get-WebServicesVirtualDirectory | Set-WebServicesVirtualDirectory -InternalUrl "https://mail.domain.ru/EWS/Exchange.asmx" -ExternalUrl "https://mail.domain.ru/EWS/Exchange.asmx"

Код:
Get-OwaVirtualDirectory | SetOwaVirtualDirectory -InternalUrl "https://mail.domain.ru/owa" -ExternalUrl "https://mail.domain.ru/owa"

Код:
Get-ECPVirtualDirectory | Set-ECPVirtualDirectory -InternalUrl "https://mail.domain.ru/ecp" -ExternalUrl "https://mail.domain.ru/ecp"

Настройка службы Autodiscover
Просмотр и изменение AutodiscoverServiceInternalUri
Код:
Get-ClientAccessService | fl name,*URI*
Get-ClientAccessService | Set-ClientAccessService -AutodiscoverServiceInternalUri "https://mail.domain.ru/Autodiscover/Autodiscover.xml"
 
Последнее редактирование:
Перемещение базы данных Exchange
Код:
Move-DatabasePath -Identity "DB-01" -EdbFilePath "F:\Data\DB-01\DB-01.edb" -LogFolderPath "F:\Data\DB-01"

Перекинуть логи на другой диск (exchange 2016)

Connectivity Logs
Set-TransportServer MC-EXCH -ConnectivityLogPath “D:\Exch-Logs\Connectivity”

SMTP Receive Logs
Set-TransportService MC-EXCH -ReceiveProtocolLogPath “D:\Exch-Logs\SMTPReceive”

SMTP FrontEnd Receive Logs
Set-FrontEndTransportService -Identity MC-EXCH -ReceiveProtocolLogPath “D:\Exch-Logs\SMTPFrontEnd”

SMTP Send
Set-TransportService MC-EXCH -SendProtocolLogPath “D:\Exch-Logs\SMTPSend”

Queue
Set-TransportService MC-EXCH -QueueLogPath “D:\Exch-Logs\QueueViewer”

Active User Stats
Set-TransportService MC-EXCH -ActiveUserStatisticsLogPath “D:\Exch-Logs\ActiveUserStats”

Message Tracking
Set-TransportService MC-EXCH -MessagetrackingLogPath “D:\Exch-Logs\MessageTracking”
 
Последнее редактирование модератором:
Полнотекстовый индекс Exchange

Посмотреть
Код:
Get-MailboxDatabaseCopyStatus*

Починить полнотекстовый индекс Exchange
1. Останавливаем службы в services.msc
Код:
Microsoft Exchange Search Host Controller
Microsoft Exchange Search
2. Удаляем папку с полнотектовым индексом из каталога с БД (это папка вида 45234sdfiouvsberg34tfdv)
3. Запускаем службы и ждем (зависит от размера базы - час-два-сутки)
 
Просмотр очереди писем Exchange в shell
Код:
Get-Queue

Подробная информация о письмах в очереди от определенного отправителя:
Get-Message -Filter { FromAddress -like "user@domain.ru" } | Format-List

Cписок отправителей для определенной очереди:
Get-Queue mx\12345 | Get-Message -ResultSize Unlimited | Select FromAddress

Список получателей:
Get-Queue mx\12345 | Get-Message -ResultSize Unlimited -IncludeRecipientInfo | Select Recipients
 
Последнее редактирование модератором:
Массовое создание почтовых ящиков в Exchange (при условии наличия учетки в AD)
Код:
Get-User -OrganizationalUnit Users | Enable-Mailbox
 
Просмотр и установка квот на базу данных Exchange
Код:
Get-MailboxDatabase "DB-TEST 1" | fl *quota*

Код:
Set-MailBoxDatabase "DB-TEST 1" -IssuewarningQuota 4GB -ProhibitSendQuota 5GB -ProhibitSendReceiveQuota 6GB

Установка корзины 2 уровня для базы. Срок восстановления - 30 дней
Код:
Set-MailboxDatabase "DB-TEST 1" -DeletedItemRetention 30.00:00:00
 
Последнее редактирование:
Работа с eseutil
Все работы с утилитой eseutil выполняются только с размонтированной БД

Проверка контрольных сумм базы данных Exchange (CRC)
Код:
eseutil /k "DATABASE"

Проверка целостности БД
Код:
eseutil /g "DATABASE"

Вывод отчета по БД (включая состояние бд clean shutdown , dirty shutdown и тд)
Код:
eseutil /MH "DATABASE"

Перевод из dirty shutdown в clean shutdown
Код:
eseutil /R "тут префикс транзакционных логов из каталога где бд" , например E01
после этого база переводится в состояние clean shutdown

Проверка целостности транзакционных логов Exchange
Код:
eseutil /ML E01
 
Назад
Верх