martedì 28 luglio 2020

Exchange Microsoft365 ibrido - Creazione nuovo utente

Nei giorni scorsi mi e' capitato di creare un nuovo utente ed una nuova casella di posta in un ambiente ibrido Exchange/Microsoft365.
Anche se inizialmente sembrava essere andato tutto bene, dopo poco si sono manifestati alcuni problemi.
L'utente nuovo non appariva nella GAL e non riusciva a spedire agli indirizzi on-prem (per fortuna pochi indirizzi).
Analizzando meglio la situazione mi sono reso conto che questo utente esisteva in AD, ma non appariva tra i remote mailbox users in exchange.
Questo rappresentava il nocciolo della questione, ovvero esisteva un utente AD, senza attributi exchange, a cui corrispondeva una casella/utente Office365.
Tutto nasce dal processo che ho seguito per creare l'utente.
In AD ho creato il nuovo utente. Ho sincronizzato AD con AzureAD. Quando e' apparso l'utente anche nella console di amministrazione di Microsoft 365, gli ho assegnato una licenza creando cosi' la mailbox. Ho saltato a pie' pari tutta la parte Exchange on-prem.
Il risultato finale e' stato questo.
La prox volta che creero un nuovo utente, provvedero a crearlo prima on-prem, e quindi ad effettuare un remote-move.
Ma adesso e' necessario sistemare le cose.

Il processo e' abbastanza semplice (basta saperlo!!!). Occorre:
 - recuperare l'ExchangeGUID della casella di posta remota
 - abilitare l'utente AD come mailbox remote user (a seguito di questa operazione l'utente deve apparire nella console di Exchange)
 - associare l'ExchangeGUID al nuovo utente Exchange
 - sincronizzare AD con Azure AD

PASSAGGIO 1
recuperare l'exchange guid della mailbox su Microsoft 365:

get-mailbox -identity p.pippo@disneylanda.it|fl ExchangeGuid

ExchangeGuid : a09ff8fb-26f7-4d81-9425-0c967acfadcd

PASSAGGIO 2
Abilitare l'utente AD come remote mailbox user
Occorre solo abilitare l'utente in Exchange, poiche in AD gia esiste.

Enable-RemoteMailbox p.pippo -RemoteRoutingAddress p.pippo@disneylanda.mail.onmicrosoft.com

A questo punto l'utente deve apparire nell'elnco dei contatti nella GUI di Exchange

PASSAGGIO 3
Associare il corretto ExchangeGUID (recuperato nel passaggio 1) al nuovo utente

Set-RemoteMailbox p.pippo -ExchangeGUID a09ff8fb-26f7-4d81-9425-0c967acfadcd

a09ff8fb-26f7-4d81-9425-0c967acfadcd

PASSAGGIO 4
sincronizzazione AD con AzureAD

Start-ADSyncSyncCycle -PolicyType Delta

adesso potete verificare se funziona la spedizione ad indirizzi on-prem e se l'utente appare nella GAL, quando fate una ricerca.



REFERENCE
https://www.msb365.blog/?p=866

mercoledì 15 luglio 2020

Exchange - cancellazione mailbox database

Nel caso in cui si voglia cancellare un database di posta di Exchange e' necessario spostare tutte le caselle che esso ospita su un altro DB. Soprattutto se il database che volete cancellare e' quello nativo, dovete ricordare di spostare anche le "arbiration mailboxes"
Con il seguente comando e' possibile vedere le caselle di Exchange e su quale DB sono ospitate:
Get-Mailbox |ft name,alias,database

Con il seguente comando, invece, e' possibile vedere le arbitration mailboxes e su quale DB sono ospitate:
Get-Mailbox -arbitration|ft name,alias,database

Con il seguente comando e' possibile spostare le arbitration mailbox su un altro DB
Get-Mailbox -Database "Mailbox Database 1" -arbitration | New-MoveRequest -TargetDatabase "Mailbox Database 2"

Le arbitration mailbox sono tre in Exchange2010 e 5 Exchange 2013/2016. Se cancellate si possono ricreare, ma devono esserci.
Sono usate per vari scopi, come OAB, federazione tra exchange in differenti organizzazioni, moderazione ecc.

Verifica dei database montati
Get-MailboxDatabase -Status | Sort Name | Format-Table Name, Server, Mounted

Smontare il database
Get-MailboxDatabase -Status | Sort Name | Format-Table Name, Server, Mounted
Dismount-Database "Mailbox Database 1" -Confirm:$False

