Organizzare le cassette postali degli utenti

Published 11 March 08 05:32 PM | corrado 

Recentemente mi è capitato di dover creare, per un cliente, uno script che spostasse le cassette postali dei suoi utenti da exchange 2003 a exchange 2007 organizzandole però in base all'iniziale del cognome del'utente stesso.

Siccome credo possa essere utile, ho deciso di condividerlo con la community con il mio primo post su questo blog.

Inutile dirlo, requisito fondamentale è che nell'organizzazione sia presente almeno un server Exchange 2007 per poter avere accesso alla management shell.

NOTA BENE: questo non vuol dire che funziona solo su server Exchange 2007, anzi io posso spostare cassette anche da exchange 2003 a exchange 2003 o da exchange 2007 a exchange 2003, non ho vincoli in merito.

   1: #Definisco le variabili 
   2: #$dc = dominio dove recuperare i dati 
   3: #$recType = il tipo di mailbox da spostare. 
   4: $dc = "contoso.it" 
   5: $recType = "LegacyMailbox"

Il valore di $recType può essere impostato, a seconda della migrazione che si vuole eseguire, sui seguenti valori:

  • UserMailbox - Mailbox di Exchange 2007
  • LegacyMailbox - Mailbox di Exchange 2003
  • ResourceMailbox - Mailbox di risorse di Exchange 2007
  • RoomEquipmentMailbox - Mailbox di risorse di Exchange 2007 (Meeting Room, proiettori)
   1: #Definisco gli array che conterranno l'elenco degli utenti 
   2: #Uso gli array per poter poi lanciare il comando di move-mailbox 
   3: #su più cassette postali contemporaneamente altrimenti lavoreri mailbox per mailbox rallentando il processo
   4: $usersAB = @() 
   5: $usersCD = @() 
   6: $usersEF = @() 
   7: $usersGH = @() 
   8: $usersIJ = @() 
   9: $usersKL = @() 
  10: $usersMN = @() 
  11: $usersOP = @() 
  12: $usersQR = @() 
  13: $usersST = @() 
  14: $usersUV = @() 
  15: $usersWXYZ = @() 

L'uilizzo degli array per immagazzinare l'elenco degli utenti, è dovuto al fatto che poi così posso eseguire il comando "move-mailbox" in parallelo e non in "serie" sulle mailbox aumentando le prestazione dello script.

   1: #Definisco i DB di destinazione 
   2: #Questi devono ovviamente essere già stati definiti sul / sui server di destinazione. 
   3: #Posso infatti organizzare le mailbox su più server distinti
   4:  
   5: $maildbAB = "SRVExchange1\SG1\Utenti_A_B" 
   6: $maildbCD = "SRVExchange2\SG1\Utenti_C_D" 
   7: $maildbEF = "SRVExchange1\SG1\Utenti_E_F" 
   8: $maildbGH = "SRVExchange2\SG3\Utenti_G_H" 
   9: $maildbIJ = "SRVExchange1\SG3\Utenti_I_J" 
  10: $maildbKL = "SRVExchange2\SG3\Utenti_K_L" 
  11: $maildbMN = "SRVExchange1\SG4\Utenti_M_N" 
  12: $maildbOP = "SRVExchange2\SG4\Utenti_O_P" 
  13: $maildbQR = "SRVExchange1\SG4\Utenti_Q_R" 
  14: $maildbST = "SRVExchange2\SG5\Utenti_S_T" 
  15: $maildbUV = "SRVExchange1\SG5\Utenti_U_V" 
  16: $maildbWXYZ = "SRVExchange2\SG5\Utenti_W_X_Y_Z" 
  17:  

Qui volevo solo far notare la possibilità di dividere le cassette postali su più server, a patto di aver creato in precedenza gli store necessari.

   1: #In questo ciclo popolo gli array di utenti                                                 
   2: $users = Get-User -DomainController $dc -RecipientTypeDetails $recType | select identity,@{n='Initial';e={$_.LastName.substring(0,1).ToUpper()}} 
   3: foreach ($user in $users){ 
   4:     switch -regex ($user.initial) { 
   5:         "[A-B]" {$usersAB += $user.identity} 
   6:         "[C-D]" {$usersCD += $user.identity} 
   7:         "[E-F]" {$usersEF += $user.identity} 
   8:         "[G-H]" {$usersGH += $user.identity} 
   9:         "[I-J]" {$usersIJ += $user.identity} 
  10:         "[K-L]" {$usersKL += $user.identity} 
  11:         "[M-N]" {$usersMN += $user.identity} 
  12:         "[O-P]" {$usersOP += $user.identity} 
  13:         "[Q-R]" {$usersQR += $user.identity} 
  14:         "[S-T]" {$usersST += $user.identity} 
  15:         "[U-V]" {$usersUV += $user.identity} 
  16:         "[W-Z]" {$usersWXYZ += $user.identity} 
  17:         } 
  18: } 

Ho creato prima una HashTable con chiave "iniziale utente" e valore "identity utente"; per ogni utente poi ho verificato la chiave nel costrutto "switch" per poter ciclare nell'elenco utenti una sola volta, velocizzando il processo di caricamento array. L'utilizzo di "-regex" mi ha permesso di ridurre al minimo i "casi" da valutare. Per evitare problemi poi di case dei caratteri ho portato le iniziali in caratterre maiuscolo.

   1: #Sposto le mailbox per gruppi di utenti
   2: $usersAB | Move-Mailbox -TargetDatabase $maildbAB -Confirm:$TRUE 
   3: $usersCD | Move-Mailbox -TargetDatabase $maildbCD -Confirm:$TRUE 
   4: $usersEF | Move-Mailbox -TargetDatabase $maildbEF -Confirm:$TRUE 
   5: $usersGH | Move-Mailbox -TargetDatabase $maildbGH -Confirm:$TRUE 
   6: $usersIJ | Move-Mailbox -TargetDatabase $maildbIJ -Confirm:$TRUE 
   7: $usersKL | Move-Mailbox -TargetDatabase $maildbKL -Confirm:$TRUE 
   8: $usersMN | Move-Mailbox -TargetDatabase $maildbMN -Confirm:$TRUE 
   9: $usersOP | Move-Mailbox -TargetDatabase $maildbOP -Confirm:$TRUE 
  10: $usersQR | Move-Mailbox -TargetDatabase $maildbQR -Confirm:$TRUE 
  11: $usersST | Move-Mailbox -TargetDatabase $maildbST -Confirm:$TRUE 
  12: $usersUV | Move-Mailbox -TargetDatabase $maildbUV -Confirm:$TRUE 
  13: $usersWXYZ | Move-Mailbox -TargetDatabase $maildbWXYZ -Confirm:$TRUE

A questo punto sposto le cassette postali per gruppi di iniziali.

Il "-confirm:$true" può essere impostato a "$false" dopo le prime prove, per evitare interazione da parte dell'utente.

Alla prossima puntata...

Corrado

Filed under: ,

Comments

No Comments
Anonymous comments are disabled