EN

Guida operativa

Exchange ServerManuale operativo

Subscription Edition · 2019 · 2016
8 parti · 50 sezioni · 51 blocchi comando
Revisione luglio 2026
/ per cercare

Come usare questa guida

Questa guida traduce la documentazione ufficiale Microsoft di Exchange Server (Subscription Edition, 2019 e 2016) in procedure operative pronte all'uso. Non sostituisce la documentazione: la rende utilizzabile da chi è appena entrato in reparto e deve lavorare senza fare danni.

Ogni sezione è marcata con il livello minimo di autonomia richiesto. Il livello non indica quanto sei bravo, ma quanto costa un errore su quell'attività.

LivelloChiCosa può fare da soloCosa deve escalare
L1Helpdesk / primo livelloOperazioni su singoli oggetti reversibili: creare cassette, gruppi, permessi, quote, reset di accessi client, lettura di log e code.Qualsiasi modifica a server, database, connettori, certificati, DAG.
L2Sysadmin junior / secondo livelloDiagnosi flusso di posta, gestione code, connettori di ricezione, criteri ActiveSync, spostamenti cassette, manutenzione ordinaria pianificata.Modifiche allo schema AD, aggiornamenti CU, switchover non pianificati, ripristini da backup.
L3Senior / riferimentoTutto il resto: aggiornamenti, DAG, disaster recovery, certificati, architettura.Verso Microsoft Support o il fornitore.

All'inizio di ogni procedura trovi l'etichetta del livello. Se stai leggendo una procedura di livello superiore al tuo, leggila pure: serve a capire cosa succede quando escali. Ma non eseguirla.

#Convenzioni tipografiche

  • Il testo in carattere monospaziato è un comando, un nome di cmdlet, un percorso o un valore da digitare esattamente così.
  • I blocchi grigi con barra laterale sono comandi PowerShell da incollare in Exchange Management Shell.
  • I segnaposto sono scritti fra parentesi angolari: <NomeUtente>, <NomeServer>. Vanno sostituiti, parentesi comprese.
  • I riquadri colorati segnalano note, avvertenze e divieti. Le avvertenze rosse indicano operazioni con perdita di dati potenziale.

Le dieci regole d'oro

Se ricordi solo una pagina di questa guida, ricorda questa.

1. Leggi prima di scrivere

Ogni cmdlet Get- è sicuro e non modifica nulla. Ogni cmdlet Set-, New-, Remove-, Enable-, Disable-, Move- modifica. Prima di eseguire un comando che modifica, esegui il Get- corrispondente sullo stesso oggetto e guarda com'è adesso.

2. Usa -WhatIf

Quasi tutti i cmdlet che modificano accettano -WhatIf: mostrano cosa farebbero senza farlo. Su comandi che colpiscono più oggetti (filtri, pipe, cicli) -WhatIf non è un'opzione, è un obbligo.

Set-Mailbox -Identity m.rossi -ProhibitSendQuota 5GB -WhatIf

3. Diffida della pipe

Get-Mailbox | Set-Mailbox ... senza filtro tocca ogni cassetta dell'organizzazione. È il modo più rapido di fare un incidente in questa piattaforma. Filtra sempre, verifica il conteggio, poi esegui.

# 1) quante cassette colpirei?
(Get-Mailbox -ResultSize Unlimited -Filter "Department -eq 'Vendite'").Count

# 2) simulazione
Get-Mailbox -ResultSize Unlimited -Filter "Department -eq 'Vendite'" | Set-Mailbox -IssueWarningQuota 4GB -WhatIf

4. Un'operazione, un ticket

Nessuna modifica in produzione senza un ticket che la giustifichi. Annota nel ticket il comando esatto che hai eseguito, non una descrizione a parole. Serve a te fra tre mesi, quando qualcuno chiederà perché quella cassetta ha quel permesso.

5. Disabilitare non è eliminare

In Exchange le due parole hanno significati tecnici precisi e diversi. Disabilitare stacca la cassetta dall'utente AD e la conserva per il periodo di conservazione. Eliminare rimuove utente e cassetta. Se ti chiedono di "cancellare la casella di un dimesso", nel 99% dei casi la risposta corretta è disabilitare o convertire in condivisa.

6. Le quote non sono opinioni

Prima di alzare una quota a un utente, verifica lo spazio libero sul volume del database. Un database che riempie il disco manda offline tutte le cassette che contiene, non solo quella dell'utente che ha chiesto l'aumento.

7. Non toccare i connettori per sistemare un singolo messaggio

I connettori di ricezione e invio sono infrastruttura condivisa. Un problema che riguarda un mittente o un dominio si risolve quasi sempre a livello di regola, di destinatario o di reputazione, non modificando un connettore.

8. Prima di ogni manutenzione su un membro DAG, modalità manutenzione

Riavviare un server Exchange che ospita database attivi senza metterlo in modalità manutenzione significa interrompere gli utenti e rischiare attivazioni "lossy". La procedura è a pagina dedicata in questa guida ed è composta da comandi da eseguire nell'ordine indicato.

9. Guarda lo spazio disco e i log delle transazioni

La causa numero uno degli incidenti gravi su Exchange non è un attacco: è un volume pieno di log delle transazioni perché il backup non gira più. Verifica lo spazio ogni giorno.

10. Se non sai, escala. Subito.

Escalare in dieci minuti costa un'ora del tempo di un collega. Provare a indovinare per due ore su un database può costare una giornata di lavoro a tutta l'azienda. Non c'è nessuna vergogna nel primo caso e nessuna scusa nel secondo.

Parte 1 — Fondamenti

L1L1 — lettura obbligatoria per tutti

#1.1 Che cos'è Exchange Server, in pratica

Exchange Server è il sistema che riceve, smista, archivia e consegna la posta aziendale, insieme a calendari, contatti e attività. Tre componenti da tenere a mente:

  • Il database delle cassette postali: un file su disco (estensione .edb) che contiene fisicamente la posta degli utenti, accompagnato dai log delle transazioni. Un server ne ospita di solito più di uno.
  • Il trasporto: la parte che accetta i messaggi, li valuta, li instrada e li consegna. Quando "la posta non arriva", il problema è quasi sempre qui.
  • I servizi di accesso client: la porta d'ingresso di Outlook, del telefono e del browser. Quando "Outlook non si connette" ma la posta scorre, il problema è quasi sempre qui.

Dal 2016 in poi questi componenti convivono nello stesso ruolo, chiamato server Cassette postali. Esiste un secondo ruolo opzionale, il Trasporto Edge, che si installa in DMZ senza appartenere al dominio e fa da filtro perimetrale verso Internet.

#1.2 Gli strumenti di lavoro

StrumentoCome si apreA cosa serveLimite
EAC — Interfaccia di amministrazione di ExchangeBrowser, indirizzo https://<server>/ecpIl 90% delle attività quotidiane su destinatari, permessi, code, certificati.Non espone tutti i parametri; alcune operazioni esistono solo in PowerShell.
EMS — Exchange Management ShellMenu Start, sul server o su una postazione con gli strumenti di gestioneTutto. È PowerShell con i cmdlet Exchange precaricati.Nessuna rete di protezione: quello che scrivi viene eseguito.
Casella degli strumenti di ExchangeMenu Start sul serverContiene il Visualizzatore code e gli strumenti di flusso di posta.Solo sul server.
Visualizzatore codeDalla Casella degli strumentiVedere e sbloccare le code di trasporto con interfaccia grafica.Mostra un server alla volta.

#1.3 Anatomia di un comando

I cmdlet Exchange seguono sempre la struttura Verbo-Sostantivo, seguita da parametri. Imparata la struttura, il resto si deduce.

Set-Mailbox -Identity m.rossi -ProhibitSendQuota 5GB
  ^     ^         ^                 ^
  |     |         |                 valore
  |     |         parametro obbligatorio: quale oggetto
  |     su che tipo di oggetto agisco
  cosa faccio
VerboSignificatoPericolosità
Get-Legge e mostraNessuna. Usalo liberamente.
Set-Modifica un oggetto esistenteMedia. Sovrascrive il valore precedente.
New-Crea un oggettoBassa, ma crea disordine se sbagliato.
Enable- / Disable-Attiva o disattiva una funzioneMedia.
Add- / Remove-Aggiunge o toglie un elemento da un insiemeMedia/alta a seconda dell'oggetto.
Remove-Elimina un oggettoAlta. Spesso irreversibile.
Move-Sposta (cassette, database attivi)Alta: ha impatto sugli utenti mentre avviene.
Test-Esegue una diagnosticaNessuna.

I tre modificatori che devi conoscere

  • -WhatIf — simula, non esegue. Da usare sempre la prima volta.
  • -Confirm:$false — sopprime la richiesta di conferma. Non usarlo finché non sei certo del comando: la richiesta di conferma è lì apposta.
  • -ResultSize Unlimited — rimuove il limite predefinito di 1.000 risultati nelle letture. Senza questo, un Get-Mailbox su un'organizzazione grande ti mostra solo una parte e tu non te ne accorgi.

