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

Как сделать архив почтового ящика 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 -Path $exppath)) {
    New-Item -Path $exppath -ItemType Directory
}

#------ Функции ------#

# Функция для записи логов
function Write-Log {
    param (
        [string]$Message,
        [string]$LogFile = "$exppath\process.log"
    )
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    "$timestamp - $Message" | Out-File -FilePath $LogFile -Append
}

# Функция для проверки статуса экспорта для каждого пользователя
function Wait-ExportCompletion {
    param (
        [string[]]$ExportRequests
    )
    foreach ($request in $ExportRequests) {
        $completed = $false
        while (-not $completed) {
            Start-Sleep -Seconds 10
            $status = (Get-MailboxExportRequest -Name $request ).Status
            
            if ($status -in @("Completed", "CompletedWithWarning")) {
             Get-MailboxExportRequest -Name $request | Remove-MailboxExportRequest -Confirm:$false
             
          
                $completed = $true
                
            } elseif ($status -like "Failed*") {
                Write-Log "Экспорт $request завершился с ошибкой: $status."
                 Get-MailboxExportRequest -Name $request | Remove-MailboxExportRequest -Confirm:$false
                
               # throw "Экспорт $request завершился с ошибкой: $status."
            }
        }
    }
}



#------ Основной процесс ------#
Write-Log "Начало выполнения скрипта."

