Comments 13
Вот этот кусок сильно смущает. Как сотрудник может зайти в почту, если его учетка disabled? Или проблема в репликации AD?
Но если с другого утройства он зайдет на веб-морду почтовика, то под своими, уже заблокированными учетными данными, он все равно сможет в почту войти.
Вроде как отправлять почту он не сможет, но всю переписку может прибить или скопировать что-то важное.
С архивной почтой это тоже работает.
Get-MobileDevice -mailbox $disableduser.mail | Remove-MobileDevice
(можно даже сделать clear-mobiledevice, если политикой требуется), в этом случае все сессии activesync будут разорваны, и устройство, попытавшись получить доступ под сохраненными учетными данными, получит ошибку account disabled и не сможет ничего получить, тем более удалить из ящика. Но если реально после репликации AD заход с логином/паролем на owa даст пользователю доступ — это глюк.Но там кэш всего на 15 минут, вроде это ни для кого не было критичным. Если время менять, то OWA может начать притормаживать.
Поэтому мы предпочли ручками отключать эту mailbox.
Может быть всю вашу задумку я не буду использовать, но частично обязательно реализую!
set-casmailbox -owaenabled $false -activesyncenabled $false -popenabled $false -imapenabled $false -mapienabled $false -owafordevicesenabled $false
Так же если используете линк, то обязательно делать disable юзеру, потому что даже если его заблочить, сменить пароль, еще с неделю он сможет использовать линк.
get-csuser %username% | disable-csuser
Процедурных вопросов касаться не буду, хотя там есть странности (например, зачем вообще оставлять окно между откючением учетки и удалением ящика, если уж вы так боитесь, что злобный вредитель зайдет в свою почту).
Чисто по самому скрипту:
Отдел кадров в профиле сотрудника выставляет ему статус «Уволен» и скрипт начинает работать.
… работать, и еще раз работать, перелопачивая ВСЕ (!) отключенные учетки вместо того, чтобы работать только с теми, для которых выставлена галка.
Проверяем, есть ли уже папка Год.Месяц, если нет, то создаем.
Зачем вы вообще делаете эту проверку, если в дальнейшем всё равно нет никакой обработки ошибок? А вот не создался у вас путь по какой-то причине, что будет? Если вы только создаете файл — это ещё не так страшно. А если бы удаляли, да по маске?
Ждем, пока скрипт закончит работу. Ждать нужно обязательно, т.к. дальше мы переводим ящики в статус Disable и хотим быть уверены, что перед этим выгрузка почты закончилась.
А как вы можете быть в этом уверены, если вы даже статус задачи не проверяете по её окончании? А если там не Completed, а Failed?
Get-MailboxExportRequest -Status Completed | Remove-MailboxExportRequest -Confirm:$false
Снова тот же косяк, что в самом начале — не ограничивается область действия, удаляются ВСЕ запросы с подобным статусом, а не только созданные самим скриптом на предыдущих этапах.
В своей фирме мы прицепили эту обработку к кастомной кнопке в 1С.
А вы как-то учитывали, что у скрипта время исполнения, мягко говоря, ненулевое? Продумывали, что будет, если несколько инстансов скрипта окажутся запущены параллельно?
В общем, тут принцип примерно тот же, что и бэкапами — либо на чужом опыте учитесь обрабатывать ошибки и ограничивать область действия скриптов, либо в один прекрасный момент на горьком своём. :) Хотя, конечно, есть везучие люди, которым и бэкапы ни разу в жизни не понадобились, и все команды в скриптах всегда отрабатывают штатно...
Не могу не добавить, что до 24 часов у сотрудника скорее всего будет доступ в почту через OWA/ActiveSync.
Чтобы этого избежать — нужно делать reload APP пулов в IIS CAS Exchange.
То есть вот откуда эта засада по доступности OWA после блокирования учетной записи… Надо учесть, потому что такая реализация на IIS это бред редкостный и дыра в безопасности. Но помимо сброса всех IIS'ов обойти эту дыру можно, оторвав OWA и ActiveSync:
set-mailbox $user -activesyncenabled:$false -owaenabled:$false
Источник. Если посмотрите, в ветке выше эта проблема была заявлена.
#region Get setting from config
$myDir = Split-Path -Parent $MyInvocation.MyCommand.Path
#$myDir = "$pwd\"
If (!(Test-Path $MyDir\Settings.xml)) {write-host 'Setting file ' $MyDir\Settings.xml ' not found..' -ForegroundColor Red ; exit}
[xml]$ConfigFile = Get-Content "$MyDir\Settings.xml"
if ($ConfigFile -eq $null) {write-host 'Setting file ' $MyDir\Settings.xml ' has error...' -ForegroundColor Red ; exit}
$global:Path2Export = $ConfigFile.Settings.Path2Export
$global:SecondsToSleep = $ConfigFile.Settings.SecondsToSleep
$global:ExportGroupName = $ConfigFile.Settings.ExportGroupName
$global:ExchangeServer = $ConfigFile.Settings.ExchangeServer
#endregion
Пример XML
<?xml version="1.0"?>
<Settings>
<Path2Export>\\FileServer.contoso.com\BackupPst$\</Path2Export>
<ExportGroupName>ExportDisableUser2PST</ExportGroupName>
<SecondsToSleep>30</SecondsToSleep>
<ExchangeServer>ExchangeServer.contoso.com</ExchangeServer>
</Settings>
На расшаренную папку необходимо предоставить права группе «Exchange Trusted Subsystem»
You need to grant the following permission to the group Exchange Trusted Subsystem to the network share where you want to export or import PST files:
* To import PST files from the share: Read permission
* To save exported PST files to the share: Read/Write permission.
Рисует два прогресс бара для ящика и архивного ящика, если он есть.
Очереди называются по маске с именем пользователя, поэтому всегда можно увидеть кто выгружается и кто завершился с ошибкой…
$NameParamQueuedMailbox=@{Name="$ExportGroupName-$ADUser"}
$NameParamQueuedArchiving=@{Name="$ExportGroupName-$ADUser-archiving"}
#....
$isarchiving=Get-Mailbox -Identity $ADUser|select archivedatabase|% {if ($_.archivedatabase -eq $null) {$false} else {$true}}
#...
#region Waiting status and show progress
do {
#region Mailbox progressbar
$StatusExport = get-MailboxExportRequest @NameParamQueuedMailbox | select -ExpandProperty Status
$MailboxPercent=get-MailboxExportRequest @NameParamQueuedMailbox | Get-MailboxExportRequestStatistics|select -ExpandProperty PercentComplete
Write-Progress -id 1 -Activity "Export $ADUser Mailbox" -status "Status $StatusExport complite $MailboxPercent percent" -percentComplete $MailboxPercent
#endregion
#region Archiving mailbox progressbar
if ($isarchiving) {
$StatusExportArchiving = get-MailboxExportRequest @NameParamQueuedArchiving| select -ExpandProperty Status
$archivingPercent=get-MailboxExportRequest @NameParamQueuedArchiving| Get-MailboxExportRequestStatistics|select -ExpandProperty PercentComplete
Write-Progress -Id 2 -ParentId 1 -Activity "Export $ADUser Archiving mailbox" -status "Status $StatusExportArchiving complite $archivingPercent percent" -percentComplete $archivingPercent
} else {$StatusExportArchiving = 'Completed' }
#endregion
if ($StatusExport -eq 'Failed') {$StatusExport = 'Completed'}
if ($StatusExportArchiving -eq 'Failed' ) {$StatusExportArchiving = 'Completed'}
if (($StatusExportArchiving -eq 'Completed') -and ($StatusExport -eq 'Completed')) {$ExitWhile=$true} else {$ExitWhile=$false}
#Start-Sleep -s $SecondsToSleep #
} while ($ExitWhile -ne $true)
#endregion
Дальше обязательная проверка на валидность окончания выгрузки, что бы случайно не удалить ящик пользователя у которого выгрузка завершилась с ошибкой и очистка выполненных очередей.
<# :
@echo off
if '%1' == '' echo Please run %0 scrip with param - Username or email&&echo.&&echo %0 DisableUser&&exit
set curentpath=%~dp0
cd /d %curentpath:~0,-1%
powershell /nologo /noprofile /command ^
"&{[ScriptBlock]::Create((cat """%~f0""") -join [Char[]]10).Invoke(@(&{$args}%*))}"
exit /b
#>
#Ниже вставляем PowerShell Script
#$myDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$myDir = "$pwd\"
....
Подчищаем хвосты за Microsoft Exchange Server 2016 используя Powershell