Rendere leggibile l'output

# solo le proprietà che ti servono, in tabella
Get-Mailbox m.rossi | Format-Table Name,PrimarySmtpAddress,Database -Auto

# tutte le proprietà di un oggetto, in elenco verticale
Get-Mailbox m.rossi | Format-List *

# esportare per allegare al ticket
Get-Mailbox -ResultSize Unlimited | Export-Csv C:\Temp\cassette.csv -NoTypeInformation -Encoding UTF8

#1.4 I comandi di sola lettura da sapere a memoria

Questi si possono eseguire in qualsiasi momento, anche in piena emergenza, senza chiedere permesso a nessuno.

ComandoRisponde alla domanda
Get-Mailbox <utente> | flQuesta cassetta esiste? Dove sta? Com'è configurata?
Get-MailboxStatistics <utente>Quanto è grande? Quando ci si è collegato l'ultima volta?
Get-CasMailbox <utente>Quali protocolli client sono attivi su questa cassetta?
Get-MailboxPermission <utente>Chi può aprire questa cassetta?
Get-ADPermission <utente>Chi può inviare come questa cassetta?
Get-QueueCi sono messaggi fermi su questo server?
Get-QueueDigest -Dag <DAG>Ci sono messaggi fermi su tutti i server?
Get-MessageTrackingLogChe fine ha fatto questo messaggio?
Get-ExchangeServerQuali server ci sono, che versione, che ruoli?
Get-MailboxDatabaseCopyStatus *Le copie dei database sono sane?
Get-ServerHealth <server>Il server si considera in salute?
Test-ServiceHealthTutti i servizi Exchange richiesti sono avviati?

Parte 2 — Cassette postali, gruppi e permessi

L1L1 — è il 70% del lavoro quotidiano

#2.1 I tipi di destinatario

Prima di creare qualcosa, scegli il tipo giusto. Cambiarlo dopo è possibile ma laborioso, e nel frattempo gli utenti si sono già configurati intorno all'oggetto sbagliato.

TipoQuando si usaHa un account AD attivo?
Cassetta utenteUna persona.Sì, con licenza e password.
Cassetta condivisaUn indirizzo funzionale usato da più persone: info@, assistenza@, amministrazione@.L'account esiste ma è disabilitato: si accede per delega.
Cassetta salaUna sala riunioni prenotabile dal calendario.Account disabilitato.
Cassetta attrezzaturaUna risorsa prenotabile non-stanza: proiettore, auto aziendale.Account disabilitato.
Gruppo di distribuzioneUn indirizzo che inoltra a un elenco di destinatari.No, è un gruppo.
Gruppo di sicurezza abilitato alla postaCome sopra, ma serve anche ad assegnare permessi.No, è un gruppo.
Gruppo di distribuzione dinamicoL'elenco dei membri è calcolato al volo da una query (es. tutti quelli di un reparto).No.
Contatto di postaUna persona esterna che deve comparire in rubrica.No.
Utente di postaUna persona con account interno ma casella esterna (consulente, collaboratore).Sì, ma senza cassetta locale.

#2.2 Creare una cassetta postale utente

L1L1

Da EAC

  1. Destinatari > Cassette postali > Nuova cassetta postale utente.
  2. Scegli se creare un nuovo utente AD o abilitare un utente esistente. Nella maggior parte delle aziende l'utente AD viene creato prima dal processo di onboarding: in quel caso scegli utente esistente.
  3. Compila alias e indirizzo primario secondo lo standard aziendale di nomenclatura. Se non lo conosci a memoria, chiedi: rinominare dopo lascia strascichi.
  4. Salva e verifica.

Da EMS

# abilitare la cassetta su un utente AD che esiste già (caso più comune)
Enable-Mailbox -Identity "m.rossi" -Database "DB01"

# creare utente AD + cassetta in un colpo solo
New-Mailbox -Name "Mario Rossi" -Alias m.rossi -UserPrincipalName [email protected] `
  -FirstName Mario -LastName Rossi -Database "DB01" `
  -Password (ConvertTo-SecureString -String "<PasswordIniziale>" -AsPlainText -Force) `
  -ResetPasswordOnNextLogon $true

Verifica

Get-Mailbox m.rossi | Format-List Name,Alias,PrimarySmtpAddress,EmailAddresses,Database,RecipientTypeDetails

#2.3 Indirizzi e alias

L1L1

Una cassetta ha un indirizzo primario (quello che compare come mittente) e un numero qualsiasi di indirizzi secondari, tutti riceventi. In EmailAddresses il primario è scritto con SMTP: maiuscolo, i secondari con smtp: minuscolo.

# aggiungere un alias senza toccare gli altri indirizzi
Set-Mailbox m.rossi -EmailAddresses @{Add="[email protected]"}

# rimuovere un alias
Set-Mailbox m.rossi -EmailAddresses @{Remove="[email protected]"}

# cambiare l'indirizzo primario mantenendo il vecchio come secondario
Set-Mailbox m.rossi -EmailAddresses @{Add="[email protected]"}
Set-Mailbox m.rossi -PrimarySmtpAddress "[email protected]" -EmailAddressPolicyEnabled $false

#2.4 Quote di archiviazione

L1L2L1 per la lettura, L1/L2 per la modifica secondo policy interna

Le quote hanno tre soglie progressive.

SogliaParametroEffetto per l'utente
AvvisoIssueWarningQuotaRiceve una notifica. Continua a lavorare normalmente.
Blocco invioProhibitSendQuotaNon può più inviare. Continua a ricevere.
Blocco totaleProhibitSendReceiveQuotaNon può inviare né ricevere. I mittenti ricevono un NDR.

Le quote possono essere ereditate dal database o personalizzate per singola cassetta. Per personalizzarle bisogna disattivare esplicitamente l'ereditarietà.

# leggere la situazione attuale
Get-MailboxStatistics m.rossi | Format-List DisplayName,TotalItemSize,ItemCount,LastLogonTime
Get-Mailbox m.rossi | Format-List UseDatabaseQuotaDefaults,IssueWarningQuota,ProhibitSendQuota,ProhibitSendReceiveQuota

# impostare quote personalizzate
Set-Mailbox -Identity m.rossi -UseDatabaseQuotaDefaults $false `
  -IssueWarningQuota 9GB -ProhibitSendQuota 9.5GB -ProhibitSendReceiveQuota 10GB

# tornare ai valori del database
Set-Mailbox -Identity m.rossi -UseDatabaseQuotaDefaults $true

#2.5 Inoltro della posta

L1L1

Caso tipico: una persona è assente o ha lasciato l'azienda e la posta va deviata a un collega.

# inoltro a un destinatario interno, senza conservare copia
Set-Mailbox m.rossi -ForwardingAddress g.bianchi -DeliverToMailboxAndForward $false

# inoltro conservando la copia nella cassetta originale
Set-Mailbox m.rossi -ForwardingAddress g.bianchi -DeliverToMailboxAndForward $true

# inoltro verso un indirizzo esterno (richiede un contatto o SmtpAddress)
Set-Mailbox m.rossi -ForwardingSmtpAddress "[email protected]" -DeliverToMailboxAndForward $true

# rimuovere l'inoltro
Set-Mailbox m.rossi -ForwardingAddress $null -ForwardingSmtpAddress $null

#2.6 Restrizioni di recapito e limiti di dimensione

L1L1

# consentire la ricezione solo da mittenti interni autenticati
Set-Mailbox comunicazioni -RequireSenderAuthenticationEnabled $true

# limitare chi può scrivere a una cassetta o a un gruppo
Set-DistributionGroup "Tutti i dipendenti" -AcceptMessagesOnlyFromSendersOrMembers "Direzione"

# limiti di dimensione per singola cassetta
Set-Mailbox m.rossi -MaxSendSize 35MB -MaxReceiveSize 35MB

#2.7 Permessi: le tre deleghe

L1L1 — la richiesta più frequente in assoluto

Esistono tre permessi distinti e vengono continuamente confusi, anche da chi li richiede. Chiarisci sempre cosa serve prima di assegnarli.

PermessoCosa consenteCosa NON consente
Accesso completo (Full Access)Aprire la cassetta, leggere, creare, spostare ed eliminare elementi.Inviare messaggi dalla cassetta.
Invia come (Send As)Inviare messaggi che risultano provenienti dalla cassetta. Il destinatario non vede traccia del delegato.Leggere il contenuto della cassetta.
Invia per conto di (Send on Behalf)Inviare messaggi con mittente "Delegato per conto di Cassetta". Le risposte tornano alla cassetta.Leggere il contenuto della cassetta.

Accesso completo

Add-MailboxPermission -Identity "Assistenza Clienti" -User m.rossi `
  -AccessRights FullAccess -InheritanceType All

# senza aprire automaticamente la cassetta nel profilo Outlook del delegato
Add-MailboxPermission -Identity "Assistenza Clienti" -User m.rossi `
  -AccessRights FullAccess -InheritanceType All -AutoMapping $false

