martes, 28 de enero de 2014

Get-Mailbox muesta información erronea en ServerName

Contar la cantidad de mailboxes que hay dentro de un MailboxServer puede resultar más complejo de lo que parece.
 
Si utilizamos el cmdlet:
 
Get-Mailbox -Server -ResultSize Unlimited | Measure-Count
 
obtendremos la cantidad de casillas (Figura 1)
 
Figura 1

 
Pero si utilizamos el cmdlet:
 
Get-MailboxDatabase -Server | Get-Mailbox  -ResultSize Unlimited | Measure-Count
 
obtendremos un número diferente de casillas (Figura 2)
 
Figura 2
 
 
Esto se debe a que Exchange Server 2010 no actualiza el atributo msExchHomeServerName cuando se mueve un usuario a otro servidor. Por eso cuando consultamos por un usuario, el nombre del servidor puede estar desactualizado (Figura 3).
 
Figura 3
 
En este caso, el server MIRSWMBX100 no existe dentro de la organización de Exchange Server, pues éste fue removido y los usuarios pasaron al servidor MIRSWMBX105.
 
Para actualizar múltiples usuarios podemos usar el script Clear-ServerName.ps1, que acepta dos parámetros:

-OldServer: Para indicar el servidor que ya no existe más y queremos actualizar
-ListOnly: Para indicar que solo queremos listar los usuarios con un server erróneo, pero no actualizarlos (Comportamiento predeterminado)
 
Para listar los usuarios que tienen el parámetro ServerName incorrecto, podemos buscar el nombre del server y -ListOnly en $True (Figura 4).
 
.\Clear-ServerName.ps1 -OldServer ServerName -ListOnly:$True 
 


Figura 4

Con el parámetro -ListOnly:$False, se actualiza la información en los Mailboxes de los usuarios (Figura 5).

.\Clear-ServerName.ps1 -OldServer ServerName -ListOnly:$false

Figura 5

Podemos comprobarlo con un Get-Mailbox (Figura 6)

Figura 6
 
Para crear el script, hay que copiar el siguiente texto en un editor (por ejemplo Notepad.exe) y guardarlo con la extensión .ps1
 
Param(
 [string]$OldServer,
 [switch]$ListOnly=$True
)

Set-ADServerSettings -ViewEntireForest 1
Write-Host "Searching for Server" $OldServer
If ($ListOnly -ne $False) {$ListOnly = $True}
Write-Host "List Only" $ListOnly
Write-Host
 
$Mailboxes=$null
[int]$a= (Get-Mailbox * -ResultSize Unlimited| where {$_.Servername -eq $OldServer} | Measure-Object).count
Write-host "Total Mailbox found:" $a
if ($a -eq 0)
{write-host "No Mailboxes found on server" $oldServer}
Else
{
    $Mailboxes = Get-Mailbox * -ResultSize Unlimited| where {$_.Servername -eq $OldServer}
   
    foreach ($Mailbox in $Mailboxes)
    {
    $MBX = $null;
    $MBX = Get-Mailbox -Identity $Mailbox
    If ($ListOnly -ne $True)
 {
    write-Host "Updating" $Mbx;
    Set-Mailbox $MBX -Database $MBX.Database -Confirm:$false -Force
    }
    else
 {$NewServer=(Get-MailboxDatabase $MBX.Database | Select Server);
    write-Host $MBX;
    write-Host $NewServer
    }
    }
}
 
Gracias a Yusuf por su artículo y los consejos para el script. 
 

No hay comentarios: