Using the Exchange Management Shell for Bulk Recipient Management

 

Ultima modifica dell'argomento: 2007-03-26

Di Serdar Soysal

In Microsoft Exchange Server 2007 è possibile eseguire molte delle attività di gestione dei destinatari sia in Exchange Management Console che in Exchange Management Shell. Per le attività che riguardano singoli destinatari, generalmente è più semplice utilizzare Exchange Management Console (a meno che non si sia immuni dagli errori di battitura). Invece, per configurare più destinatari, la soluzione più potente e semplice è sicuramente Exchange Management Shell.

Nel mio caso la curva di apprendimento per Exchange Management Shell può essere riassunta in tre fasi.

  1. "Bello, bellissimo! Ma sembra complicato"

  2. "Beh, ho appena creato una cassetta postale senza usare il mouse!"

  3. "Non tornerò mai più all'interfaccia utente. Neanche per sogno. Niente mi farà cambiare idea!"

Forse la descrizione della terza fase è un po' troppo entusiasta, ma rende l'idea. L'articolo Concetti di base relativi a Exchange Management Shell pubblicato nel gennaio 2007 consente di superare le prime due fasi. Poi, con il presente articolo si giunge alla terza fase, almeno per la gestione dei destinatari.

Per rendere la cosa più divertente, guardiamo come Amy, un amministratore dei destinatari, utilizza Exchange Management Shell per portare a termine le attività assegnatele un lunedì.

Creazione di cassette postali

Ogni lunedì Amy deve creare subito le cassette postali di tutti i nuovi assunti della settimana. Il reparto Risorse umane invia a Amy un file CSV ogni lunedì mattina contenente i nomi e nomi utente dei nuovi assunti. Di solito i file CSV inviati dal reparto Risorse umane sono di questo tipo:

Name,User Name
David Hamilton,DHamilton
Ezio Alboni,EAlboni
Rajesh M. Patel,RPatel
Kevin Liu,KLiu

Per creare nuove cassette postali, Amy deve completare tutte le seguenti attività:

  • Aggiungere l'estensione UPN contoso.com a ciascun nome utente.

  • Assegnare pass@word1 come password iniziale.

  • Configurare l'utente perché cambi la password al primo accesso.

  • Specificare il database delle cassette postali e l'unità organizzativa in cui posizionare le nuove cassette postali.

Quando le è stata assegnata per la prima volta questa attività ricorrente, Amy ha deciso di utilizzare Exchange Management Shell per eseguirla rapidamente. Innanzitutto ha eseguito il comando New-Mailbox per creare un utente di prova denominato Utente test 1.

New-Mailbox -Name "Test User 1" -UserPrincipalName "TUser1@contoso.com" -OrganizationalUnit "contoso.com/Users" -Database "Server01\Mailbox Database" -ResetPasswordOnNextLogon $true

Il comando ha funzionato ma le è stato richiesto di immettere la password del nuovo utente. Il cmdlet New-Mailbox accetta solo stringhe protette per il parametro password, quindi Amy non ha potuto utilizzare il valore della password predefinita come testo non crittografato nel comando. Per superare l'ostacolo, ha utilizzato il cmdlet ConvertTo-SecureString per creare una stringa protetta a partire dalla password predefinita e archiviarla nella variabile definita dall'utente $Temp. Quindi ha trasmesso la variabile al parametro password del cmdlet New-Mailbox.

$Temp = ConvertTo-SecureString "pass@word1" -asPlainText -force
New-Mailbox -Name "Test User 1" -UserPrincipalName "TUser1@contoso.com" -OrganizationalUnit "contoso.com/Users" -Database "Server01\Mailbox Database" -Password $Temp -ResetPasswordOnNextLogon $true

Il passaggio successivo è stato quello di leggere le informazioni sull'utente dal file CSV e automatizzare il provisioning. Dopo aver rivisto gli esempi di gestione di massa nel blog del team di Microsoft Exchange Oneliner della gestione dei destinatari di Exchange Server 2007 (informazioni in lingua inglese) Amy ha modificato il proprio script per completare questa attività.

Nota

UNRESOLVED_TOKEN_VAL(exBlog)

$Temp = ConvertTo-SecureString "pass@word1" -asPlainText -Force
Import-CSV "C:\NewUsers.csv" | ForEach-Object -Process {New-Mailbox -Name $_.Name -UserPrincipalName "$($_.UserName)@contoso.com" -OrganizationalUnit "contoso.com/Users" -Database "Server01\Mailbox Database" -Password $Temp -ResetPasswordOnNextLogon $true}