# rimuovere
Remove-MailboxPermission -Identity "Assistenza Clienti" -User m.rossi `
  -AccessRights FullAccess -InheritanceType All

# verificare
Get-MailboxPermission "Assistenza Clienti" | Where {$_.AccessRights -like "Full*"} |
  Format-Table -Auto User,Deny,IsInherited,AccessRights

Invia come

Add-ADPermission -Identity "Assistenza Clienti" -User m.rossi -ExtendedRights "Send As"

# rimuovere
Remove-ADPermission -Identity "Assistenza Clienti" -User m.rossi -ExtendedRights "Send As"

# verificare
Get-ADPermission -Identity "Assistenza Clienti" | Where {$_.ExtendedRights -like "Send*"} |
  Format-Table -Auto User,Deny,ExtendedRights

Invia per conto di

# sostituisce l'elenco dei delegati
Set-Mailbox "Assistenza Clienti" -GrantSendOnBehalfTo m.rossi

# aggiunge senza toccare gli altri
Set-Mailbox "Assistenza Clienti" -GrantSendOnBehalfTo @{Add="[email protected]"}

# rimuove uno solo
Set-Mailbox "Assistenza Clienti" -GrantSendOnBehalfTo @{Remove="[email protected]"}

# vale anche sui gruppi
Set-DistributionGroup "Ufficio Stampa" -GrantSendOnBehalfTo s.verdi

#2.8 Cassette condivise

L1L1

# creare
New-Mailbox -Shared -Name "Assistenza Clienti" -Alias assistenza `
  -PrimarySmtpAddress [email protected]

# dare accesso a un gruppo
Add-MailboxPermission -Identity assistenza -User "GRP-Assistenza" `
  -AccessRights FullAccess -InheritanceType All
Add-ADPermission -Identity "Assistenza Clienti" -User "GRP-Assistenza" -ExtendedRights "Send As"

# convertire una cassetta utente in condivisa (tipico per chi lascia l'azienda)
Set-Mailbox m.rossi -Type Shared

#2.9 Sale riunioni e attrezzature

L1L1

New-Mailbox -Room -Name "Sala Consiglio" -Alias sala.consiglio
New-Mailbox -Equipment -Name "Proiettore 1" -Alias proiettore1

# prenotazione automatica senza approvazione umana
Set-CalendarProcessing "Sala Consiglio" -AutomateProcessing AutoAccept `
  -AllowConflicts $false -BookingWindowInDays 180 -MaximumDurationInMinutes 480 `
  -AddOrganizerToSubject $true -DeleteComments $false

# prenotazione con approvazione di un delegato
Set-CalendarProcessing "Sala Consiglio" -AutomateProcessing AutoAccept `
  -AllBookInPolicy $false -AllRequestInPolicy $true -ResourceDelegates "s.verdi"

# capienza e posizione, utili nel selettore sale di Outlook
Set-Mailbox "Sala Consiglio" -ResourceCapacity 12
Set-Place "Sala Consiglio" -Building "Sede centrale" -Floor 2 -Capacity 12

#2.10 Gruppi

L1L1

# gruppo di distribuzione classico
New-DistributionGroup -Name "Ufficio Acquisti" -Alias acquisti `
  -PrimarySmtpAddress [email protected] -Type Distribution `
  -OrganizationalUnit "contoso.it/Gruppi"

# gruppo di sicurezza abilitato alla posta (serve anche per i permessi)
New-DistributionGroup -Name "GRP-Assistenza" -Type Security -Alias grp-assistenza

# gestione membri
Add-DistributionGroupMember -Identity acquisti -Member m.rossi
Remove-DistributionGroupMember -Identity acquisti -Member g.bianchi
Get-DistributionGroupMember acquisti | Format-Table Name,PrimarySmtpAddress -Auto

# nascondere dalla rubrica
Set-DistributionGroup acquisti -HiddenFromAddressListsEnabled $true

# consentire la scrittura solo a mittenti interni autenticati
Set-DistributionGroup "Tutti i dipendenti" -RequireSenderAuthenticationEnabled $true

Gruppi dinamici

I membri non sono elencati: vengono calcolati a ogni invio da una query sugli attributi. Utile per liste che seguono l'organigramma, pericoloso se gli attributi AD non sono tenuti puliti.

New-DynamicDistributionGroup -Name "Tutti - Sede Roma" -Alias tutti.roma `
  -RecipientFilter "(RecipientTypeDetails -eq 'UserMailbox') -and (Office -eq 'Roma')"

# VERIFICARE SEMPRE chi ci finisce dentro, prima di comunicarlo
$g = Get-DynamicDistributionGroup "Tutti - Sede Roma"
Get-Recipient -RecipientPreviewFilter $g.RecipientFilter | Format-Table Name,Office -Auto

#2.11 Recupero: elementi eliminati e cassette disconnesse

L1L2L1 per il recupero elementi, L2 per la riconnessione cassette

L'utente ha cancellato una mail e ha svuotato anche la posta eliminata

Non è perduta. Finisce nella cartella Elementi ripristinabili, invisibile all'utente ma accessibile per il periodo di conservazione configurato (predefinito: 14 giorni, spesso portato a 30).

  1. Prima soluzione, senza intervento admin: in Outlook, cartella Posta eliminata, "Recupera elementi eliminati dal server". Nel 90% dei casi basta questo e non serve un ticket.
  2. Se non basta, verifica la finestra di conservazione: Get-Mailbox m.rossi | fl RetainDeletedItemsFor,SingleItemRecoveryEnabled
  3. Se serve un recupero mirato, escala a L2: la ricerca e il ripristino da Elementi ripristinabili richiedono permessi di individuazione e vanno tracciati.
# allungare la finestra di conservazione (in genere si fa a livello di database)
Set-Mailbox m.rossi -RetainDeletedItemsFor 30.00:00:00

# proteggere dagli svuotamenti definitivi
Set-Mailbox m.rossi -SingleItemRecoveryEnabled $true

Cassette disconnesse

Quando una cassetta viene disabilitata o eliminata, resta nel database in stato disconnesso per il periodo di conservazione (predefinito 30 giorni). Entro quel termine è recuperabile.

# trovare le cassette disconnesse su un database
Get-MailboxStatistics -Database DB01 | Where {$_.DisconnectReason -ne $null} |
  Format-Table DisplayName,DisconnectReason,DisconnectDate,MailboxGuid -Auto

# riconnettere a un utente AD
Connect-Mailbox -Identity "<MailboxGuid>" -Database DB01 -User "contoso\m.rossi"

#2.12 Disabilitare, eliminare, convertire

L1L1 con autorizzazione — leggere con attenzione

OperazioneComandoCosa succedeReversibile?
Convertire in condivisaSet-Mailbox <x> -Type SharedLa posta resta, l'accesso passa ai delegati.Sì.
DisabilitareDisable-Mailbox <x>La cassetta si stacca dall'utente AD e diventa disconnessa. L'utente AD resta.Sì, entro il periodo di conservazione.
EliminareRemove-Mailbox <x>Rimuove cassetta e account AD.Solo entro il periodo di conservazione, con difficoltà.
Eliminare definitivamenteRemove-Mailbox <x> -Permanent $trueDistrugge i dati subito.No. Mai.

#2.13 Spostare una cassetta fra database

L2L2

# avviare lo spostamento
New-MoveRequest -Identity m.rossi -TargetDatabase DB02 -BadItemLimit 10

# monitorare
Get-MoveRequest | Get-MoveRequestStatistics |
  Format-Table DisplayName,Status,PercentComplete,BytesTransferred -Auto

# ripulire le richieste completate (obbligatorio: restano lì per sempre)
Get-MoveRequest -MoveStatus Completed | Remove-MoveRequest

#2.14 Import ed export PST

L2L2 — richiede permessi dedicati

I cmdlet di import/export non sono disponibili di default nemmeno agli amministratori dell'organizzazione: il ruolo va assegnato esplicitamente, per un motivo preciso. Chi può esportare cassette in PST può esportare la posta di chiunque.

# assegnare il ruolo (operazione L3, una tantum)
New-ManagementRoleAssignment -Role "Mailbox Import Export" -User "<amministratore>"

# esportare
New-MailboxExportRequest -Mailbox m.rossi -FilePath "\\SRV-FILE\PSTExport\m.rossi.pst"

# esportare solo un intervallo di date
New-MailboxExportRequest -Mailbox m.rossi `
  -ContentFilter {(Received -ge "01/01/2025") -and (Received -lt "01/01/2026")} `
  -FilePath "\\SRV-FILE\PSTExport\m.rossi-2025.pst"

# importare
New-MailboxImportRequest -Mailbox m.rossi -FilePath "\\SRV-FILE\PSTImport\archivio.pst" `
  -TargetRootFolder "Archivio importato"