# Получение списка пользователей
$adminbd = Get-ADUser -Server $domain -SearchBase $OrgUnit -Properties EmailAddress,Modified,Title,City,SamAccountName -Filter $Filter |` # Where-Object { $_.EmailAddress -Like "test@adminbd.ru*" } 
 select -first 20 |     Where-Object {
        !($(foreach ($u in $ExceptinUsers) { $_.SamAccountName -Contains $u }) -contains $True)
    }
    $adminbd| ft 
# Массив для хранения запросов экспорта
$ExportRequests = @()
$Result = @()

# Этап архивации почтовых ящиков
foreach ($user in $adminbd) {
    if ($user.EmailAddress -like "*@adminbd.ru") {
        $Mailbox = Get-Mailbox -Identity $user.EmailAddress -ErrorAction SilentlyContinue
        if ($Mailbox) {
            # Формирование имени файлов архивации
            $PrimaryPST = "$exppath\$($user.City -replace $pattern, '_')-$($user.Title -replace $pattern, '_')-$($user.EmailAddress).pst"
            $ArchivePST = "$exppath\$($user.City -replace $pattern, '_')-$($user.Title -replace $pattern, '_')-$($user.EmailAddress)-Archive.pst"

            # Экспорт основного почтового ящика
            $primaryRequest = New-MailboxExportRequest -Mailbox $user.EmailAddress -BadItemLimit 10  -FilePath $PrimaryPST -Name "$($user.SamAccountName)-Primary" -ErrorAction SilentlyContinue
            if ($primaryRequest) {
                $ExportRequests += $primaryRequest.Name
                Write-Log "Создан запрос экспорта основного ящика: $PrimaryPST."
            } else {
                Write-Log "Ошибка создания запроса экспорта основного ящика для $($user.EmailAddress)."
            }

            # Экспорт архива почтового ящика
            $archiveRequest = New-MailboxExportRequest -Mailbox $user.EmailAddress -BadItemLimit 10  -FilePath $ArchivePST -IsArchive -Name "$($user.SamAccountName)-Archive" -ErrorAction SilentlyContinue
            if ($archiveRequest) {
                $ExportRequests += $archiveRequest.Name
                Write-Log "Создан запрос экспорта архива: $ArchivePST."
            } else {
                Write-Log "Ошибка создания запроса экспорта архива для $($user.EmailAddress)."
            }
        }
    }
}

# Ожидание завершения всех запросов экспорта для каждого пользователя
Write-Log "Ожидание завершения всех запросов экспорта."
Wait-ExportCompletion -ExportRequests $ExportRequests
Write-Log "Экспорт всех ящиков завершен."

# Удаление пользователей и логирование
foreach ($user in $adminbd) {
    $detailed = [ordered]@{
        DT       = $dtstamp
        Name     = $user.Name
        Login    = $user.UserPrincipalName
        Email    = $user.EmailAddress
        ModDT    = $user.Modified
        Title    = $user.Title -replace $pattern, '_'
        City     = $user.City -replace $pattern, '_'
        Error    = ""
        Status   = ""
    }

    if ($user.EmailAddress -like "*@adminbd.ru") {
        # Удаление почтового ящика
        try {
            Remove-Mailbox -Identity $user.EmailAddress -Permanent $true -Confirm:$false
            $detailed.Status = "Mailbox removed"
            Write-Log "Почтовый ящик $($user.EmailAddress) успешно удален."


             # Отправка информации на внешний сервис
            $data = @{"login" = $user.UserPrincipalName}
            $headers = @{"accept" = '*/*'}
            $StatusUrl = (Invoke-WebRequest -Method 'Post' -Uri 'https://er.adminbd.ru/User/Delete' -Headers $headers -Body ($data | ConvertTo-Json) -ContentType "application/json")
            $detailed.StatusUrlCode = $StatusUrl.StatusCode

            $detailed.Description = '$user.EmailAddress'
            $detailed.DELETE = 'DELETE'

        } catch {
            $detailed.Error = $_.Exception.Message
            Write-Log "Ошибка удаления почтового ящика $($user.EmailAddress): $($detailed.Error)."
        }
    } else {
        # Удаление AD-пользователя
        try {
            # Сессия для удаления пользователя
            # Remove-PSSession $Sessionadminbd
            Remove-ADUser -Identity $user.sAMAccountName -Confirm:$false
            $detailed.Status = "AD user removed"
                        Write-Log "Пользователь $($user.SamAccountName) успешно удален."

            # Отправка информации на внешний сервис
            $data = @{"login" = $user.UserPrincipalName}
            $headers = @{"accept" = '*/*'}
            $StatusUrl = (Invoke-WebRequest -Method 'Post' -Uri 'https://er.adminbd.ru/User/Delete' -Headers $headers -Body ($data | ConvertTo-Json) -ContentType "application/json")
            $detailed.StatusUrlCode = $StatusUrl.StatusCode

            $detailed.Description = 'Is not mail'
            $detailed.DELETE = 'DELETE'


        } catch {
            $detailed.Error = $_.Exception.Message
            Write-Log "Ошибка удаления пользователя $($user.SamAccountName): $($detailed.Error)."
        }
    }

    $Result += New-Object PSObject -Property $detailed
}

# Сохранение результата в CSV
$Result | Export-Csv -Path "$exppath\Results.csv" -Append -NoTypeInformation -Force -Encoding UTF8 -Delimiter ";"
Write-Log "Результаты сохранены в файл Results.csv."

Write-Log "Скрипт завершен."

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

 

Улучшено логирование

# Установка сессии для Exchange
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://MXS0.adminbd.ru/PowerShell/ -Authentication Kerberos
Import-PSSession $Session -DisableNameChecking -AllowClobber

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

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

#------ Переменные ------#
$ExceptinUsers = 'Ivan.Kumakshev','Elena.Balasanyan','Maksim.Assonov','Olga.Pankratova','Konstantin.Verolskiy','aleksey.potapushkin','pavel.mukhametchin','Ruslan.Kuznetsov','Ivan.Tatarchenkov','Natalya.Krasheninina','sd','admins.duty'
$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     = "28012025_1"
$pattern      = '[/\\:?*<>"|]'
$exppath      = "\\ARC01\arc$\$dtstamp1"

# Создание директории для архивации
if (-not (Test-Path -Path $exppath)) {
    New-Item -Path $exppath -ItemType Directory
}

#------ Функции ------#

# Функция для записи логов
function Write-Log {
    param (
        [string]$Message,
        [string]$LogFile = "$exppath\process.log"
    )
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    "$timestamp - $Message" | Out-File -FilePath $LogFile -Append
}

# Функция для проверки статуса экспорта для каждого пользователя
function Wait-ExportCompletion {
    param (
        [string[]]$ExportRequests 
    )
    foreach ($request in $ExportRequests) {
        Write-Log "Начало проверки статуса экспорта для запроса: $request."
        $completed = $false
        $startTime = Get-Date
        $attemptCount = 0

        while (-not $completed) {
            $attemptCount++
            $currentTime = Get-Date
            $elapsedTime = ($currentTime - $startTime).TotalSeconds

            # Получение статуса запроса экспорта
            $status = (Get-MailboxExportRequest -Name $request).Status
            Write-Log "Проверка статуса запроса $request. Попытка №$attemptCount. Прошло времени: $elapsedTime сек. Текущий статус: $status."

            if ($status -in @("Completed", "CompletedWithWarning")) {
                Write-Log "Экспорт $request успешно завершен со статусом: $status."
                Get-MailboxExportRequest -Name $request | Remove-MailboxExportRequest -Confirm:$false
                Write-Log "Запрос экспорта $request удален."
                $completed = $true
            } elseif ($status -like "Failed*") {
                Write-Log "Экспорт $request завершился с ошибкой: $status."
                Get-MailboxExportRequest -Name $request | Remove-MailboxExportRequest -Confirm:$false
                Write-Log "Запрос экспорта $request удален после ошибки."
                $completed = $true
            } else {
                Write-Log "Экспорт $request еще не завершен. Текущий статус: $status. Ожидание следующей проверки..."
                Start-Sleep -Seconds 60
            }
        }
    }
}

#------ Основной процесс ------#
Write-Log "Начало выполнения скрипта."

# Получение списка пользователей
$adminbd = Get-ADUser -Server $domain -SearchBase $OrgUnit -Properties EmailAddress,Modified,Title,City,SamAccountName -Filter $Filter |`
    Select-Object -First 20 | Where-Object {
        !($(foreach ($u in $ExceptinUsers) { $_.SamAccountName -Contains $u }) -contains $True)
    }
$adminbd | Format-Table

# Массив для хранения запросов экспорта
$ExportRequests = @()
$Result = @()