Amy è riuscita a impostare questo script copiando la sintassi dall'esempio riportato sull'articolo del blog. Tuttavia non ha capito la funzione della sintassi $_. Dopo alcune ricerche, ha trovato l'argomento Variabili Shell e ha capito che $_ è una variabile di Exchange Management Shell che contiene l'oggetto pipeline corrente. Quindi, ogni volta che nello script di Amy viene eseguito il blocco di script specificato con il parametro Process, la variabile $_ contiene i dati della riga successiva del file CSV.

Un'altra parte non chiara a Amy era la sintassi utilizzata durante l'impostazione del nome principale dell'utente. Era diversa perché il valore della variabile non era assegnato direttamente a un parametro del cmdlet New-Mailbox, ma utilizzato per modificare una stringa assegnata al parametro. Amy ha consultato l'argomento Sintassi nel quale viene discussa la sintassi dei comandi per Exchange Management Shell e ha capito che la sintassi $() viene utilizzata per sostituire l'output di un comando come argomento in uno script. In Exchange Management Shell se si immette solo una variabile, il suo valore corrisponde all'output. Pertanto, quando si inserisce una variabile in un blocco $(), il blocco viene sostituito con il valore della variabile. Nello script di Amy la variabile $_.UserName contiene il nome utente. Inserendo questa variabile nella sintassi $(), Amy è riuscita a inserire il valore della variabile alla stringa assegnata al parametro UserPrincipalName.

Dopo aver acquisito più informazioni sulla sintassi dei comandi in Exchange Management Shell, Amy ha proseguito spostando la prima riga dello script nel parametro Begin del cmdlet ForEach-Object ottenendo il suo primo oneliner per la gestione di massa dei destinatari. Ogni lunedì a lei basta inserire l'ultimo file CSV inviato dal reparto Risorse Umane nel seguente script.

Import-CSV "C:\NewUsers.csv" | ForEach-Object -Begin {$Temp = ConvertTo-SecureString "pass@word1" -asPlainText -Force} -Process {New-Mailbox -Name $_.Name -UserPrincipalName "$($_.UserName)@contoso.com" -OrganizationalUnit "contoso.com/Users" -Database "Server01\Mailbox Database" -Password $Temp -ResetPasswordOnNextLogon $true}

Il file CSV di oggi, invece, sembra leggermente diverso. Il reparto Risorse Umane vi ha aggiunto titoli e reparti dei nuovi dipendenti.

Name,User Name,Title,Department
Deepak Kumar,DKumar,Marketing Analyst,Marketing
Ray Chow,RChow,Sales Associate,Sales
David Simpson,DSimpson,Sales Associate,Sales
Isabel Martins,IMartins,Administrative Assistant,Accounting

Lo script di Amy, così com'è, non funzionerà con il nuovo file CSV perché i campi del titolo e del reparto possono essere aggiornati solo utilizzando il cmdlet Set-User. Amy pensa inizialmente di preparare un altro script per leggere lo stesso file e successivamente utilizzare il cmdlet Get-User per eseguire il pipelining dell'output nel cmdlet Set-User. Poi invece, poiché può anche eseguire la pipeline dell'output del cmdlet New-Mailbox nel cmdlet Set-User, decide semplicemente di modificare il suo oneliner esistente.

Import-CSV "C:\NewUsers.csv" | ForEach-Object -Begin {$Temp = ConvertTo-SecureString "pass@word1" -asPlainText -force} -Process {New-Mailbox -Name $_.Name -UserPrincipalName "$($_.UserName)@contoso.com" -OrganizationalUnit "contoso.com/Users" -Database "Server01\Mailbox Database" -Password $Temp -ResetPasswordOnNextLogon $true | Set-User -Title $_.Title -Department $_.Department}

Per assicurarsi che la sintassi sia corretta, Amy consulta gli argomenti Utilizzo di Exchange Management Shell e Cmdlet delle cassette postali e dei destinatari in Microsoft Exchange Server 2007. Dopo aver eseguito il suo nuovo oneliner, Amy consulta Script con Windows PowerShell: Script Center (informazioni in lingua inglese) per ulteriori informazioni sugli script in Microsoft Windows PowerShell.

Utilizzo di filtri con attività per i destinatari

Poco prima di uscire per la pausa pranzo, Amy riceve un messaggio di posta elettronica da Joe, il suo superiore. Joe ha ricevuto una segnalazione dal reparto Marketing: i dipendenti del Marketing inviano spesso messaggi con allegati di grandi dimensioni e la quota di archiviazione aziendale corrente non è sufficiente. Joe le chiede quindi di alzare la quota Impedisci l'avvio di ciascun membro del Marketing a 500 MB e di rimuovere la quota Impedisci invio. Le chiede questo intervento anche per tutti i quadri dell'azienda.

