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


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

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

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

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

$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, о которых упоминалось ранее. Читать далее

Виртуальные каталоги 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. Заполняем учетные данные для записи автоматизации ,имя произвольное, регион можно оставить по умолчанию, единственно, нужно помнить, что аккаунт автоматизации должен располагаться в том же регионе, где и ВМ.
Читать далее

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


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

Автоматически добавляем почтовый ящик и sip адрес для пользователей


emie

Вот такой вот простой скрипт, запускающийся по расписанию раз, скажем в полчаса,  поможет на пути к автоматизации процесса создания учетных записей на предприятии. 🙂

Скрипт смотрит в определенную «Prestaged» OU, из которой забирает пользователей, и добавляет их в пул на Lync сервере, не забывая добавить им почтовый ящик на Exchange. Модифицируйте, как нравится- определенный пул, определенная база и т.д. Пользователи в целевом организационном подразделении могут создаваться совершенно разными путями, переносом, созданием, миграцией и т.п., после выполнения действий скрипт отсылает уведомление:

 

#Ipmo EXCHANGE
$SessionOWA = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://exchangeserver/PowerShell/ -Authentication Kerberos
Import-PSSession $SessionOWA
#Ipmo Lync
$lyncOptions = New-PSSessionOption -SkipRevocationCheck -SkipCACheck -SkipCNCheck
$lync = New-PSSession -ConnectionUri https://lync01/ocspowershell `
-SessionOption $lyncOptions `
-Authentication NegotiateWithImplicitCredential
Import-PSSession $lync
# определяем Lync pool сервер.
$LyncPool = «lync01»
# Контейнер с пользователями, откуда мы будем забирать объекты
$Ous = «OU=Prestaged,OU=Users and Contacts,DC=mydomen,DC=ru»
# SMTP server.
$smtpServer=»smtp.mydomen.ru»
$OUUsers = $null
$enabledUsers = $null

ipmo ac*
#Включаем ящики пользователям.

$users =  Get-ADUser -LDAPFilter «(!(mail=*))» -resultSetSize $null  -searchBase $Ous
foreach($user in $users)
{
Enable-Mailbox -Identity $user.SamAccountName -Database MDB02   -ErrorAction SilentlyContinue
}
# Подождем репликации атрибутов
Start-Sleep 30
# Получим список всех пользователей с электронным адресом, не заблокированных в Аctive directory и не имеющих sip адреса
$OUUsers = $OUs | Foreach {Get-CsAdUser -Filter {Enabled -ne $True} -OU $_ | Where-Object {$_.UserAccountControl -notlike «*AccountDisabled*»} | Where-Object {$_.WindowsEmailAddress -ne «»} | Where-Object {$_.SIPAddress -eq «»} };
if ($OUUsers -ne $null) {
$OUUsers | Foreach-Object {
Enable-CsUser -Identity $_.UserPrincipalName -RegistrarPool $LyncPool -SipAddressType EmailAddress
$EnabledUsers += $_.Name
$EnabledUsers += «, »
}

# send an email to notify HD
#Конвертируем кодировку в utf8
$enc = New-Object System.Text.utf8encoding
$subject= «Users enabled for Lync,EXCHANGE»
$body= @»
<p>Dear HelpDesk,</p>
The following user(s) have been enabled for Lync and Exchange</p>
</p>
<b>$EnabledUsers</b></p>
</p>

If you have any questions, you can contact the UC Team.</p>
(Tel: 2117 / Mail: helpdesk@domen.ru)</p>
</p>
Kind regards,</p>
UC team</p>
«@
Send-Mailmessage -smtpServer $smtpServer -Encoding $enc -from «LyncTeam@domen.ru» -to «helpdesk@domen.ru» -subject $subject -body $body -BodyAsHtml

}