Я знаю, чего вы не делали прошлым летом


В секретном чате подогнали еще мультиков про PowerShell. Так как там всего 1200 просмотров, то вы деда точно не смотрели, не упускайте возможность поглядеть. Ну и если есть свободное место, то можно и доклад сохранить, в свете последних событий это очень актуально.

Впереди выходные, а значит нам туда дорога.

PS. На случай если кто не знает, кто такой Ashley.

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


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

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

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

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

$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, о которых упоминалось ранее. Continue reading “OWA SSO”

Виртуальные каталоги Exchange


Небольшая функция для смены имен каталогов, крайне полезна при любом количестве серверов.
#
# Author: Scott Jaworski
# Website: jaworskiblog.com
# Version: 1.0
# Description: This script sets internal and external URL’s on the specified Exchange 2013 Client Access Server
# then displays the results of all the urls that have been set.
# How to Use: Copy the text file to a location on the Exchange server. Change the .txt extension to .ps1,
# Open Exchange Management Shell, Browse to the location of the script in EMS, Run .\Set-Exchange2013Vdirs
#

Function Set-Exchange2013Vdirs
{
$ExServer = Read-Host “Please enter the Exchange 2013 Server Name you’d like to set Vdirs ”
$InternalName = Read-Host “Input the internal domain name eg.. IntMail.domain.com ”
$ExternalName = Read-Host “Input the external domain name eg. ExtMail.domain.com ”

Write-Host “Configuring Directories for $ExServer..” -Foregroundcolor Green

Get-WebservicesVirtualDirectory -Server $ExServer | Set-WebservicesVirtualDirectory -InternalURL https://$InternalName/EWS/Exchange.asmx -ExternalURL https://$externalName/EWS/Exchange.asmx
Get-OwaVirtualDirectory -Server $ExServer | Set-OwaVirtualDirectory -InternalURL https://$InternalName/owa -ExternalURL https://$ExternalName/owa
Get-ecpVirtualDirectory -Server $ExServer | Set-ecpVirtualDirectory -InternalURL https://$InternalName/ecp -ExternalURL https://$ExternalName/ecp
Get-ActiveSyncVirtualDirectory -Server $ExServer | Set-ActiveSyncVirtualDirectory -InternalURL https://$InternalName/Microsoft-Server-ActiveSync -ExternalURL https://$ExternalName/Microsoft-Server-ActiveSync
Get-OABVirtualDirectory -Server $ExServer | Set-OABVirtualDirectory -InternalUrl https://$InternalName/OAB -ExternalURL https://$ExternalName/OAB
Set-ClientAccessServer $ExServer -AutodiscoverServiceInternalUri https://$internalName/Autodiscover/Autodiscover.xml
Set-OutlookAnywhere -Identity “$ExServer\Rpc (Default Web Site)” -InternalHostname $internalName -ExternalHostName $ExternalName -InternalClientAuthenticationMethod ntlm -InternalClientsRequireSsl:$True -ExternalClientAuthenticationMethod Basic -ExternalClientsRequireSsl:$True

Write-Host “Vdirs have been set to the following..” -Foregroundcolor Green
Write-Host “$ExServer EWS”
Get-WebservicesVirtualDirectory -Server $ExServer |Fl internalURL,ExternalURL
Write-Host “$ExServer OWA”
Get-OWAVirtualDirectory -Server $ExServer | Fl internalUrl,ExternalURL
Write-Host “$ExServer ECP”
Get-ECPVirtualDirectory -Server $ExServer | Fl InternalURL,ExternalURL
Write-Host “$ExServer ActiveSync”
Get-ActiveSyncVirtualDirectory -Server $ExServer | Fl InternalURL,ExternalURL
Write-Host “$ExServer OAB”
Get-OABVirtualDirectory -Server $ExServer | Fl InternalURL,ExternalURL
Write-Host “$ExServer Internal Autodiscover URL”
Get-ClientAccessServer $ExServer | Fl AutodiscoverServiceInternalUri
Write-Host “$Exserver Outlook Anywhere Settings”
Get-OutlookAnywhere -Identity “$ExServer\rpc (Default Web Site)” |fl internalhostname,internalclientauthenticationmethod,internalclientsrequiressl,externalhostname,externalclientauthenticationmethod,externalclientsrequiressl

Write-Host “The Powershell URL have not been set as part of this script. Set it if you choose” -ForegroundColor Yellow
}
Set-Exchange2013Vdirs

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


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

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

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

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

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

123

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

1234

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

13

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

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

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

1

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

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


Часты ситуации, когда пользователь накостылял тучу правил в своем ящике ,и все взорвалось ПОЧТАНЕХОДИТ. Посмотреть на ящик поможет командлет 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 “”
}
}