Перейти к содержимому

exchange

Как узнать в exchange из Get-MessageTrackingLog емайл адреса ,извлечь емеил адреса из лога и проверить ящики включены и есть или переадресация.

Задача. есть почтовый домен. Надо избавиться от него и перенести адреса на другие почтовые сервера и сделать доверенный домен.
Сначала за 30 дней читаем логи. Распарсиваем их и забираем только event id send и recipients. Потом по ним проверяем есть ли ящик, включена переадресация и включена учетная запись или нет в ад.

# Подключение к Exchange PowerShell
$session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri "http://MXS1.adminbd.ru/PowerShell/" -Authentication Kerberos
Import-PSSession $session


# Задаем период времени (30 дней назад до текущего момента)
$StartDate = (Get-Date).AddDays(-30)
$EndDate = Get-Date

# Получаем логи трекинга сообщений
$Logs = Get-MessageTrackingLog -Start $StartDate -End $EndDate -ResultSize Unlimited | 
    Select-Object 
Читать далее

Как сделать архив почтового ящика exchange 2016 в pst перед удалением уз.

Задача сделать архив почтового ящика и архивов. Создать папку если нету , сделать логирование , проверку что почтовый ящик экспортировался в pst и отправить на api результат.

$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://MXS01.adminbd.ru/PowerShell/ -Authentication Kerberos
Import-PSSession $Session -DisableNameChecking -AllowClobber



# Загрузка необходимых модулей
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn
Import-Module ActiveDirectory

# Очистка памяти
[system.gc]::Collect()

#------ Переменные ------#
#исключение
$ExceptinUsers = 'sd','admins'
#
$OrgUnit      = "OU=Locations,DC=adminbd,DC=ru"
$domain       = "adminbd.ru"
$dt           = (Get-Date).AddDays(-30)
$Filter       = '(Enabled -eq $False) -and (Modified -le $dt)'
$dtstamp      = Get-Date -Format "yyyy-MM-dd-hh-mm-ss"
$dtstamp1     = "23012025_1"
$pattern      = '[/\\:?*<>"|]'
$exppath      = "\\ARC01\arc$\$dtstamp1"