# monitorare e ripulire
Get-MailboxExportRequest | Get-MailboxExportRequestStatistics | ft DisplayName,Status,PercentComplete
Get-MailboxExportRequest -Status Completed | Remove-MailboxExportRequest

Parte 3 — Client, dispositivi mobili, OWA

L1L2L1 per la diagnosi e le operazioni su singola cassetta, L2 per le impostazioni server

#3.1 Come si collega un client, in breve

Capire questa sequenza risolve da sola metà dei ticket "Outlook non si connette".

  1. Outlook cerca la configurazione tramite Individuazione automatica (Autodiscover): interroga il dominio SMTP dell'utente, cercando record e URL noti.
  2. Autodiscover risponde con gli URL dei servizi: cassetta, disponibilità, rubrica offline, ecc.
  3. Outlook si collega tramite MAPI su HTTP, il protocollo predefinito dalle versioni recenti (in passato era Outlook Anywhere / RPC su HTTP).
  4. L'autenticazione avviene secondo quanto configurato sulle directory virtuali (Windows integrata, di base, o moderna via ADFS in SE).

Quindi: se Outlook non si connette ma OWA funziona, il problema è quasi sempre in Autodiscover, nel certificato o nel profilo locale. Se non funziona neanche OWA, il problema è più a monte: servizi, directory virtuali, database o rete.

#3.2 Attivare e disattivare i protocolli per una cassetta

L1L1

Tutti i protocolli client si governano con lo stesso cmdlet, Set-CasMailbox.

# fotografia della situazione
Get-CasMailbox m.rossi | Format-List Name,OWAEnabled,ActiveSyncEnabled,MAPIEnabled,PopEnabled,ImapEnabled,EwsEnabled

# disattivare
Set-CasMailbox m.rossi -ActiveSyncEnabled $false
Set-CasMailbox m.rossi -OWAEnabled $false
Set-CasMailbox m.rossi -PopEnabled $false -ImapEnabled $false

# riattivare
Set-CasMailbox m.rossi -ActiveSyncEnabled $true

# elenco di chi ha ancora POP/IMAP attivi (utile in verifica sicurezza)
Get-CasMailbox -ResultSize Unlimited | Where {$_.PopEnabled -or $_.ImapEnabled} |
  Format-Table Name,PopEnabled,ImapEnabled -Auto

#3.3 Outlook sul web (OWA)

L1L2L1/L2

# stato delle directory virtuali OWA
Get-OwaVirtualDirectory | Format-List Server,Name,InternalUrl,ExternalUrl,*Authentication*

# criteri cassetta postale OWA: cosa può fare l'utente da browser
Get-OwaMailboxPolicy | Format-List Name,*Enabled | Out-Host -Paging

# assegnare un criterio a una cassetta
Set-CasMailbox m.rossi -OwaMailboxPolicy "Default"

#3.4 Dispositivi mobili e ActiveSync

L1L1

Vedere cosa ha in mano un utente

Get-MobileDevice -Mailbox m.rossi | Format-Table FriendlyName,DeviceModel,DeviceOS,DeviceId,FirstSyncTime -Auto

Get-MobileDeviceStatistics -Mailbox m.rossi |
  Format-Table DeviceFriendlyName,DeviceModel,LastSuccessSync,Status,DevicePolicyApplied -Auto

Criteri cassetta postale per dispositivi mobili

Impongono requisiti di sicurezza al dispositivo: PIN, cifratura, blocco automatico, possibilità di cancellazione remota.

Get-MobileDeviceMailboxPolicy | Format-List Name,PasswordEnabled,MinPasswordLength,MaxInactivityTimeLock,AllowSimplePassword,RequireDeviceEncryption

Set-CasMailbox m.rossi -ActiveSyncMailboxPolicy "Aziendale"

Regole di accesso dei dispositivi

Determinano se un modello o una famiglia di dispositivi viene ammesso, bloccato o messo in quarantena in attesa di approvazione.

Get-ActiveSyncDeviceAccessRule | Format-Table Characteristic,QueryString,AccessLevel -Auto

# consentire esplicitamente una famiglia di dispositivi
New-ActiveSyncDeviceAccessRule -Characteristic DeviceModel -QueryString "iPhone" -AccessLevel Allow

# comportamento predefinito per i dispositivi non classificati
Get-ActiveSyncOrganizationSettings | Format-List DefaultAccessLevel,AdminMailRecipients

Cancellazione remota (wipe)

L1L1 solo su autorizzazione esplicita e documentata

# 1) identificare con precisione il dispositivo
Get-MobileDevice -Mailbox m.rossi | Format-Table FriendlyName,DeviceModel,DeviceId,DeviceOS -Auto

# 2) cancellazione dei soli dati aziendali (opzione da preferire sempre)
Clear-MobileDevice -Identity "<Identity del dispositivo>" -AccountOnly `
  -NotificationEmailAddresses "[email protected]"

# 3) cancellazione completa del dispositivo (solo device aziendale)
Clear-MobileDevice -Identity "<Identity del dispositivo>" `
  -NotificationEmailAddresses "[email protected]"

# rimuovere la partnership dopo il wipe
Remove-MobileDevice -Identity "<Identity del dispositivo>"

#3.5 POP3 e IMAP4

L2L2

Protocolli storici, ancora usati da stampanti multifunzione, gestionali e apparati che devono leggere o inviare posta. Sono anche una superficie di attacco: quasi sempre usano autenticazione di base, cioè credenziali in chiaro sul canale se TLS non è imposto.

# stato dei servizi (sono disattivati per impostazione predefinita)
Get-Service MSExchangePOP3,MSExchangePOP3BE,MSExchangeIMAP4,MSExchangeIMAP4BE

# configurazione
Get-PopSettings | Format-List Server,LoginType,UnencryptedOrTLSBindings,SSLBindings,X509CertificateName
Get-ImapSettings | Format-List Server,LoginType,UnencryptedOrTLSBindings,SSLBindings,X509CertificateName

# imporre TLS
Set-ImapSettings -LoginType SecureLogin
Set-PopSettings -LoginType SecureLogin

#3.6 Albero diagnostico: "il client non funziona"

L1L1 — da seguire nell'ordine

DomandaSe SÌSe NO
Il problema riguarda un solo utente?Vai al passo 2.Salta al passo 6: è un problema di servizio, non di utente. Escala.
2. OWA funziona per quell'utente (https://<server>/owa)?Il backend è sano: problema di client o profilo. Passo 3.La cassetta o il servizio hanno un problema. Passo 5.
3. Funziona da un altro PC o in modalità provvisoria di Outlook?Problema locale: profilo, cache OST, componente aggiuntivo. Ricrea il profilo.Passo 4.
4. Get-CasMailbox <utente> mostra il protocollo abilitato?Verifica Autodiscover e certificato: Test-OutlookWebServices -Identity <utente>Riabilita il protocollo e riprova.
5. La cassetta risponde? (Test-MapiConnectivity -Identity <utente>)Verifica quote e stato cassetta.Il database può essere smontato o in failover. Escala a L2/L3.
6. I servizi sono su? (Test-ServiceHealth)Verifica code, certificati e directory virtuali. Escala.Avvia i servizi mancanti se autorizzato, altrimenti escala subito.
# i tre test diagnostici da tenere sottomano
Test-ServiceHealth
Test-MapiConnectivity -Identity m.rossi
Test-OutlookWebServices -Identity m.rossi | Format-List Source,ServiceEndpoint,Scenario,Result,Error

Parte 4 — Flusso di posta e risoluzione dei problemi

L2L1L2 — con alcune diagnosi in sola lettura accessibili a L1

#4.1 La pipeline di trasporto in una pagina

Ogni messaggio attraversa sempre le stesse fasi. Sapere in quale fase si è fermato è la diagnosi.

  1. Ingresso. Il messaggio entra da un connettore di ricezione (da Internet, da un client autenticato, da un apparato interno) oppure viene depositato da una cassetta locale.
  2. Invio alla classificazione. Finisce nella coda Invio, dove il classificatore prende in carico il lavoro.
  3. Risoluzione dei destinatari. Exchange trasforma gli indirizzi in destinatari reali: espande i gruppi, applica gli inoltri, risolve gli alias.
  4. Instradamento. Decide dove va: cassetta locale, altro server dell'organizzazione, connettore di invio verso Internet.
  5. Agenti e regole. Vengono applicate le regole del flusso di posta (regole di trasporto), il journaling, la DLP, l'antispam e l'antimalware.
  6. Consegna. Il messaggio viene depositato nella cassetta di destinazione oppure accodato verso l'hop successivo.

#4.2 Rilevamento messaggi: lo strumento numero uno

L1L1 in lettura

Get-MessageTrackingLog risponde alla domanda che ti verrà posta più spesso: "che fine ha fatto questa mail?". Richiede che il servizio Microsoft Exchange Transport Log Search sia in esecuzione.