Amy sa che può utilizzare il cmdlet Get-User per ottenere un elenco di tutti i membri del reparto Marketing o per ottenere titoli specifici ma non sa bene come impostare i filtri corretti. Ancora una volta consulta la documentazione del prodotto. Per ulteriori informazioni sull'impostazione di filtri destinatario personalizzati, consulta Creazione di filtri nei comandi del destinatario. Per esaminare l'elenco di operatori disponibili da utilizzare nei filtri, Amy consulta Operatori di confronto. Quindi verifica che il seguente comando restituisca tutte le cassette postali utente del reparto Marketing.

Get-User -Filter {Department -eq 'Marketing' -and RecipientTypeDetails -eq 'UserMailbox'}

Grazie ai coerenti standard di provisioning delle cassette postali disponibili nella sua azienda, Amy sa che tutti e solo i quadri dell'organizzazione presentano la parola Manager, VP o Responsabile nel titolo. Per ottenere le cassette postali di tutti i quadri dell'organizzazione, imposta il seguente filtro.

Get-User -Filter {((Title -like '*Manager*') -or (Title -like '*VP*') -or (Title -like '*Officer*')) -and (RecipientTypeDetails -eq 'UserMailbox')}

Quindi combina i due filtri e inserisce l'output nel comando Set-Mailbox nel seguente oneliner. Imposta la quota di avviso su 450 MB in quanto, in base ai criteri aziendali, deve essere inviato un avviso quando la cassetta postale di un utente raggiunge il 90% di capacità.

Get-User -Filter {((Title -like '*Manager*') -or (Title -like '*VP*') -or (Title -like '*Officer*') -or (Department -eq 'Marketing')) -and (RecipientTypeDetails -eq 'UserMailbox')} | Set-Mailbox -IssueWarningQuota 450MB -ProhibitSendQuota 500MB -ProhibitSendReceiveQuota unlimited -UseDatabaseQuotaDefaults $false 

Amy avvisa il suo superiore di essersi occupata delle quote delle cassette postali del reparto Marketing e dei quadri. Programma mentalmente di fissare un incontro con Joe per rivedere i requisiti di archiviazione per i server cassette postali e può finalmente andare a pranzo.

Configurazione dei destinatari

Di ritorno dal pranzo, Amy vede un messaggio di Joe che la ringrazia per essersi occupata subito delle quote di archiviazione. Le chiede di inviargli un elenco del personale cui è stata aggiornata la quota di archiviazione, in modo che lui possa recapitare un messaggio che annuncia la modifica. Amy decide di semplificargli il compito creando un gruppo di distribuzione. Innanzitutto crea un gruppo di distribuzione denominato Eccezioni delle quote. Per compilare l'elenco dei membri per il nuovo gruppo di distribuzione, Amy utilizza il cmdlet ForEach-Object e il filtro utilizzato per configurare le cassette postali.

New-DistributionGroup -Name "Quota Exceptions" -OrganizationalUnit "contoso.com/Users" -SamAccountName "QuotaExceptions" -Type Distribution
Get-User -Filter {((Title -like '*Manager*') -or (Title -like '*VP*') -or (Title -like '*Officer*') -or (Department -eq 'Marketing')) -and (RecipientTypeDetails -eq 'UserMailbox')} | ForEach-Object -Process {Add-DistributionGroupMember -Identity "Quota Exceptions" -Member $_.Name}

Per assicurarsi che questo gruppo di distribuzione non venga utilizzato accidentalmente, lo configura per l'accettazione solo di messaggi provenienti dal suo superiore e lo nasconde dagli elenchi di indirizzi di Exchange eseguendo il seguente comando.

Set-DistributionGroup -Identity "Quota Exceptions" -AcceptMessagesOnlyFrom "Joe Healy" -HideFromAddressListsEnabled $true

Un istante prima di comunicare a Joe il gruppo di distribuzione, Amy immagina che anche in futuro potrebbe essere necessario configurare le quote per questi utenti di cassette postali. Sarebbe utile avere un gruppo di distribuzione aggiornato per questi utenti. Quindi decide di utilizzare un gruppo di distribuzione dinamico, in modo che le informazioni siano sempre aggiornate. Rimuove il gruppo di distribuzione appena creato e crea al suo posto il gruppo di distribuzione dinamico denominato Manager e utenti del reparto Marketing. Utilizza il filtro impiegato per il cmdlet Get-User come filtro destinatario per il nuovo gruppo di distribuzione dinamico.