# Этап архивации почтовых ящиков
foreach ($user in $adminbd) {
    if ($user.EmailAddress -like "*@adminbd.ru" -or $user.EmailAddress -like "*@logicall.ru") {
        $Mailbox = Get-Mailbox -Identity $user.EmailAddress -ErrorAction SilentlyContinue
        if ($Mailbox) {
            # Формирование имени файлов архивации
            $PrimaryPST = "$exppath\$($user.City -replace $pattern, '_')-$($user.Title -replace $pattern, '_')-$($user.EmailAddress).pst"
            $ArchivePST = "$exppath\$($user.City -replace $pattern, '_')-$($user.Title -replace $pattern, '_')-$($user.EmailAddress)-Archive.pst"

            # Экспорт основного почтового ящика
            $primaryRequest = New-MailboxExportRequest -Mailbox $user.EmailAddress -BadItemLimit 10 -FilePath $PrimaryPST -Name "$($user.SamAccountName)-Primary" -ErrorAction SilentlyContinue
            if ($primaryRequest) {
                $ExportRequests += $primaryRequest.Name
                Write-Log "Создан запрос экспорта основного ящика: $PrimaryPST."
            } else {
                Write-Log "Ошибка создания запроса экспорта основного ящика для $($user.EmailAddress)."
            }

            # Экспорт архива почтового ящика
            $archiveRequest = New-MailboxExportRequest -Mailbox $user.EmailAddress -BadItemLimit 10 -FilePath $ArchivePST -IsArchive -Name "$($user.SamAccountName)-Archive" -ErrorAction SilentlyContinue
            if ($archiveRequest) {
                $ExportRequests += $archiveRequest.Name
                Write-Log "Создан запрос экспорта архива: $ArchivePST."
            } else {
                Write-Log "Ошибка создания запроса экспорта архива для $($user.EmailAddress)."
            }
        }
    }
}

# Ожидание завершения всех запросов экспорта для каждого пользователя
Write-Log "Ожидание завершения всех запросов экспорта."
Wait-ExportCompletion -ExportRequests $ExportRequests
Write-Log "Экспорт всех ящиков завершен."

# Удаление пользователей и логирование
foreach ($user in $adminbd) {
    $detailed = [ordered]@{
        DT       = $dtstamp
        Name     = $user.Name
        Login    = $user.UserPrincipalName
        Email    = $user.EmailAddress
        ModDT    = $user.Modified
        Title    = $user.Title -replace $pattern, '_'
        City     = $user.City -replace $pattern, '_'
        Error    = ""
        Status   = ""
    }

    if ($user.EmailAddress -like "*@adminbd.ru" -or $user.EmailAddress -like "*@logicall.ru") {
        # Удаление почтового ящика
        try {
            Remove-Mailbox -Identity $user.EmailAddress -Permanent $true -Confirm:$false
            $detailed.Status = "Mailbox removed"
            Write-Log "Почтовый ящик $($user.EmailAddress) успешно удален."

            # Отправка информации на внешний сервис
            $data = @{"login" = $user.UserPrincipalName}
            $headers = @{"accept" = '*/*'}
            $StatusUrl = (Invoke-WebRequest -Method 'Post' -Uri 'https://er.adminbd.ru/User/Delete' -Headers $headers -Body ($data | ConvertTo-Json) -ContentType "application/json")
            $detailed.StatusUrlCode = $StatusUrl.StatusCode

            $detailed.Description = '$user.EmailAddress'
            $detailed.DELETE = 'DELETE'
        } catch {
            $detailed.Error = $_.Exception.Message
            Write-Log "Ошибка удаления почтового ящика $($user.EmailAddress): $($detailed.Error)."
        }
    } elseif ($user.EmailAddress -notlike "*@adminbd.ru" -or $user.EmailAddress -notlike "*@logicall.ru") {
        # Удаление AD-пользователя
        try {
            Remove-ADUser -Identity $user.sAMAccountName -Confirm:$false
            $detailed.Status = "AD user removed"
            Write-Log "Пользователь $($user.SamAccountName) успешно удален."

            # Отправка информации на внешний сервис
            $data = @{"login" = $user.UserPrincipalName}
            $headers = @{"accept" = '*/*'}
            $StatusUrl = (Invoke-WebRequest -Method 'Post' -Uri 'https://er.adminbd.ru/User/Delete' -Headers $headers -Body ($data | ConvertTo-Json) -ContentType "application/json")
            $detailed.StatusUrlCode = $StatusUrl.StatusCode

            $detailed.Description = 'Is not mail'
            $detailed.DELETE = 'DELETE'
        } catch {
            $detailed.Error = $_.Exception.Message
            Write-Log "Ошибка удаления пользователя $($user.SamAccountName): $($detailed.Error)."
        }
    }

    $Result += New-Object PSObject -Property $detailed
}

# Сохранение результата в CSV
$Result | Export-Csv -Path "$exppath\Results.csv" -Append -NoTypeInformation -Force -Encoding UTF8 -Delimiter ";"
Write-Log "Результаты сохранены в файл Results.csv."

Write-Log "Скрипт завершен."

 

Similar Posts:

Метки:

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Яндекс.Метрика