# ultime voci sul server locale
Get-MessageTrackingLog -ResultSize 100

# tutto quello che ha inviato un mittente in una finestra temporale
Get-MessageTrackingLog -ResultSize Unlimited `
  -Start "28/07/2026 08:00" -End "28/07/2026 18:00" `
  -Sender "[email protected]" |
  Format-Table Timestamp,EventId,Source,Recipients,MessageSubject -Auto

# solo i fallimenti
Get-MessageTrackingLog -ResultSize Unlimited -Start "28/07/2026 00:00" -EventId FAIL |
  Format-Table Timestamp,Sender,Recipients,RecipientStatus -Auto

# cercare per oggetto
Get-MessageTrackingLog -ResultSize Unlimited -MessageSubject "Fattura 2026" | ft Timestamp,EventId,Sender,Recipients

Gli EventId che contano

EventIdSignificatoCome leggerlo
RECEIVEIl messaggio è entrato.Il campo Source dice da dove: SMTP (rete), STOREDRIVER (cassetta locale), AGENT.
SENDÈ stato inoltrato all'hop successivo.Uscita verso un altro server o verso Internet.
DELIVERÈ stato consegnato in una cassetta locale.Se c'è questo evento, il messaggio è arrivato. Il problema è nel client.
FAILConsegna fallita.Leggi RecipientStatus: contiene il codice SMTP e il motivo.
DEFERConsegna rimandata, riproverà.Normale se occasionale. Se persiste, guarda le code.
DROPEliminato senza NDR.Quasi sempre una regola di trasporto o l'antispam.
RESOLVEDestinatario risolto verso un altro indirizzo.Alias, gruppo o inoltro.
EXPANDGruppo di distribuzione espanso.Da qui in poi ci sono più destinatari.
TRANSFERRipartito per biforcazione (contenuto, destinazioni diverse).Normale.
POISONMESSAGEMessaggio ritenuto dannoso per il servizio, isolato.Anomalia: escala.

#4.3 Le code

L2L2

Guardare

# code non vuote sul server locale
Get-Queue -Exclude Empty | Format-Table Identity,DeliveryType,Status,MessageCount,NextHopDomain -Auto

# vista aggregata su tutti i server (il comando da eseguire per primo in un incidente)
Get-QueueDigest -Dag <NomeDAG>
Get-QueueDigest -Forest

# code sopra una certa soglia
Get-Queue -Filter "MessageCount -gt 100" | Format-List

# cosa c'è dentro una coda
Get-Message -Queue "<Identity coda>" | Format-Table Identity,FromAddress,Subject,Status,SCL,Size -Auto

Gli stati di una coda

StatoSignificatoCosa fare
ActiveSta consegnando in questo momento.Niente. È il funzionamento normale.
ReadyPronta, in attesa di risorse.Niente.
RetryLa connessione all'hop successivo è fallita, riproverà a intervalli.Verifica DNS, connettività e stato del destinatario. Poi Retry-Queue.
SuspendedSospesa manualmente. Nessuna consegna.Se non l'hai sospesa tu, chiedi chi e perché prima di riprenderla.

Agire

# forzare subito un nuovo tentativo (invece di aspettare il timer)
Retry-Queue -Identity "<Identity coda>"
Retry-Queue -Filter "Status -eq 'Retry'"

# rimandare i messaggi al classificatore (dopo modifiche a routing o DNS)
Retry-Queue -Identity "<Identity coda>" -Resubmit $true

# sospendere e riprendere
Suspend-Queue -Identity "<Identity coda>"
Resume-Queue -Identity "<Identity coda>"

# spostare le code di un server verso un altro (prima di una manutenzione)
Redirect-Message -Server SRV-EX01 -Target SRV-EX02.contoso.it

Agire su singoli messaggi

# sospendere un messaggio specifico
Suspend-Message -Identity "<Identity messaggio>"

# esportare un messaggio su file per analisi (prima di rimuoverlo!)
$m = Export-Message -Identity "<Identity messaggio>"
$m | AssembleMessage -Path "C:\Temp\messaggio.eml"

# rimuovere un messaggio SENZA notificare il mittente
Remove-Message -Identity "<Identity messaggio>" -WithNDR $false

# rimuovere tutti i messaggi di un mittente da una coda (es. account compromesso)
Get-Message -Queue "<Identity coda>" -Filter "FromAddress -eq '[email protected]'" |
  Remove-Message -WithNDR $false -Confirm:$false

#4.4 Connettori e domini accettati

L2L3L2 in lettura, L3 per le modifiche

# domini che l'organizzazione accetta come propri
Get-AcceptedDomain | Format-Table Name,DomainName,DomainType,Default -Auto

# connettori di ricezione (chi può consegnarci posta e come)
Get-ReceiveConnector | Format-Table Server,Identity,Bindings,RemoteIPRanges,PermissionGroups -Auto

# connettori di invio (dove mandiamo la posta in uscita)
Get-SendConnector | Format-Table Name,AddressSpaces,SmartHosts,SourceTransportServers,Enabled -Auto

#4.5 NDR: leggere il messaggio di errore

L1L1

Gli NDR (Non-Delivery Report) contengono un codice a tre livelli. Il primo numero dice se il problema è temporaneo o definitivo.

CodiceSignificatoChi lo risolve
4.x.xErrore temporaneo. Il server riproverà.Nessuno, se rientra. Se persiste oltre le ore: L2.
5.x.xErrore definitivo. Il messaggio non partirà.Dipende dal codice.
5.1.1Destinatario inesistente.L'utente ha sbagliato indirizzo. Verifica con Get-Recipient.
5.1.10Destinatario non trovato nella directory.Come sopra, spesso con alias eliminato di recente.
5.2.2Cassetta del destinatario piena.Il destinatario, o L1 se è interno (quota).
5.2.3Messaggio troppo grande.L1: verifica limiti cassetta, connettore e organizzazione.
5.4.1Nessun percorso di instradamento verso il destinatario.L2: routing, connettori, DNS.
5.7.1Rifiutato per motivi di autorizzazione o policy.L2: permessi di relay, restrizioni di recapito, regole.
5.7.606IP bloccato dal destinatario (spesso Microsoft 365).L3: delisting, reputazione IP, SPF/DKIM/DMARC.

#4.6 Test SMTP manuale

L2L2

Utile quando devi verificare se un server risponde e cosa risponde, senza dipendere da client o applicativi.

telnet mail.contoso.it 25

EHLO test.contoso.it
MAIL FROM:<[email protected]>
RCPT TO:<[email protected]>
DATA
Subject: test connettivita

corpo del messaggio
.
QUIT

#4.7 Playbook operativi

L1L2L1/L2

Playbook A — "Un utente non riceve una mail specifica"

  1. Fatti dare mittente, ora approssimativa e oggetto. Senza almeno due dei tre, la ricerca è impraticabile.
  2. Cerca nei log: Get-MessageTrackingLog -Start "<ora-1h>" -End "<ora+1h>" -Recipients "<utente>" | ft Timestamp,EventId,Sender,MessageSubject
  3. Se trovi DELIVER: il messaggio è nella cassetta. Verifica regole di Outlook, cartella Posta indesiderata, e la cartella Archivio. Il problema non è di Exchange.
  4. Se trovi FAIL: leggi RecipientStatus, hai già la causa.
  5. Se trovi DROP: verifica regole di trasporto e antispam. Get-TransportRule | ft Name,State,Priority
  6. Se non trovi nulla: il messaggio non è mai arrivato all'organizzazione. Fai verificare al mittente il proprio NDR. Controlla poi le code del server perimetrale ed eventuali filtri a monte.

Playbook B — "Nessuno riceve posta dall'esterno"

  1. Vista d'insieme immediata: Get-QueueDigest -Forest
  2. Servizi: Test-ServiceHealth su ogni server.
  3. Database montati: Get-MailboxDatabaseCopyStatus * | ft Name,Status,ContentIndexState
  4. Verifica che i record MX pubblici puntino dove devono e che la porta 25 sia raggiungibile dall'esterno.
  5. Verifica lo spazio su disco dei volumi che ospitano code e database. Una coda che non si svuota per disco pieno è uno scenario ricorrente.
  6. Se le code crescono ma i servizi sono su e il disco è libero: escala a L3. Non riavviare servizi a caso.

Playbook C — "Un account interno sta mandando spam"

  1. Conferma: Get-Queue -Filter "MessageCount -gt 500" e Get-Message -Queue <coda> | group FromAddress | sort Count -Desc | select -First 5
  2. Blocca subito l'invio: Set-Mailbox <utente> -MaxSendSize 1KB oppure disabilita l'account in AD secondo la procedura interna di incident response.
  3. Taglia i canali mobili: Set-CasMailbox <utente> -ActiveSyncEnabled $false -OWAEnabled $false
  4. Svuota la coda dei messaggi in uscita di quell'utente, esportandone prima un campione come evidenza.
  5. Verifica se è stato impostato un inoltro o una regola di posta nascosta: Get-Mailbox <utente> | fl Forwarding* e Get-InboxRule -Mailbox <utente>
  6. Cambio password, revoca sessioni, escalation al responsabile della sicurezza. Documenta orari e azioni.

