Задача сделать архив почтового ящика и архивов. Создать папку если нету , сделать логирование , проверку что почтовый ящик экспортировался в 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 $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:
- Как сделать скрипт для архивировании почты exchange перед удаление учетной записи.
- Как создать учётные записи с помощью powershell в AD из csv
- Как создать контакты в exchange из другого домена.
- Как массово создать учётные записи в АД из csv файла
- Как создать переадресацию с одного ящика на другой в exchange. Переезд в другой домен.