Снова автоматизация


и на этот раз небольшой рутинной задачки.

Пока вовнеи рассуждают о рыбах почтовых ящиков уволенных сотрудников, такую задачу быстро решили вот так:

Задачу разбиваем на два блока,

Сперва выполняем этот блок.

$umove  = @()
$uclear = @()
$err    = @()
$m      = 2
$body   = New-Object Text.StringBuilder

$org = Get-ADOrganizationalUnit -Filter «Name -eq ‘Disabled Users'» -Properties CanonicalName
$du = Get-User -RecipientTypeDetails UserMailbox | Where {$_.UserAccountControl -match ‘AccountDisabled’}
$dm = $du | Get-Mailbox
$dm | Foreach {
if($_.OrganizationalUnit -ne $org.CanonicalName) {
try {
Move-ADObject -Identity $_.DistinguishedName -TargetPath $org.DistinguishedName
$umove += «`t$($_.DistinguishedName) перенесена в $($org.DistinguishedName)»
}
catch {
$err += «`t$($_.DistinguishedName) не перенесена в $($org.DistinguishedName) — $_»
}
}

$l = New-TimeSpan (Get-MailboxStatistics $_).LastLogonTime.Date $d.AddMonths(-$m).Date
if ($l.Days -eq 1) {
$uclear += «`t$($_.DistinguishedName) будет очищен на следующий день»
}
}

if($umove) {
$body.AppendLine((«Перенесенные:»,$umove | Out-String)) | Out-Null
}

if($err) {
body.AppendLine((«Ошибки:»,$err | Out-String)) | Out-Null
}

if($uclear) {
body.AppendLine((«Для очистки:»,$uclear | Out-String)) | Out-Null
}

$body = $body.ToString()
if($body)
{
Send-MailMessage -From a@contoso.com -To b@contoso.com -Subject «Отчет» -Body $body -SmtpServer smtp.contoso.com
}

 

##############################################Запускать эту часть блока с интервалом для репликации всех изменений.

 

$m = 2
$path = «\\$env:ComputerName\C$\Pst»
$du = Get-User -RecipientTypeDetails UserMailbox | Where {$_.UserAccountControl -match ‘AccountDisabled’}
$dm = $du | Get-Mailbox
$dusers = $dm | Where { (Get-MailboxStatistics $_).LastLogonTime.Date -le (Get-Date).AddMonths(-$m).Date}

foreach($duser in $dusers) {
$mpath = Join-Path $path «$($user.alias).pst»
New-MailboxExportRequest -Mailbox $duser -FilePath $mpath | Out-Null

while(!(Get-MailboxExportRequest -Mailbox $duser -Status Completed))
{
Start-Sleep -Sec 300
}

$req = Get-MailboxExportRequest -Mailbox $duser -Status Completed
if($req) {
$req | Remove-MailboxExportRequest -Confirm:$false
Search-Mailbox -id $duser -DeleteContent -Confirm:$false -Force
}
}

 

Что делаем в рамках задачи?

Сначала ищем отключенные учетки уволенных сотрудников, с условием что отключены они более 2-х месяцев назад, перемещаем такую учетную запись в спец контейнер с уведомлением что она была перенесена, выполняем экспорт в .PST, и перед очисткой ящика отсылаем за день уведомление что ящик будет очищен.

 

msExchMailboxGuid


Он же ExchangeGuid, тот самый атрибут, который нам нужен для соответствия «облачного» и локального Exchange ящика. При создании пользователя на площадке именно его сейчас использует CAS и показывает при подключении ящика к серверу, вместо имени сервера. Если созданный на площадке ящик мигрировать в облако, атрибут сохранится и переедет в облако вместе с ним. И соответственно, обратно проблем не возникнет. А как быть, если пользователь создан в облаке изначально? Тогда атрибута у него не будет, и миграции не получится, пока мы не обеспечим соответствующую привязку. Придется скопировать его из облака, для того,чтобы вернуть ящик на площадку. Попробуем сделать это сперва для одного пользователя, а потом для всех, кому назначена лицензия. Если нужно, отфильтровать пользователя можно и по своему фильтру. Так же хочу обратить внимание на префиксы сессий, которые позволяют работать в одной консоли одновременно и с локальной установкой, и с EXO.

 

$cloudCredential = Get-Credential cloudadmin@razbornov.onmicrosoft.com
$objSession = New-PSSession -ConfigurationName "Microsoft.Exchange" -ConnectionUri "https://outlook.office365.com/powershell-liveid" -Credential $cloudCredential -Authentication "Basic" -AllowRedirection
Import-PSSession $objSession -Prefix Cloud -AllowClobber

$so = New-PSSessionOption
$onpremCredential = Get-Credential  cloud\adm 
$session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://owa.razbornov.ru/powershell -Authentication Basic -Credential $onpremCredential -SessionOption $so
Import-PSSession $session -Prefix OnPrem -AllowClobber

#Get the On-Premises mailbox
$Mailbox = Get-CloudMailbox -Identity akhan@razbornov.ru
#Get the Exchange Online MailUser
$MailUser = Get-OnPremMailUser -Identity akhan@razbornov.ru
#Change the ExchangeGuid to match the on-premises Guid
$MailUser | Set-OnPremMailUser -ExchangeGuid $Mailbox.ExchangeGuid

#Get all Mailboxes with EOA Activated
$Mailboxes = Get-CloudMailbox -Filter {(SKUAssigned -eq "True")}
foreach ($Mailbox in $Mailboxes) {
    $CloudUser = Get-OnPremMailUser -Identity $mailbox.userprincipalname
    if ($CloudUser.ExchangeGuid -ne $mailbox.ExchangeGuid) {
        $Clouduser | Set-OnPremMailUser -ExchangeGuid $mailbox.ExchangeGuid
    }
}


 

OWA SSO


Single Sign On безусловно, хорошая штука, но с Exchange ее применяют очень редко. Почему? Скорее всего, потому, что про нее администраторы и не знают: общаясь с коллегами, несколько раз безуспешно пытался выяснить отличия различных форм аутентификации для виртуальных каталогов Exchange- часто многие путаются в показаниях и представляют себе довольно туманно, зачем нужны те или иные разновидности аутентификации. Все это, конечно, доходчиво описано в библиотеке им. Ленина.

Большинство облачных сценариев использует как дополнительный огромный плюс SSO для пользователей домена при открытии корпоративной страницы почты. Чем локальная инсталляция хуже? Да, собственно, ничем- давайте посмотрим, как включить SSO для пользователей домена, тем более, что этот функционал можно добавить и к другим «тайным» для многих возможностям Exchange, о которых упоминалось ранее. Читать далее

Azure Automation и с чем его едят.


Давайте ознакомимся, как можно задействовать чрезвычайно мощный функционал автоматизированных заданий в Windows Azure.Пре-реквизиты:

1) Нужно пойти и зарегистрировать подписку в Azure, пробная вполне подойдет.

2) Нужна 1 ВМ для тестов.

Итак, если все готово, приступим:

  1. Выбираем в меню слева «Active Directory». Если нет каталога, создайте.

123

Выбираем меню «Пользователи»

1234

Выбираем «Добавить пользователя» и заполняем поля.

13

Добавьте его в со-администраторы, выбрав в меню слева «Настройки» — «Администраторы».

После того, как аккаунт создан, обязательно выполните первый вход под пользователем и смените его пароль.

Выбираем в меню слева «Автоматизация»- «Создать» — «Создание учетной записи автоматизации»

1

2. Заполняем учетные данные для записи автоматизации ,имя произвольное, регион можно оставить по умолчанию, единственно, нужно помнить, что аккаунт автоматизации должен располагаться в том же регионе, где и ВМ.
Читать далее

Просмотр правил в ящике пользователя


Часты ситуации, когда пользователь накостылял тучу правил в своем ящике ,и все взорвалось ПОЧТАНЕХОДИТ. Посмотреть на ящик поможет командлет Get-InboxRule

$users = get-mailbox

ForEach ($user in $users)
{
$rules = Get-InboxRule -Mailbox $user.name
if ($rules.length -gt 0) {
echo «»
echo $user.name
echo «»
$rules | select name, priority, description | fl
echo «»
}
}

Выключаем ВМ в Azure


#Небольшой скрипт для остановки всех VM Azure, экономим финансы :-)
#Получаем все подписки и выключаем все VM
$AzureSubscriptions = Get-AzureSubscription
foreach ($subscription in $AzureSubscriptions)
{
    Write-Host $subscription.SubscriptionName -Foregroundcolor Green

    Select-AzureSubscription -SubscriptionName $subscription.SubscriptionName
     
    foreach ($vm in Get-AzureVM)
    {
        $name = $vm.Name
        $servicename = $vm.ServiceName
    
        If($vm.Status -ne 'StoppedDeallocated')
        {
            # Указать VM, которые не должны выключаться 
            
            Write-Host 'Выключение '  $name  -ForegroundColor green
            Stop-AzureVM -Service $servicename -name $name
            
        }
        # включаем, выключаем, делаем что-нибудь еще...
        # для того, чтобы не подтверждать выключение: Stop-AzureVM -Service $servicename -name $name -Force
    }
}
Как правильно включать/выключать машины
Больше интересных скриптов с планировщиками, заданиями, свистелками в галерее скриптцентра.

Настройка antispam в Exchange 2013


AntiSpam_img1

В новом (пока еще :)) Exchange 2013 администрирование функциями анти спама целиком и полностью, как и грозились, перешло на Powershell. Но это может расстроить только тех администраторов, которые не читают библиотеку технет, и раздел , посвященный борьбе с нежелательной почтой в Exchange  2013. Те администраторы, которые и ранее изучали соответствующие статьи, найдут для себя мало нового, а все их домашние заготовки будут работать точно так же. Итак, представим, что мы только что развернули сервер,  и еще не успели настроить защиту. Приступим, открыв консоль EMS.

& $env:ExchangeInstallPath\Scripts\Install-AntiSpamAgents.ps1

Читать далее