Playbook D — "La posta verso un dominio specifico non parte"

  1. Guarda la coda verso quel dominio: Get-Queue | Where {$_.NextHopDomain -like "*dominio.it*"} | fl
  2. Leggi LastError: contiene la risposta testuale del server remoto, che spesso spiega tutto.
  3. Verifica la risoluzione DNS dei record MX dal server: Resolve-DnsName dominio.it -Type MX
  4. Prova una connessione manuale in telnet verso il loro MX sulla porta 25.
  5. Se la risposta remota indica reputazione o blacklist, escala: la richiesta di delisting è un'attività L3 e va coordinata con chi gestisce il DNS pubblico.

#4.8 Antispam: la scala SCL

L1L1 in lettura

Ogni messaggio riceve un punteggio SCL (Spam Confidence Level) da 0 a 9. Le soglie decidono cosa succede.

SogliaParametroComportamento tipico
Cartella posta indesiderataSCLJunkThresholdConsegnato ma spostato in Posta indesiderata.
QuarantenaSCLQuarantineThresholdDirottato nella cassetta di quarantena, per revisione.
RifiutoSCLRejectThresholdRifiutato con NDR al mittente.
EliminazioneSCLDeleteThresholdScartato in silenzio. Nessuno riceve nulla.
Get-ContentFilterConfig | Format-List SCL*Threshold,SCL*Enabled

# mittenti e domini sempre ammessi / sempre bloccati
Get-ContentFilterConfig | Format-List BypassedSenders,BypassedSenderDomains
Set-ContentFilterConfig -BypassedSenderDomains @{Add="fornitore-fidato.it"}

# preferenze antispam della singola cassetta
Get-MailboxJunkEmailConfiguration m.rossi | fl Enabled,TrustedSendersAndDomains,BlockedSendersAndDomains

Parte 5 — Manutenzione, alta disponibilità e aggiornamenti

L2L3L2 per il monitoraggio, L3 per le operazioni. Un junior non esegue queste procedure da solo la prima volta.

#5.1 I controlli periodici

Ogni giorno (10 minuti, L1)

ControlloComandoSoglia di allarme
Servizi Exchange avviatiTest-ServiceHealthUn solo servizio richiesto non avviato.
CodeGet-QueueDigest -ForestCode oltre poche centinaia di messaggi, o in Retry da ore.
Copie databaseGet-MailboxDatabaseCopyStatus *Stato diverso da Mounted / Healthy.
Indice di ricercastessa uscita, colonna ContentIndexStateDiverso da Healthy.
Spazio discoGet-Volume sui volumi di DB e logSotto il 20% libero: pianifica. Sotto il 10%: intervieni oggi.
Backup completatoConsole del prodotto di backupUn solo backup fallito. I log non vengono troncati e il disco si riempie.
# check giornaliero, tutto in blocco
Test-ServiceHealth | Format-Table Role,RequiredServicesRunning,ServicesNotRunning -Auto
Get-QueueDigest -Forest
Get-MailboxDatabaseCopyStatus * | Format-Table Name,Status,CopyQueueLength,ReplayQueueLength,ContentIndexState -Auto
Get-Volume | Where {$_.DriveLetter} | Format-Table DriveLetter,FileSystemLabel,
  @{n="LiberoGB";e={[math]::Round($_.SizeRemaining/1GB,1)}},
  @{n="Libero%";e={[math]::Round($_.SizeRemaining/$_.Size*100,0)}} -Auto

Ogni settimana (L2)

  • Verifica dello stato di salute complessivo: Get-ExchangeServer | Get-HealthReport -RollupGroup
  • Verifica della replica del DAG: Test-ReplicationHealth
  • Controllo delle scadenze certificati: Get-ExchangeCertificate | ft Thumbprint,Services,NotAfter,Subject -Auto
  • Revisione degli inoltri esterni attivi e delle nuove regole della Posta in arrivo sospette.
  • Revisione dei log di controllo amministratore, se attivi.

Ogni mese (L2/L3)

  • Verifica della disponibilità dell'ultimo aggiornamento cumulativo e di sicurezza.
  • Test di ripristino: un ripristino mai testato non è un backup, è una speranza.
  • Revisione delle quote e della crescita dei database.
  • Verifica delle cassette inattive e degli account dimessi non ancora processati.

#5.2 Disponibilità gestita: leggere lo stato di salute

L2L2

Exchange si monitora da solo: sonde raccolgono dati, monitor valutano lo stato, risponditori tentano azioni correttive automatiche (riavviare un servizio, riciclare un pool applicativo, in ultima istanza riavviare il server). Sapere leggere questo sistema evita di intervenire dove il server sta già rimediando da sé.

# panoramica per server
Get-HealthReport -Identity <NomeServer>

# solo i set di integrità non sani
Get-HealthReport -Identity <NomeServer> | Where {$_.AlertValue -ne "Healthy"} |
  Format-Table HealthSetName,AlertValue,ServerComponent -Auto

# dettaglio dei monitor di un set specifico
Get-ServerHealth -Identity <NomeServer> -HealthSet <NomeSet> |
  Format-Table Name,AlertValue,HealthSetName -Auto

# vista aggregata su tutta l'organizzazione o su un DAG
Get-ExchangeServer | Get-HealthReport -RollupGroup
(Get-DatabaseAvailabilityGroup <NomeDAG>).Servers | Get-HealthReport -RollupGroup

#5.3 Database e copie

L2L2 in lettura

# elenco database e dove sono attivi in questo momento
Get-MailboxDatabase -Status | Format-Table Name,Server,Mounted,DatabaseSize,AvailableNewMailboxSpace -Auto

# stato di tutte le copie: il comando più importante di questa sezione
Get-MailboxDatabaseCopyStatus * |
  Format-Table Name,Status,CopyQueueLength,ReplayQueueLength,ContentIndexState,ActivationPreference -Auto
ColonnaCosa significaValore sano
StatusRuolo e salute della copia.Mounted sull'attiva, Healthy sulle passive.
CopyQueueLengthLog generati sull'attiva e non ancora copiati sulla passiva.Vicino a 0. Numeri alti = problema di rete o di disco.
ReplayQueueLengthLog copiati ma non ancora applicati al database.Vicino a 0, salvo copie ritardate volutamente.
ContentIndexStateStato dell'indice di ricerca.Healthy. Se Failed, le ricerche degli utenti non funzionano.
ActivationPreferenceOrdine di preferenza per l'attivazione.1 = copia preferita.

Verifica della replica del DAG

Test-ReplicationHealth -Identity <NomeServer>

# su tutti i membri
(Get-DatabaseAvailabilityGroup <NomeDAG>).Servers | ForEach-Object { Test-ReplicationHealth -Identity $_.Name }

Il test verifica una serie di componenti: servizio di replica, ruolo di Active Manager, listener, raggiungibilità dei membri, reti del cluster, gruppo di quorum, testimone di condivisione file, ridondanza e disponibilità dei database, presenza di copie sospese, fallite o in inizializzazione. Un esito diverso da Passed va letto voce per voce, non liquidato in blocco.

#5.4 Switchover: spostare i database attivi

L3L2L3 — L2 solo su procedura autorizzata

Uno switchover è lo spostamento pianificato dell'attività da un server a un altro. Un failover è lo stesso spostamento, ma non pianificato: lo decide il sistema quando qualcosa si rompe.

# spostare tutti i database attivi di un server, lasciando scegliere il sistema
Move-ActiveMailboxDatabase -Server SRV-EX01

# spostare verso un server specifico
Move-ActiveMailboxDatabase -Server SRV-EX01 -ActivateOnServer SRV-EX02

# spostare un singolo database
Move-ActiveMailboxDatabase DB01 -ActivateOnServer SRV-EX02

# simulare prima
Move-ActiveMailboxDatabase -Server SRV-EX01 -WhatIf

#5.5 Modalità manutenzione su un membro DAG

L3L3 — procedura da eseguire nell'ordine, senza saltare passaggi

Questa è la procedura che va imparata a memoria prima di toccare qualsiasi server Exchange in cluster: aggiornamenti, riavvii, interventi hardware, patch di Windows. Serve a togliere il server dalla produzione in modo ordinato, senza interrompere gli utenti e senza perdere messaggi in transito.

Fase 1 — Entrare in manutenzione

# 1. svuota le code di trasporto
Set-ServerComponentState <NomeServer> -Component HubTransport -State Draining -Requester Maintenance

# 2. applica lo svuotamento
Restart-Service MSExchangeTransport

# 3. (solo Exchange 2016 con messaggistica unificata)
Set-ServerComponentState <NomeServer> -Component UMCallRouter -State Draining -Requester Maintenance