Cancellare il database
Remove-MailboxDatabase "Mailbox Database 1" (da powershell si puo rimuovere il DB senza smontarlo, da GUI bisogna fare i 2 passaggi)



FORMA VELOCE
Spostamento caselle
Get-MailboxDatabase "Mailbox Database 1" |Get-Mailbox |New-MoveRequest -TargetDatabase "Mailbox Database 2" -Confirm:$true
Get-MailboxDatabase "Mailbox Database 1" |Get-Mailbox -Arbitration | New-MoveRequest -TargetDatabase "Mailbox Database 2"
Get-MailboxDatabase "Mailbox Database 1" |Get-Mailbox -Monitoring | New-MoveRequest -TargetDatabase "Mailbox Database 2" (exchange2013 in poi)
MONITORAGGIO SPOSTAMENTO
Get-MoveRequest
Get-MoveRequestStatistic
CANCELLAZIONE
Remove-MailboxDatabase "Mailbox Database 1"


P.S.
se prima di cancellare il DB lo tenete smontato per un po potrebbe essere necessario disabilitare l'indicizzazione verso quel DB. Per farlo e sufficiente usare il seguente comando:

Get-MailboxDatabase -identity "mailbox database" -IndexEnable $false

e riavviare il servizio di ricerca di Exchange.



REFERENCE
https://docs.microsoft.com/en-us/exchange/recreating-arbitration-mailboxes-exchange-2013-help
http://techgenix.com/what-are-arbitration-mailboxes-used/
http://www.thatlazyadmin.com/2191-2/



BACKUP E CANCELLAZIONE EVENTI WINDOWS

Backup e cancellazione eventi di Windows

Alcune volte mi e' capitato di voler pulire gli eventi di Windows, senza pero perderne traccia, in caso di necessita.
In questi casi si puo fare un backup del registro, e quindi svuotarlo.
Siccome i registri degli eventi sono molti, fare l'operazione a mano potrebbe richiedere molto tempo.
Fare l'operazione tramite script, e' invece un'operazione molto veloce e rapida.
Bisogna ricordarsi di eseguire lo script come amministratore

La prima versione esporta i registri degli eventi.
La seconda li esporta e li svuota.
Il path dove esportarli deve essere un percorso valido.
Al nome dei file esportati vengono anteposti la data e l'ora.


VERSIONE SOLO BACKUP

$datetime=((get-date).ToString("yyyyMMdd_HHmmss_"))
Get-winevent  -Listlog  * | select  Logname, Logfilepath | ForEach-Object -Process { 
$name = $datetime + $_.Logname
$safename = $name.Replace("/","-")
wevtutil.exe EPL $name  C:\Users\Owner\Desktop\eventlogs\$safename.evtx
}

VERSIONE BACKUP E CANCELLAZIONE

<#$datetime=((get-date).ToString("yyyyMMdd_HHmmss_"))
Get-winevent  -Listlog  * | select  Logname, Logfilepath | ForEach-Object -Process { 
$name = $_.Logname
$safename = $datetime + $_.Logname
$safename = $safename.Replace("/","-")
#Write-Output $safename
wevtutil.exe EPL $name  C:\temp\Backupevents\$safename.evtx
}#>

$datetime=((get-date).ToString("yyyyMMdd_HHmmss_"))
Get-winevent  -Listlog  * | select  Logname, Logfilepath | ForEach-Object -Process { 
$name = $_.Logname
$safename = $datetime + $_.Logname
$safename = $safename.Replace("/","-")
wevtutil.exe EPL $name  C:\temp\Backupevents\$safename.evtx
wevtutil cl $name
}

REFERENCE
https://stackoverflow.com/questions/1954203/timestamp-on-file-name-using-powershell
https://serverfault.com/questions/843645/need-a-backup-of-entire-event-log-of-windows-servers-using-cmd-or-powershell

Powershell - Visualizzare il contenuto delle variabili

Come visualizzare il contenuto di una variabile in Powershell.

Supponiamo che sia stata definita questa variabile.
E' possibile visualizzarne il contenuto in powershell oppure all'interno dello script in questi due modi (e sicuramente  ne esisteranno anche di altri)

Variabile
$name=((get-date).ToString("yyyyMMdd_HHmmss_"))

Metodo 1
write-output $name

Metodo 2
Get-Variable name

Powershell - commentare le righe

Come commentare le righe in powershell

Per commentare una riga singola

# riga di commento singola

Per commentare piu righe

<#

...
... righe di commento multiple
...
#>

REFERENCE