# Создание директории для архивации
if (-not (Test-Path 
Читать далее

Как добавить всем пользователем событие на целый день в календаре exchange 2016 через EWS.

Задача всем пользователям сделать событие в календаре занят на целый день каждую среду в течении года. Сделал скрипт на PowerShell через ews. exchange 2016.

По умолчанию в exchange 2016  есть ews его ставить нет необходимости если скрипт запустить с самого сервера exchange. Путь «C:\Program Files\Microsoft\Exchange Server\V15\Bin\Microsoft.Exchange.WebServices.dll

Если запускать с другого места надо установить ews

Install-Package Exchange.WebServices.Managed.Api

Путь C:\Program Files\PackageManagement\NuGet\Packages\Exchange.WebServices.Managed.Api.2.2.1.2\lib\net35

Добавить прав на exchange от кого будете запускать скрипт

Get-ManagementRoleAssignment -Role ApplicationImpersonation
New-ManagementRoleAssignment –Name:ImpersonationAssignment –Role:ApplicationImpersonation –User:moskvichev@adminbd.ru

Сам скрипт

Add-Type -Path "C:\Program Files\Microsoft\Exchange Server\V15\Bin\Microsoft.Exchange.WebServices.dll"

# Учетные данные администратора
$AdminEmail = "moskvichev@adminbd.ru"
$Password = "pass"
$Creds = New-Object Microsoft.Exchange.WebServices.Data.WebCredentials($AdminEmail, $Password)

# Подключение к 
Читать далее

Как исправить ошибку Database is mandatory on UserMailbox exchange.

После шифрования домена и exchange восстанавливаю рабоспособность

Есть пользователи в ад которые отключены и у них есть почтовые ящики. Надо почистить

Ищем отключённых и с пустой homeMDB и с ящиком

$users = get-aduser -filter {enabled -eq "false" -and homeMDB -notlike "*" -and EmailAddress -like "*@admin.bd*" }  -Properties EmailAddress,homeMDB  

$users | ft 

$temp="CN=test,CN=Databases,CN=Exchange Administrative Group (FYDIBOHF23SPDLT),CN=Administrative Groups,CN=admin ,CN=Microsoft Exchange,CN=Services,CN=Configuration,DC=admin,DC=ru"

foreach ($user in $users){      
    Set-ADUser $user.SamAccountName -replace @{homeMdb=$temp}

Добавляем в атрибут тестовую базу

После Отключаем ящики у уз

foreach($User in $users){
    Disable-Mailbox -Identity $User.SamAccountName -Archive -Confirm:$false 
    Disable-Mailbox -Identity $User.SamAccountName -Confirm:$false       
}

Теперь у нас остались пользователи включённые но с пустым homeMDB

Ищем … Читать далее

Как узнать кто давно не подключался к почтовому ящику в exchange.

Задача вывести кто давно не подключался к почтовому ящику в exchange 2016

Function New-Array {,$args}
$Report = New-Array

$days = "30"

$date_last = (Get-Date).AddDays(-$days) 
$mailboxes = Get-Mailbox  -ResultSize unlimited

foreach($mailbox in $mailboxes) 
{ 
  $mbx_DN = $mailbox.DistinguishedName 
  $email = $mailbox.PrimarySmtpAddress.toString()
  $Stat = Get-MailboxStatistics -Identity $mbx_DN | Where-Object {$_.lastLogonTime -lt $date_last -and $_.LastLogonTime -ne $null }  |`
  Select-Object DisplayName,  @{Name="TotalItemSizeGB"; Expression={[math]::Round(($_.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1GB),0)}},LastLogonTime,DatabaseName,DatabaseProhibitSendReceiveQuota

 if ($Stat){
  $tmp = New-Object System.Object
  $tmp | Add-Member -type NoteProperty -name DisplayName -value $($stat.DisplayName)
  $tmp | Add-Member -type NoteProperty -name Email -value $email
  $tmp | Add-Member -type NoteProperty -name TotalSize_MB -value $($stat.TotalItemSizeGB)
  $tmp | Add-Member -type NoteProperty -name LastLogon 
Читать далее

Как мигрировать почтовый архив exchange в другую базу топ 10 по размеру архивного ящика

Задача переместить самые большие архивные ящики пользователей в другую базу

$resul=Get-Mailbox -ResultSize Unlimited | Where-Object { $_.ArchiveDatabase -like "*ARC03*" } | ForEach-Object {
    $PrimarySmtpAddress=$_.PrimarySmtpAddress
    $alias = $_.Alias
    $ArchiveDatabase=$_.ArchiveDatabase
    $totalItemSize = (Get-MailboxStatistics -Identity $alias -Archive).TotalItemSize
    [PSCustomObject]@{
        Alias = $alias
        TotalItemSize = $totalItemSize
        ArchiveDatabase=$ArchiveDatabase
    }
}
$resul1=$resul |Where-Object  { $_.TotalItemSize -like "*gb*" } | Select-Object  *,@{Name="TotalItemSizeGB"; Expression={[math]::Round(($_.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1GB),0)}}  |`
 Sort-Object TotalItemSizeGB -Descending | select -first 10 

 <#

 $resul1| ForEach-Object {
    $alias = $_.Alias
    New-MoveRequest -Identity $alias -ArchiveOnly -ArchiveTargetDatabase ARC07
}

#>

 

Как вывести список почтовых ящиков с информацией отключены пользователи и есть ли редиректор exchange

Задача сделать список почтовых ящиков с информацией отключена или нет учетная запись и есть ли редирект.

# Подключение к Exchange PowerShell
$session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri "http://<ExchangeServerFQDN>/PowerShell/" -Authentication Kerberos
Import-PSSession $session

# Получение списка ящиков
$mailboxes = Get-Mailbox -ResultSize Unlimited

# Путь к CSV-файлу для вывода
$csvPath = "C:\Path\To\Output.csv"

# Создание пустого массива для хранения данных
$exportData = @()

# Обработка каждого ящика
foreach ($mailbox in $mailboxes) {
    $primarySMTPAddress = $mailbox.PrimarySMTPAddress

    # Получение данных ящика и статуса отключения
    $adUser = Get-ADUser -Filter "ProxyAddresses -like '*$primarySMTPAddress'" -Properties Enabled
    
    if ($adUser) {
        $forwardingAddress = $mailbox.ForwardingAddress
        $forwardingSmtpAddress = ""

        if ($forwardingAddress) {
            
Читать далее

Как сделать скрипт для отключения учетных записей пользователей с просроченными паролями.

Отключение учетных записей пользователей с просроченными паролями (пароль не менялся более 100 дней).

<# .SYNOPSIS
    Отключение учетных записей пользователей с просроченными паролями
.DESCRIPTION
    Отключение учетных записей пользователей с просроченными паролями (пароль не менялся более 100 дней).
#>
#╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗#
$Host.UI.RawUI.WindowTitle = "Отключение учетных записей пользователей с просроченными паролями"
#╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝#
[system.gc]::Collect()
#------ Logging section ------#
$fileLocation = (gi $MyInvocation.InvocationName) | ForEach-Object {
    $fileDirectory = "$($_.DirectoryName)\$($_.BaseName)";
    "$fileDirectory\$($_.BaseName)_$('{0:yyyy-MM-dd}'-f(date))";
    if (!(Test-Path "$fileDirectory")) {
        ni "$fileDirectory" -ItemType "directory" | Out-Null
    }
}
$Domain     = "adminbd.ru.ru"
$Sender     = "helpdesk@adminbd.ru.ru"
$smtpserver = "mail.adminbd.ru.ru"
#------ Variables ------#
Import-Module ActiveDirectory
$tAD = 'pwdLastSet','Name','whenCreated','PasswordNeverExpires','PasswordExpired','SamAccountName','mail','lastLogonTimestamp','DistinguishedName','Description','CanonicalName','extensionAttribute15'
$tAD2 = 'whenCreated','Name','SamAccountName','mail',@{n='pwdLastSet';e={[DateTime]::FromFileTime($_.pwdLastSet)}},'PasswordNeverExpires','PasswordExpired',@{n='lastLogonTimestamp';e={[DateTime]::FromFileTime($_.lastLogonTimestamp)}},'DistinguishedName','Description','CanonicalName','extensionAttribute15'
$OrgUnit = "OU=Locations,DC=adminbd.ru,DC=ru"
$ExceptinOU 
Читать далее

Как сделать автоматическую смену пароля у пользователя exchange и отправка нового пароля на email.

Авто смена пароля пользователей AD OU=External

Скрипт проверяет дату окончания действия пароля пользователе

<# .SYNOPSIS
    Авто смена пароля пользователей AD OU=External
.DESCRIPTION
    Скрипт проверяет дату окончания действия пароля пользователей и меняет его в день окончания. Новый пароль отправляется на почту в поле mail.
#>
#╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗#
$Host.UI.RawUI.WindowTitle = "Авто смена пароля пользователей AD"
#╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝#
 
Import-Module ActiveDirectory
 
#------ Logging section ------#
 
$dp0 = ($MyInvocation.MyCommand.Path | Split-Path -Parent)
$fileLocation = (gi $MyInvocation.InvocationName) | ForEach-Object {
    $fileDirectory = "$($_.DirectoryName)\$($_.BaseName)";
    "$fileDirectory\$($_.BaseName)_$('{0:yyyy-MM-dd}'-f(date))";
    if (!(Test-Path "$fileDirectory")) {
        ni "$fileDirectory" -ItemType "directory" | Out-Null
    }
}
$watch = [System.Diagnostics.Stopwatch]::StartNew()
$watch.Start()
Start-Transcript "${fileLocation}.log" -append
 
#------ Initialization ------#
 
. $dp0\functions\Generate-Password.ps1
Читать далее

Как создать переадресацию с одного ящика на другой в exchange. Переезд в другой домен.

Задача. Есть два домена. Из одного домена люди перешли в другой. Нужно настроить переадресацию писем из одного домена в другой.

Скрипт вытягивает пользователей из домена adminbd1 находит соответствие в adminbd2 и создаёт правило пересылки.

<# .SYNOPSIS
    Создание переадресации писем сотрудников adminbd1 с adminbd2 на adminbd1
.DESCRIPTION
    Скрипт вытягивает пользователей из домена adminbd1 находит соответствие в adminbd2 и создаёт правило пересылки.
#>
#╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗#
$Host.UI.RawUI.WindowTitle = "Создание переадресации писем с adminbd2 на adminbd1"
#╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝#
[system.gc]::Collect()
$ErrorActionPreference="Continue"
#------ Logging section ------#
 
#$dp0 = ($MyInvocation.MyCommand.Path | Split-Path -Parent)
$fileLocation = (gi $MyInvocation.InvocationName) | ForEach-Object {
    $fileDirectory = "$($_.DirectoryName)\$($_.BaseName)";
    "$fileDirectory\$($_.BaseName)_$('{0:yyyy-MM-dd}'-f(date))";
    if (!(Test-Path "$fileDirectory")) {
        ni 
Читать далее
Яндекс.Метрика