# 4. vai nella cartella degli script Exchange
CD $ExScripts

# 5. sposta database attivi e ruoli critici altrove, e metti in pausa il nodo cluster
.\StartDagServerMaintenance.ps1 -ServerName <NomeServer> -MoveComment Maintenance -PauseClusterNode

# 6. reindirizza i messaggi ancora in coda su un altro server
Redirect-Message -Server <NomeServer> -Target <FQDN altro server>

# 7. metti il server completamente offline dal punto di vista dei servizi
Set-ServerComponentState <NomeServer> -Component ServerWideOffline -State Inactive -Requester Maintenance

Fase 2 — Verificare che sia davvero in manutenzione

# solo Monitoring e RecoveryActionsEnabled devono risultare Active
Get-ServerComponentState <NomeServer> | Format-Table Component,State -Autosize

# nessun database attivo attivabile qui
Get-MailboxServer <NomeServer> | Format-List DatabaseCopyAutoActivationPolicy   # atteso: Blocked

# nodo cluster in pausa
Get-ClusterNode <NomeServer> | Format-List

# code vuote
Get-Queue

Solo quando tutte e quattro le verifiche danno l'esito atteso puoi procedere con l'intervento: aggiornamento, riavvio, sostituzione hardware.

Fase 3 — Rientrare in produzione

# 1. riporta il server online
Set-ServerComponentState <NomeServer> -Component ServerWideOffline -State Active -Requester Maintenance

# 2. (solo Exchange 2016 con messaggistica unificata)
Set-ServerComponentState <NomeServer> -Component UMCallRouter -State Active -Requester Maintenance

# 3.
CD $ExScripts

# 4. riprendi il nodo cluster, sblocca l'attivazione, riprendi le copie
.\StopDagServerMaintenance.ps1 -ServerName <NomeServer>

# 5. riattiva il trasporto
Set-ServerComponentState <NomeServer> -Component HubTransport -State Active -Requester Maintenance
Restart-Service MSExchangeTransport

# 6. verifica finale
Get-ServerComponentState <NomeServer> | Format-Table Component,State -Autosize
Get-MailboxDatabaseCopyStatus * | ft Name,Status,CopyQueueLength,ContentIndexState -Auto

# 7. facoltativo: ribilanciare le copie attive secondo le preferenze
.\RedistributeActiveDatabases.ps1 -DagName <NomeDAG> -BalanceDbsByActivationPreference -Confirm:$false
Set-ServerComponentState <NomeServer> -Component ServerWideOffline -State Active -Requester Functional
Set-ServerComponentState <NomeServer> -Component Monitoring -State Active -Requester Functional
Set-ServerComponentState <NomeServer> -Component RecoveryActionsEnabled -State Active -Requester Functional

#5.6 Aggiornamenti cumulativi e di sicurezza

L3L3

Ogni aggiornamento cumulativo (CU) è un'installazione completa del prodotto: non serve installare le CU precedenti in sequenza. Gli aggiornamenti di sicurezza (SU) si applicano invece a una CU specifica.

Preparazione, in ordine

  1. Leggi le note di rilascio della CU specifica. Ogni CU ha le sue sorprese.
  2. Verifica requisiti di sistema e prerequisiti: possono essere cambiati rispetto alla CU installata.
  3. Verifica se la CU richiede aggiornamenti dello schema di Active Directory o preparazione dei domini. In quel caso servono permessi elevati e una finestra dedicata.
  4. Esegui e verifica un backup funzionante di Active Directory e di Exchange.
  5. Salva a parte tutte le personalizzazioni: file web.config, EdgeTransport.exe.config, impostazioni TLS e crittografia del sistema operativo. Vengono sovrascritte.
  6. Testa in un ambiente non di produzione, se ne avete uno.
  7. Riavvia il server prima di iniziare, per liberare riavvii in sospeso.
  8. Disattiva temporaneamente l'antivirus per la durata dell'installazione.
  9. Se il server è membro di un DAG, mettilo in modalità manutenzione (§5.5).
  10. Esegui il programma di installazione da un prompt con privilegi elevati.

Tempo indicativo dichiarato dalla documentazione per un aggiornamento CU: circa tre ore per server. Pianifica la finestra di conseguenza, e su più server procedi in sequenza, mai in parallelo.

# verifica versione e build installata
Get-ExchangeServer | Format-Table Name,Edition,AdminDisplayVersion,ServerRole -Auto

# verifica più precisa della build
Get-Command ExSetup.exe | ForEach {$_.FileVersionInfo}

#5.7 Certificati

L3L1L2L3 — L1/L2 devono saperli leggere e sapere quando scadono

# elenco certificati con scadenza e servizi assegnati
Get-ExchangeCertificate | Format-Table Thumbprint,Services,NotAfter,Subject,CertificateDomains -Auto

# quali scadono nei prossimi 60 giorni
Get-ExchangeCertificate | Where {$_.NotAfter -lt (Get-Date).AddDays(60)} |
  Format-Table Thumbprint,Subject,NotAfter,Services -Auto

Nella colonna Services le lettere indicano a quali servizi il certificato è assegnato: IMAP, POP, UM, IIS (web), SMTP. Un certificato scaduto assegnato a IIS blocca OWA, ECP, ActiveSync e la connettività Outlook per tutti, contemporaneamente.

#5.8 Backup e ripristino

L3L3

Exchange supporta il backup tramite VSS. Un backup completo riuscito tronca i log delle transazioni: è questo il meccanismo che impedisce ai volumi di riempirsi. Un backup che fallisce silenziosamente per giorni è la premessa di un disco pieno e di database smontati.

  • Backup completo: copia database e log, poi tronca i log. È quello che serve.
  • Backup incrementale: copia i soli log dall'ultimo backup e li tronca.
  • Backup copia: copia senza troncare. Utile per prelievi occasionali, inutile per l'igiene dei log.

Database di ripristino

Un database di ripristino consente di montare una copia ripristinata di un database in parallelo alla produzione, per estrarre dati senza toccare le cassette attive. È il meccanismo corretto per rispondere a "ci serve la posta di quella cassetta al mese scorso".

New-MailboxDatabase -Recovery -Name RDB01 -Server <NomeServer> `
  -EdbFilePath "E:\RDB01\DB01.edb" -LogFolderPath "E:\RDB01\Logs"

Mount-Database RDB01

# estrarre il contenuto verso una cartella della cassetta di destinazione
New-MailboxRestoreRequest -SourceDatabase RDB01 -SourceStoreMailbox "Mario Rossi" `
  -TargetMailbox m.rossi -TargetRootFolder "Ripristino 2026-07"

Get-MailboxRestoreRequest | Get-MailboxRestoreRequestStatistics | ft Name,Status,PercentComplete

#5.9 Spazio disco e log delle transazioni

L1L2L3L1 in monitoraggio, L2/L3 in intervento

Ogni modifica alle cassette viene prima scritta in un log delle transazioni e poi applicata al database. I log si accumulano finché un backup completo non li tronca. Le cause tipiche di crescita anomala:

  • Il backup non gira, o gira ma fallisce, o è configurato come backup copia.
  • Uno spostamento massivo di cassette o un'importazione PST di grandi dimensioni in corso.
  • Un ciclo di sincronizzazione impazzito di un client o di un applicativo.
  • Una copia di database sospesa o fallita che impedisce il troncamento nel DAG.
# quanto occupa ciascun database e quanto spazio bianco ha dentro
Get-MailboxDatabase -Status | Format-Table Name,DatabaseSize,AvailableNewMailboxSpace,Mounted -Auto

# le 20 cassette più grandi: utile per capire dove sta crescendo
Get-MailboxStatistics -Database DB01 | Sort-Object TotalItemSize -Descending |
  Select-Object -First 20 DisplayName,TotalItemSize,ItemCount,LastLogonTime

Parte 6 — Riferimenti rapidi

#6.1 Cheat sheet: dall'attività al comando

