Guida operativa
Exchange ServerManuale operativo
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à.
| Livello | Chi | Cosa può fare da solo | Cosa deve escalare |
|---|---|---|---|
| L1 | Helpdesk / primo livello | Operazioni 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. |
| L2 | Sysadmin junior / secondo livello | Diagnosi 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. |
| L3 | Senior / riferimento | Tutto 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 -WhatIf3. 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 -WhatIf4. 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
#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
| Strumento | Come si apre | A cosa serve | Limite |
|---|---|---|---|
| EAC — Interfaccia di amministrazione di Exchange | Browser, indirizzo https://<server>/ecp | Il 90% delle attività quotidiane su destinatari, permessi, code, certificati. | Non espone tutti i parametri; alcune operazioni esistono solo in PowerShell. |
| EMS — Exchange Management Shell | Menu Start, sul server o su una postazione con gli strumenti di gestione | Tutto. È PowerShell con i cmdlet Exchange precaricati. | Nessuna rete di protezione: quello che scrivi viene eseguito. |
| Casella degli strumenti di Exchange | Menu Start sul server | Contiene il Visualizzatore code e gli strumenti di flusso di posta. | Solo sul server. |
| Visualizzatore code | Dalla Casella degli strumenti | Vedere 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| Verbo | Significato | Pericolosità |
|---|---|---|
Get- | Legge e mostra | Nessuna. Usalo liberamente. |
Set- | Modifica un oggetto esistente | Media. Sovrascrive il valore precedente. |
New- | Crea un oggetto | Bassa, ma crea disordine se sbagliato. |
Enable- / Disable- | Attiva o disattiva una funzione | Media. |
Add- / Remove- | Aggiunge o toglie un elemento da un insieme | Media/alta a seconda dell'oggetto. |
Remove- | Elimina un oggetto | Alta. Spesso irreversibile. |
Move- | Sposta (cassette, database attivi) | Alta: ha impatto sugli utenti mentre avviene. |
Test- | Esegue una diagnostica | Nessuna. |
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, unGet-Mailboxsu 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.
| Comando | Risponde alla domanda |
|---|---|
Get-Mailbox <utente> | fl | Questa 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-Queue | Ci sono messaggi fermi su questo server? |
Get-QueueDigest -Dag <DAG> | Ci sono messaggi fermi su tutti i server? |
Get-MessageTrackingLog | Che fine ha fatto questo messaggio? |
Get-ExchangeServer | Quali 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-ServiceHealth | Tutti i servizi Exchange richiesti sono avviati? |
Parte 2 — Cassette postali, gruppi e permessi
#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.
| Tipo | Quando si usa | Ha un account AD attivo? |
|---|---|---|
| Cassetta utente | Una persona. | Sì, con licenza e password. |
| Cassetta condivisa | Un indirizzo funzionale usato da più persone: info@, assistenza@, amministrazione@. | L'account esiste ma è disabilitato: si accede per delega. |
| Cassetta sala | Una sala riunioni prenotabile dal calendario. | Account disabilitato. |
| Cassetta attrezzatura | Una risorsa prenotabile non-stanza: proiettore, auto aziendale. | Account disabilitato. |
| Gruppo di distribuzione | Un indirizzo che inoltra a un elenco di destinatari. | No, è un gruppo. |
| Gruppo di sicurezza abilitato alla posta | Come sopra, ma serve anche ad assegnare permessi. | No, è un gruppo. |
| Gruppo di distribuzione dinamico | L'elenco dei membri è calcolato al volo da una query (es. tutti quelli di un reparto). | No. |
| Contatto di posta | Una persona esterna che deve comparire in rubrica. | No. |
| Utente di posta | Una persona con account interno ma casella esterna (consulente, collaboratore). | Sì, ma senza cassetta locale. |
#2.2 Creare una cassetta postale utente
Da EAC
- Destinatari > Cassette postali > Nuova cassetta postale utente.
- 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.
- Compila alias e indirizzo primario secondo lo standard aziendale di nomenclatura. Se non lo conosci a memoria, chiedi: rinominare dopo lascia strascichi.
- 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 m.rossi@contoso.it `
-FirstName Mario -LastName Rossi -Database "DB01" `
-Password (ConvertTo-SecureString -String "<PasswordIniziale>" -AsPlainText -Force) `
-ResetPasswordOnNextLogon $trueVerifica
Get-Mailbox m.rossi | Format-List Name,Alias,PrimarySmtpAddress,EmailAddresses,Database,RecipientTypeDetails#2.3 Indirizzi e alias
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="mario.rossi@contoso.it"}
# rimuovere un alias
Set-Mailbox m.rossi -EmailAddresses @{Remove="vecchio.indirizzo@contoso.it"}
# cambiare l'indirizzo primario mantenendo il vecchio come secondario
Set-Mailbox m.rossi -EmailAddresses @{Add="m.rossi.nuovo@contoso.it"}
Set-Mailbox m.rossi -PrimarySmtpAddress "m.rossi.nuovo@contoso.it" -EmailAddressPolicyEnabled $false#2.4 Quote di archiviazione
Le quote hanno tre soglie progressive.
| Soglia | Parametro | Effetto per l'utente |
|---|---|---|
| Avviso | IssueWarningQuota | Riceve una notifica. Continua a lavorare normalmente. |
| Blocco invio | ProhibitSendQuota | Non può più inviare. Continua a ricevere. |
| Blocco totale | ProhibitSendReceiveQuota | Non 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
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 "esterno@fornitore.it" -DeliverToMailboxAndForward $true
# rimuovere l'inoltro
Set-Mailbox m.rossi -ForwardingAddress $null -ForwardingSmtpAddress $null#2.6 Restrizioni di recapito e limiti di dimensione
# 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
Esistono tre permessi distinti e vengono continuamente confusi, anche da chi li richiede. Chiarisci sempre cosa serve prima di assegnarli.
| Permesso | Cosa consente | Cosa 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,AccessRightsInvia 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,ExtendedRightsInvia 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="g.bianchi@contoso.it"}
# rimuove uno solo
Set-Mailbox "Assistenza Clienti" -GrantSendOnBehalfTo @{Remove="g.bianchi@contoso.it"}
# vale anche sui gruppi
Set-DistributionGroup "Ufficio Stampa" -GrantSendOnBehalfTo s.verdi#2.8 Cassette condivise
# creare
New-Mailbox -Shared -Name "Assistenza Clienti" -Alias assistenza `
-PrimarySmtpAddress assistenza@contoso.it
# 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
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
# gruppo di distribuzione classico
New-DistributionGroup -Name "Ufficio Acquisti" -Alias acquisti `
-PrimarySmtpAddress acquisti@contoso.it -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 $trueGruppi 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
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).
- 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.
- Se non basta, verifica la finestra di conservazione:
Get-Mailbox m.rossi | fl RetainDeletedItemsFor,SingleItemRecoveryEnabled - 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 $trueCassette 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
| Operazione | Comando | Cosa succede | Reversibile? |
|---|---|---|---|
| Convertire in condivisa | Set-Mailbox <x> -Type Shared | La posta resta, l'accesso passa ai delegati. | Sì. |
| Disabilitare | Disable-Mailbox <x> | La cassetta si stacca dall'utente AD e diventa disconnessa. L'utente AD resta. | Sì, entro il periodo di conservazione. |
| Eliminare | Remove-Mailbox <x> | Rimuove cassetta e account AD. | Solo entro il periodo di conservazione, con difficoltà. |
| Eliminare definitivamente | Remove-Mailbox <x> -Permanent $true | Distrugge i dati subito. | No. Mai. |
#2.13 Spostare una cassetta fra database
# 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
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-MailboxExportRequestParte 3 — Client, dispositivi mobili, OWA
#3.1 Come si collega un client, in breve
Capire questa sequenza risolve da sola metà dei ticket "Outlook non si connette".
- Outlook cerca la configurazione tramite Individuazione automatica (Autodiscover): interroga il dominio SMTP dell'utente, cercando record e URL noti.
- Autodiscover risponde con gli URL dei servizi: cassetta, disponibilità, rubrica offline, ecc.
- Outlook si collega tramite MAPI su HTTP, il protocollo predefinito dalle versioni recenti (in passato era Outlook Anywhere / RPC su HTTP).
- 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
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)
# 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
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 -AutoCriteri 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,AdminMailRecipientsCancellazione remota (wipe)
# 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 "helpdesk@contoso.it"
# 3) cancellazione completa del dispositivo (solo device aziendale)
Clear-MobileDevice -Identity "<Identity del dispositivo>" `
-NotificationEmailAddresses "helpdesk@contoso.it"
# rimuovere la partnership dopo il wipe
Remove-MobileDevice -Identity "<Identity del dispositivo>"#3.5 POP3 e IMAP4
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"
| Domanda | Se 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,ErrorParte 4 — Flusso di posta e risoluzione dei problemi
#4.1 La pipeline di trasporto in una pagina
Ogni messaggio attraversa sempre le stesse fasi. Sapere in quale fase si è fermato è la diagnosi.
- 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.
- Invio alla classificazione. Finisce nella coda Invio, dove il classificatore prende in carico il lavoro.
- Risoluzione dei destinatari. Exchange trasforma gli indirizzi in destinatari reali: espande i gruppi, applica gli inoltri, risolve gli alias.
- Instradamento. Decide dove va: cassetta locale, altro server dell'organizzazione, connettore di invio verso Internet.
- Agenti e regole. Vengono applicate le regole del flusso di posta (regole di trasporto), il journaling, la DLP, l'antispam e l'antimalware.
- Consegna. Il messaggio viene depositato nella cassetta di destinazione oppure accodato verso l'hop successivo.
#4.2 Rilevamento messaggi: lo strumento numero uno
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 "m.rossi@contoso.it" |
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,RecipientsGli EventId che contano
| EventId | Significato | Come leggerlo |
|---|---|---|
RECEIVE | Il 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. |
FAIL | Consegna fallita. | Leggi RecipientStatus: contiene il codice SMTP e il motivo. |
DEFER | Consegna rimandata, riproverà. | Normale se occasionale. Se persiste, guarda le code. |
DROP | Eliminato senza NDR. | Quasi sempre una regola di trasporto o l'antispam. |
RESOLVE | Destinatario risolto verso un altro indirizzo. | Alias, gruppo o inoltro. |
EXPAND | Gruppo di distribuzione espanso. | Da qui in poi ci sono più destinatari. |
TRANSFER | Ripartito per biforcazione (contenuto, destinazioni diverse). | Normale. |
POISONMESSAGE | Messaggio ritenuto dannoso per il servizio, isolato. | Anomalia: escala. |
#4.3 Le code
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 -AutoGli stati di una coda
| Stato | Significato | Cosa fare |
|---|---|---|
Active | Sta consegnando in questo momento. | Niente. È il funzionamento normale. |
Ready | Pronta, in attesa di risorse. | Niente. |
Retry | La connessione all'hop successivo è fallita, riproverà a intervalli. | Verifica DNS, connettività e stato del destinatario. Poi Retry-Queue. |
Suspended | Sospesa 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.itAgire 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 'spam@contoso.it'" |
Remove-Message -WithNDR $false -Confirm:$false#4.4 Connettori e domini accettati
# 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
Gli NDR (Non-Delivery Report) contengono un codice a tre livelli. Il primo numero dice se il problema è temporaneo o definitivo.
| Codice | Significato | Chi lo risolve |
|---|---|---|
4.x.x | Errore temporaneo. Il server riproverà. | Nessuno, se rientra. Se persiste oltre le ore: L2. |
5.x.x | Errore definitivo. Il messaggio non partirà. | Dipende dal codice. |
5.1.1 | Destinatario inesistente. | L'utente ha sbagliato indirizzo. Verifica con Get-Recipient. |
5.1.10 | Destinatario non trovato nella directory. | Come sopra, spesso con alias eliminato di recente. |
5.2.2 | Cassetta del destinatario piena. | Il destinatario, o L1 se è interno (quota). |
5.2.3 | Messaggio troppo grande. | L1: verifica limiti cassetta, connettore e organizzazione. |
5.4.1 | Nessun percorso di instradamento verso il destinatario. | L2: routing, connettori, DNS. |
5.7.1 | Rifiutato per motivi di autorizzazione o policy. | L2: permessi di relay, restrizioni di recapito, regole. |
5.7.606 | IP bloccato dal destinatario (spesso Microsoft 365). | L3: delisting, reputazione IP, SPF/DKIM/DMARC. |
#4.6 Test SMTP manuale
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:<test@contoso.it>
RCPT TO:<m.rossi@contoso.it>
DATA
Subject: test connettivita
corpo del messaggio
.
QUIT#4.7 Playbook operativi
Playbook A — "Un utente non riceve una mail specifica"
- Fatti dare mittente, ora approssimativa e oggetto. Senza almeno due dei tre, la ricerca è impraticabile.
- Cerca nei log:
Get-MessageTrackingLog -Start "<ora-1h>" -End "<ora+1h>" -Recipients "<utente>" | ft Timestamp,EventId,Sender,MessageSubject - Se trovi
DELIVER: il messaggio è nella cassetta. Verifica regole di Outlook, cartella Posta indesiderata, e la cartella Archivio. Il problema non è di Exchange. - Se trovi
FAIL: leggiRecipientStatus, hai già la causa. - Se trovi
DROP: verifica regole di trasporto e antispam.Get-TransportRule | ft Name,State,Priority - 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"
- Vista d'insieme immediata:
Get-QueueDigest -Forest - Servizi:
Test-ServiceHealthsu ogni server. - Database montati:
Get-MailboxDatabaseCopyStatus * | ft Name,Status,ContentIndexState - Verifica che i record MX pubblici puntino dove devono e che la porta 25 sia raggiungibile dall'esterno.
- Verifica lo spazio su disco dei volumi che ospitano code e database. Una coda che non si svuota per disco pieno è uno scenario ricorrente.
- 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"
- Conferma:
Get-Queue -Filter "MessageCount -gt 500"eGet-Message -Queue <coda> | group FromAddress | sort Count -Desc | select -First 5 - Blocca subito l'invio:
Set-Mailbox <utente> -MaxSendSize 1KBoppure disabilita l'account in AD secondo la procedura interna di incident response. - Taglia i canali mobili:
Set-CasMailbox <utente> -ActiveSyncEnabled $false -OWAEnabled $false - Svuota la coda dei messaggi in uscita di quell'utente, esportandone prima un campione come evidenza.
- Verifica se è stato impostato un inoltro o una regola di posta nascosta:
Get-Mailbox <utente> | fl Forwarding*eGet-InboxRule -Mailbox <utente> - Cambio password, revoca sessioni, escalation al responsabile della sicurezza. Documenta orari e azioni.
Playbook D — "La posta verso un dominio specifico non parte"
- Guarda la coda verso quel dominio:
Get-Queue | Where {$_.NextHopDomain -like "*dominio.it*"} | fl - Leggi
LastError: contiene la risposta testuale del server remoto, che spesso spiega tutto. - Verifica la risoluzione DNS dei record MX dal server:
Resolve-DnsName dominio.it -Type MX - Prova una connessione manuale in telnet verso il loro MX sulla porta 25.
- 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
Ogni messaggio riceve un punteggio SCL (Spam Confidence Level) da 0 a 9. Le soglie decidono cosa succede.
| Soglia | Parametro | Comportamento tipico |
|---|---|---|
| Cartella posta indesiderata | SCLJunkThreshold | Consegnato ma spostato in Posta indesiderata. |
| Quarantena | SCLQuarantineThreshold | Dirottato nella cassetta di quarantena, per revisione. |
| Rifiuto | SCLRejectThreshold | Rifiutato con NDR al mittente. |
| Eliminazione | SCLDeleteThreshold | Scartato 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,BlockedSendersAndDomainsParte 5 — Manutenzione, alta disponibilità e aggiornamenti
#5.1 I controlli periodici
Ogni giorno (10 minuti, L1)
| Controllo | Comando | Soglia di allarme |
|---|---|---|
| Servizi Exchange avviati | Test-ServiceHealth | Un solo servizio richiesto non avviato. |
| Code | Get-QueueDigest -Forest | Code oltre poche centinaia di messaggi, o in Retry da ore. |
| Copie database | Get-MailboxDatabaseCopyStatus * | Stato diverso da Mounted / Healthy. |
| Indice di ricerca | stessa uscita, colonna ContentIndexState | Diverso da Healthy. |
| Spazio disco | Get-Volume sui volumi di DB e log | Sotto il 20% libero: pianifica. Sotto il 10%: intervieni oggi. |
| Backup completato | Console del prodotto di backup | Un 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)}} -AutoOgni 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
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
# 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| Colonna | Cosa significa | Valore sano |
|---|---|---|
Status | Ruolo e salute della copia. | Mounted sull'attiva, Healthy sulle passive. |
CopyQueueLength | Log generati sull'attiva e non ancora copiati sulla passiva. | Vicino a 0. Numeri alti = problema di rete o di disco. |
ReplayQueueLength | Log copiati ma non ancora applicati al database. | Vicino a 0, salvo copie ritardate volutamente. |
ContentIndexState | Stato dell'indice di ricerca. | Healthy. Se Failed, le ricerche degli utenti non funzionano. |
ActivationPreference | Ordine 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
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
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 MaintenanceFase 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-QueueSolo 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:$falseSet-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
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
- Leggi le note di rilascio della CU specifica. Ogni CU ha le sue sorprese.
- Verifica requisiti di sistema e prerequisiti: possono essere cambiati rispetto alla CU installata.
- 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.
- Esegui e verifica un backup funzionante di Active Directory e di Exchange.
- Salva a parte tutte le personalizzazioni: file
web.config,EdgeTransport.exe.config, impostazioni TLS e crittografia del sistema operativo. Vengono sovrascritte. - Testa in un ambiente non di produzione, se ne avete uno.
- Riavvia il server prima di iniziare, per liberare riavvii in sospeso.
- Disattiva temporaneamente l'antivirus per la durata dell'installazione.
- Se il server è membro di un DAG, mettilo in modalità manutenzione (§5.5).
- 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
# 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 -AutoNella 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
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
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,LastLogonTimeParte 6 — Riferimenti rapidi
#6.1 Cheat sheet: dall'attività al comando
| Devo... | Comando | Liv. |
|---|---|---|
| Vedere la configurazione di una cassetta | Get-Mailbox <utente> | fl | L1 |
| Vedere quanto è grande una cassetta | Get-MailboxStatistics <utente> | L1 |
| Creare una cassetta su utente AD esistente | Enable-Mailbox -Identity <utente> -Database <DB> | L1 |
| Creare una cassetta condivisa | New-Mailbox -Shared -Name "<Nome>" -Alias <alias> | L1 |
| Aggiungere un alias | Set-Mailbox <utente> -EmailAddresses @{Add="<indirizzo>"} | L1 |
| Dare accesso completo | Add-MailboxPermission -Identity <cassetta> -User <utente> -AccessRights FullAccess -InheritanceType All | L1 |
| Dare Invia come | Add-ADPermission -Identity <cassetta> -User <utente> -ExtendedRights "Send As" | L1 |
| Dare Invia per conto di | Set-Mailbox <cassetta> -GrantSendOnBehalfTo @{Add="<utente>"} | L1 |
| Impostare le quote | Set-Mailbox <utente> -UseDatabaseQuotaDefaults $false -IssueWarningQuota ... -ProhibitSendQuota ... | L1 |
| Impostare un inoltro | Set-Mailbox <utente> -ForwardingAddress <destinatario> -DeliverToMailboxAndForward $true | L1 |
| Nascondere dalla rubrica | Set-Mailbox <utente> -HiddenFromAddressListsEnabled $true | L1 |
| Convertire in condivisa | Set-Mailbox <utente> -Type Shared | L1 |
| Aggiungere a un gruppo | Add-DistributionGroupMember -Identity <gruppo> -Member <utente> | L1 |
| Vedere i membri di un gruppo | Get-DistributionGroupMember <gruppo> | L1 |
| Disattivare ActiveSync a un utente | Set-CasMailbox <utente> -ActiveSyncEnabled $false | L1 |
| Vedere i telefoni di un utente | Get-MobileDeviceStatistics -Mailbox <utente> | L1 |
| Cancellare i dati aziendali da un telefono | Clear-MobileDevice -Identity <id> -AccountOnly | L1* |
| Cercare un messaggio | Get-MessageTrackingLog -Sender <mittente> -Start <ora> -End <ora> | L1 |
| Vedere le code, tutti i server | Get-QueueDigest -Forest | L1 |
| Forzare un nuovo tentativo di consegna | Retry-Queue -Filter "Status -eq 'Retry'" | L2 |
| Rimuovere messaggi da una coda | Get-Message -Queue <coda> -Filter ... | Remove-Message -WithNDR $false | L2 |
| Spostare una cassetta di database | New-MoveRequest -Identity <utente> -TargetDatabase <DB> | L2 |
| Esportare una cassetta in PST | New-MailboxExportRequest -Mailbox <utente> -FilePath <UNC> | L2 |
| Verificare i servizi | Test-ServiceHealth | L1 |
| Verificare le copie dei database | Get-MailboxDatabaseCopyStatus * | L1 |
| Verificare la replica del DAG | Test-ReplicationHealth | L2 |
| Spostare i database attivi di un server | Move-ActiveMailboxDatabase -Server <server> | L3 |
| Mettere un server in manutenzione | vedi §5.5, procedura completa | L3 |
| Verificare i certificati | Get-ExchangeCertificate | ft Thumbprint,Services,NotAfter | L1 |
#6.2 Porte da conoscere
| Porta | Protocollo | Usata da |
|---|---|---|
| 25 | SMTP | Posta fra server e da Internet. Connettori di ricezione. |
| 587 | SMTP autenticato | Invio da client e applicativi autenticati. |
| 465 | SMTPS | Invio implicito su TLS, usato da alcuni apparati. |
| 443 | HTTPS | OWA, ECP, EWS, ActiveSync, MAPI su HTTP, Autodiscover, OAB. La porta. |
| 80 | HTTP | Solo per redirezione verso HTTPS. |
| 110 / 995 | POP3 / POP3S | Client POP. |
| 143 / 993 | IMAP4 / IMAP4S | Client IMAP. |
| 2525 | SMTP interno | Ricezione fra servizi di trasporto interni sullo stesso server. |
| 50636 | LDAP sicuro (AD LDS) | Sincronizzazione EdgeSync verso i server Trasporto Edge. |
| 64327 | SMTP | Trasporto ridondante fra server Cassette postali. |
#6.3 Servizi critici
| Servizio | Se è fermo... |
|---|---|
MSExchangeIS (Information Store) | Nessuno accede alla propria posta. Il servizio più critico in assoluto. |
MSExchangeTransport | La posta non entra e non esce dal server. |
MSExchangeFrontEndTransport | Il server non accetta connessioni SMTP dall'esterno. |
MSExchangeRepl (Replica) | La replica DAG si ferma. Le code di copia crescono. |
MSExchangeADTopology | Praticamente tutto smette di funzionare: è la dipendenza di base. |
MSExchangeMailboxAssistant | Prenotazione sale, criteri di conservazione e assistenti vari si fermano. |
MSExchangeTransportLogSearch | Non 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
| Situazione | Chi la gestisce | Entro quanto escalare |
|---|---|---|
| Un utente non riceve una mail | L1 | Se dopo i playbook di §4.7 non hai una causa: 30 min. |
| Un utente non accede alla posta | L1 | Se OWA non funziona: subito a L2. |
| Richiesta di permessi, alias, quote, gruppi | L1 | Non si escala, si esegue. |
| Richiesta di wipe di un dispositivo | L1 con autorizzazione | Se l'autorizzazione non è chiara: non eseguire, escala. |
| Coda in crescita su un server | L2 | Se supera le migliaia di messaggi o dura oltre 1h: L3. |
| Account interno che invia spam | L1 blocca, L2 indaga | Contestualmente al blocco: subito a L2 e sicurezza. |
Copia database Failed o indice Failed | L2 | Subito a L3 se riguarda l'unica copia sana. |
| Certificato in scadenza | L2 | A 60 giorni: pianifica con L3. A 7 giorni: emergenza. |
| Database smontato | L3 | Immediato. Non tentare Mount-Database da soli. |
| Disco pieno su volume DB o log | L3 | Immediato. |
| Interruzione generale del servizio | L3 | Immediato, 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
| Termine | Significato |
|---|---|
| Alias | Nome breve interno di un destinatario, distinto dall'indirizzo di posta. |
| Autodiscover | Servizio che fornisce automaticamente ai client la configurazione della cassetta. |
| CAS | Client Access Services: i servizi di accesso client, integrati nel ruolo Cassette postali. |
| CU | Cumulative Update: aggiornamento cumulativo, installazione completa del prodotto. |
| DAG | Database Availability Group: insieme di server che ospitano copie replicate degli stessi database. |
| DSN / NDR | Notifica di stato o di mancata consegna generata dal sistema di trasporto. |
| EAC | Exchange Admin Center: la console web di amministrazione (/ecp). |
| EMS | Exchange Management Shell: PowerShell con i cmdlet Exchange. |
| EWS | Exchange Web Services: interfaccia usata da molte applicazioni di terze parti. |
| Failover | Attivazione non pianificata di una copia di database su un altro server. |
| MAPI su HTTP | Protocollo predefinito di connessione di Outlook nelle versioni recenti. |
| OAB | Offline Address Book: copia locale della rubrica usata da Outlook. |
| PAM | Primary Active Manager: il nodo del DAG che decide le attivazioni dei database. |
| SCL | Spam Confidence Level: punteggio antispam da 0 a 9. |
| SE | Subscription Edition: l'edizione a sottoscrizione di Exchange Server. |
| Shadow redundancy | Meccanismo che conserva una copia di scorta dei messaggi in transito. |
| Safety Net / Rete di sicurezza | Archivio dei messaggi già consegnati, usato per rinviare dopo un failover. |
| Switchover | Spostamento pianificato dell'attività da un server a un altro. |
| Trasporto Edge | Ruolo 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 -FulleGet-Help Set-Mailbox -Examplesrispondono 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).