New-DynamicDistributionGroup -Name "Managers and Marketing Department Users" -Alias "MgrsMktgUsers" -OrganizationalUnit Users -RecipientFilter {((Title -like '*Manager*') -or (Title -like '*VP*') -or (Title -like '*Officer*') -or (Department -eq 'Marketing')) -and (RecipientTypeDetails -eq 'UserMailbox')} | Set-DynamicDistributionGroup -AcceptMessagesOnlyFrom "Joe Healy" -HiddenFromAddressListsEnabled $true

Seguendo i passaggi descritti in Come visualizzare i membri di un gruppo di distribuzione dinamico, Amy verifica che il gruppo di distribuzione dinamico sia impostato correttamente. Comunica al superiore che gli basterà inviare il suo messaggio all'indirizzo di posta elettronica MgrsMktgUsers@contoso.com e gli spiega la configurazione del gruppo di distribuzione dinamico.

Connessione di cassette postali

A questo punto Amy accede allo strumento di gestione degli incidenti e verifica i ticket di servizio inoltrati dal servizio di assistenza. Trova una richiesta di riconnessione di una cassetta postale, Don Hall, disabilitata due settimane prima. Amy ha connesso un'altra cassetta postale il mese prima. All'epoca non sapeva in quale database risiedesse la cassetta postale utente al momento della disconnessione. Utilizzando Exchange Management Console aveva dovuto connettersi a ciascun server cassette postali per vedere se conteneva la cassetta postale disconnessa.

Ora non vuole ripetere la ricerca e decide di trovare un modo alternativo per determinare quale server contiene la cassetta postale disconnessa. Viene a sapere che i dati restituiti dal cmdlet Get-MailboxStatistics includono informazioni sulle cassette postali disconnesse. Tuttavia desidera restringere l'output di questo cmdlet alla cassetta postale cercata. Consultando l'argomento Utilizzo dell'output di comando capisce che il cmdlet Where può fare al caso suo. Per effettuare una verifica, crea una cassetta postale di prova denominata Test User 1 nel database delle cassette postali MBX4 sul Server03 e la disabilita. Successivamente esegue il seguente comando:

Get-MailboxStatistics -Database "Server03\MBX4" | Where {$_.DisplayName -eq 'Test User 1'}

Il cmdlet restituisce il seguente risultato:

DisplayName         ItemCount    StorageLimitStatus    LastLogonTime
-----------         ---------    ------------------    -------------
Test User 1         434                  BelowLimit

Il filtro funziona come previsto ma l'output del cmdlet non è molto utile a Amy nel formato corrente. Infatti, poiché prevede di utilizzare questo cmdlet per individuare il server aziendale che contiene la cassetta postale disconnessa, Amy ha bisogno che nell'output sia presente il nome visualizzato, il nome server e il nome del database. Quindi sceglie per l'output del cmdlet un formato adeguato.

Get-MailboxStatistics -Database "Server03\MBX4" | Where {$_.DisplayName -eq 'Test User 1'} | Format-Table DisplayName,ServerName,DatabaseName

Viene visualizzato il seguente risultato a lei più utile:

Display Name        ServerName          DatabaseName
------------        ----------          ------------
Test User 1         Server03            MBX4

Ora che Amy ha ottenuto la sintassi dei comandi che desiderava, vuole che il comando esamini tutti i database delle cassette postali nell'organizzazione, non uno specifico. Esegue quindi il pipelining dell'output del cmdlet Get-MailboxDatabase alla sintassi dei comandi creata ed esegue il seguente oneliner.

Get-MailboxDatabase | Get-MailboxStatistics | Where {$_.DisplayName -eq 'Don Hall'} | Format-Table DisplayName,ServerName,DatabaseName

Il cmdlet funziona come previsto e individua il database delle cassette postali in cui risiedeva la cassetta postale di Don Hall prima di essere disconnessa. Prosegue e combina i passaggi descritti in Come connettere una cassetta postale con il suo oneliner e utilizza il seguente comando per connettere la cassetta postale.

Get-MailboxDatabase | Get-MailboxStatistics | Where {$_.DisplayName -eq 'Don Hall'} | Connect-Mailbox -User DHall@contoso.com

Amy passa il resto della giornata alla ricerca di nuove informazioni nel sito Microsoft Exchange Server TechCenter e nel Blog del team di Microsoft Exchange (informazioni in lingua inglese).

Nota

UNRESOLVED_TOKEN_VAL(exBlog)

Ulteriori informazioni

Come dimostrano gli esempi, è possibile completare rapidamente attività apparentemente complesse di gestione dei destinatari combinando più cmdlet e diverse funzionalità di Exchange Management Shell.

Per ulteriori informazioni sulla gestione dei destinatari in Exchange 2007 e Exchange, vedere le seguenti risorse:

Serdar Soysal Serdar Soysal - Senior Technical Writer, Microsoft Exchange Server