Devo...ComandoLiv.
Vedere la configurazione di una cassettaGet-Mailbox <utente> | flL1
Vedere quanto è grande una cassettaGet-MailboxStatistics <utente>L1
Creare una cassetta su utente AD esistenteEnable-Mailbox -Identity <utente> -Database <DB>L1
Creare una cassetta condivisaNew-Mailbox -Shared -Name "<Nome>" -Alias <alias>L1
Aggiungere un aliasSet-Mailbox <utente> -EmailAddresses @{Add="<indirizzo>"}L1
Dare accesso completoAdd-MailboxPermission -Identity <cassetta> -User <utente> -AccessRights FullAccess -InheritanceType AllL1
Dare Invia comeAdd-ADPermission -Identity <cassetta> -User <utente> -ExtendedRights "Send As"L1
Dare Invia per conto diSet-Mailbox <cassetta> -GrantSendOnBehalfTo @{Add="<utente>"}L1
Impostare le quoteSet-Mailbox <utente> -UseDatabaseQuotaDefaults $false -IssueWarningQuota ... -ProhibitSendQuota ...L1
Impostare un inoltroSet-Mailbox <utente> -ForwardingAddress <destinatario> -DeliverToMailboxAndForward $trueL1
Nascondere dalla rubricaSet-Mailbox <utente> -HiddenFromAddressListsEnabled $trueL1
Convertire in condivisaSet-Mailbox <utente> -Type SharedL1
Aggiungere a un gruppoAdd-DistributionGroupMember -Identity <gruppo> -Member <utente>L1
Vedere i membri di un gruppoGet-DistributionGroupMember <gruppo>L1
Disattivare ActiveSync a un utenteSet-CasMailbox <utente> -ActiveSyncEnabled $falseL1
Vedere i telefoni di un utenteGet-MobileDeviceStatistics -Mailbox <utente>L1
Cancellare i dati aziendali da un telefonoClear-MobileDevice -Identity <id> -AccountOnlyL1*
Cercare un messaggioGet-MessageTrackingLog -Sender <mittente> -Start <ora> -End <ora>L1
Vedere le code, tutti i serverGet-QueueDigest -ForestL1
Forzare un nuovo tentativo di consegnaRetry-Queue -Filter "Status -eq 'Retry'"L2
Rimuovere messaggi da una codaGet-Message -Queue <coda> -Filter ... | Remove-Message -WithNDR $falseL2
Spostare una cassetta di databaseNew-MoveRequest -Identity <utente> -TargetDatabase <DB>L2
Esportare una cassetta in PSTNew-MailboxExportRequest -Mailbox <utente> -FilePath <UNC>L2
Verificare i serviziTest-ServiceHealthL1
Verificare le copie dei databaseGet-MailboxDatabaseCopyStatus *L1
Verificare la replica del DAGTest-ReplicationHealthL2
Spostare i database attivi di un serverMove-ActiveMailboxDatabase -Server <server>L3
Mettere un server in manutenzionevedi §5.5, procedura completaL3
Verificare i certificatiGet-ExchangeCertificate | ft Thumbprint,Services,NotAfterL1

#6.2 Porte da conoscere

PortaProtocolloUsata da
25SMTPPosta fra server e da Internet. Connettori di ricezione.
587SMTP autenticatoInvio da client e applicativi autenticati.
465SMTPSInvio implicito su TLS, usato da alcuni apparati.
443HTTPSOWA, ECP, EWS, ActiveSync, MAPI su HTTP, Autodiscover, OAB. La porta.
80HTTPSolo per redirezione verso HTTPS.
110 / 995POP3 / POP3SClient POP.
143 / 993IMAP4 / IMAP4SClient IMAP.
2525SMTP internoRicezione fra servizi di trasporto interni sullo stesso server.
50636LDAP sicuro (AD LDS)Sincronizzazione EdgeSync verso i server Trasporto Edge.
64327SMTPTrasporto ridondante fra server Cassette postali.

#6.3 Servizi critici

ServizioSe è fermo...
MSExchangeIS (Information Store)Nessuno accede alla propria posta. Il servizio più critico in assoluto.
MSExchangeTransportLa posta non entra e non esce dal server.
MSExchangeFrontEndTransportIl server non accetta connessioni SMTP dall'esterno.
MSExchangeRepl (Replica)La replica DAG si ferma. Le code di copia crescono.
MSExchangeADTopologyPraticamente tutto smette di funzionare: è la dipendenza di base.
MSExchangeMailboxAssistantPrenotazione sale, criteri di conservazione e assistenti vari si fermano.
MSExchangeTransportLogSearchNon si possono più cercare i log di rilevamento messaggi.
W3SVC (IIS)OWA, ECP, ActiveSync, Outlook: tutto giù.
# verifica sintetica, per ruolo
Test-ServiceHealth | Format-Table Role,RequiredServicesRunning,ServicesNotRunning -Auto

#6.4 Matrice di escalation

SituazioneChi la gestisceEntro quanto escalare
Un utente non riceve una mailL1Se dopo i playbook di §4.7 non hai una causa: 30 min.
Un utente non accede alla postaL1Se OWA non funziona: subito a L2.
Richiesta di permessi, alias, quote, gruppiL1Non si escala, si esegue.
Richiesta di wipe di un dispositivoL1 con autorizzazioneSe l'autorizzazione non è chiara: non eseguire, escala.
Coda in crescita su un serverL2Se supera le migliaia di messaggi o dura oltre 1h: L3.
Account interno che invia spamL1 blocca, L2 indagaContestualmente al blocco: subito a L2 e sicurezza.
Copia database Failed o indice FailedL2Subito a L3 se riguarda l'unica copia sana.
Certificato in scadenzaL2A 60 giorni: pianifica con L3. A 7 giorni: emergenza.
Database smontatoL3Immediato. Non tentare Mount-Database da soli.
Disco pieno su volume DB o logL3Immediato.
Interruzione generale del servizioL3Immediato, in parallelo alla raccolta dello stato.

#6.5 Modello di annotazione ticket

TICKET #.........        DATA/ORA: ..................
RICHIEDENTE: ..................  AUTORIZZATO DA: ..................

RICHIESTA (una riga):
..................................................................

OGGETTI COINVOLTI (cassette, gruppi, server):
..................................................................

VERIFICA PRIMA (comando + esito sintetico):
..................................................................

COMANDO ESEGUITO (testuale, copia-incolla):
..................................................................

VERIFICA DOPO (comando + esito):
..................................................................

REVERSIBILE?  [ ] Sì, come: ..................  [ ] No
ESITO:  [ ] Risolto  [ ] Escalato a: ..................

#6.6 Glossario

TermineSignificato
AliasNome breve interno di un destinatario, distinto dall'indirizzo di posta.
AutodiscoverServizio che fornisce automaticamente ai client la configurazione della cassetta.
CASClient Access Services: i servizi di accesso client, integrati nel ruolo Cassette postali.
CUCumulative Update: aggiornamento cumulativo, installazione completa del prodotto.
DAGDatabase Availability Group: insieme di server che ospitano copie replicate degli stessi database.
DSN / NDRNotifica di stato o di mancata consegna generata dal sistema di trasporto.
EACExchange Admin Center: la console web di amministrazione (/ecp).
EMSExchange Management Shell: PowerShell con i cmdlet Exchange.
EWSExchange Web Services: interfaccia usata da molte applicazioni di terze parti.
FailoverAttivazione non pianificata di una copia di database su un altro server.
MAPI su HTTPProtocollo predefinito di connessione di Outlook nelle versioni recenti.
OABOffline Address Book: copia locale della rubrica usata da Outlook.
PAMPrimary Active Manager: il nodo del DAG che decide le attivazioni dei database.
SCLSpam Confidence Level: punteggio antispam da 0 a 9.
SESubscription Edition: l'edizione a sottoscrizione di Exchange Server.
Shadow redundancyMeccanismo che conserva una copia di scorta dei messaggi in transito.
Safety Net / Rete di sicurezzaArchivio dei messaggi già consegnati, usato per rinviare dopo un failover.
SwitchoverSpostamento pianificato dell'attività da un server a un altro.
Trasporto EdgeRuolo perimetrale, in DMZ, non aggiunto al dominio.

#6.7 Dove cercare quando questa guida non basta

  • La documentazione ufficiale Microsoft Learn per Exchange Server è la fonte di questa guida ed è aggiornata più spesso di qualsiasi manuale interno. Cerca per nome del cmdlet: la pagina di riferimento contiene sintassi completa, tutti i parametri ed esempi.
  • Dentro EMS, la guida è già installata: Get-Help Set-Mailbox -Full e Get-Help Set-Mailbox -Examples rispondono senza uscire dal terminale.
  • Per sapere quali permessi servono per un'attività: Get-ManagementRoleAssignment -RoleAssignee <utente> mostra cosa può fare un amministratore.
  • I log di installazione stanno in C:\ExchangeSetupLogs\ExchangeSetup.log. I log di trasporto, protocollo e connettività stanno nelle cartelle di logging dell'installazione di Exchange.

#Nota finale per chi comincia

Exchange è una piattaforma che perdona poco e avvisa tardi. La differenza fra un tecnico junior che cresce in fretta e uno che accumula incidenti non sta nella quantità di comandi che conosce a memoria: sta nell'abitudine di guardare prima di toccare, di simulare prima di eseguire e di scrivere quello che ha fatto.

Le prime volte sarai lento. Va benissimo. La velocità arriva da sola dopo qualche mese; l'abitudine alla prudenza, se non la costruisci adesso, non arriva più.

Nessun risultato. Prova con il nome di un cmdlet (Set-Mailbox), un codice di errore (5.7.1) o un'attività (quota).

Sintesi operativa della documentazione Microsoft Learn per Exchange Server (Subscription Edition, 2019, 2016). In caso di discrepanza fa fede la documentazione ufficiale: verifica sempre prima di operazioni non reversibili.