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. 
 

martes, 17 de diciembre de 2013

¿ De que color es tu server ? - Lab Tip Nro 3


¿Cómo saber si un server es una instalación full o un server core antes de iniciar sesión? ¡Muy simple! Podés ver el color de la pantalla.

Si es un Windows Server 2012/R2 con instalación Server Core, la pantalla es azul (Figura 1). Si es un Windows Server 2012/R2 con instalación GUI (o MSI), la pantalla es gris (Figura 2).

Figura 1

Figura 2

martes, 10 de diciembre de 2013

OU no se pueden mover en Active Directory

Como Administrador del dominio, existen acciones que no podemos ejecutar. Una de ellas es intentar mover una OU a otra ubicación dentro de nuestro AD, lo que provoca un error de "Access is Denied." (Figura 1).
 
Windows cannot move object "Name" because: Access is denied
Figura 1
 
Esto ocurre porque desde Windows Server 2008 en adelante, cada vez que se crea una OU, el objeto tiene protección contra borrado accidental. Esta protección evita también que se mueva una OU. Para ver si la OU está protegida o no, debemos seleccionar las opciones avanzadas (Advanced Features) en el ADUC (Figura 2).
 
Figura 2
 
 
Y luego ver las propiedades del objeto (Figura 3).
 
Figura3
 
Al quitar el tilde, es posible mover el objeto a su destino final sin problemas. Es recomendable volver a colocarlo una vez realizado el movimiento.

¿Qué es lo que impide que un Administrador del dominio no pueda borrar o mover un objeto? Simplemente que el grupo Everyone tiene negada la posibilidad de borrar el objeto (Figura 4).
 
Figura 4

viernes, 22 de noviembre de 2013

Mailbox Database sin copia en DAG de Exchange 2010. Evento 4113.

Exchange Server 2010 realiza una comprobación de cuántas copias hay disponibles de cada Mailbox Database. Cuando la cantidad de copias es solo una, podemos ver un evento 4113 registrado en el Event Log (Figura 1).

Figura 1
 
 
Adicionalmente, si tenemos SCOM para monitorear nuestros equipos, vemos la siguiente alarma (Figura 2).
 
KHI:This database has had only one healthy copy from over 20 minutos of the last hour.
Figura 2

Exchange realiza esta comprobación mediante un script llamado CheckDatabaseRedundancy.ps1 que se encuentra en la carpeta scripts de nuestro servidor de Exchange. Podemos ejecutarlo desde una consola de Power Shell EMS para ver su resultado (Figura 3).

Figura 3

En la figura 3 se ve que las bases que tienen solo una copia figuran en estado Rojo (Red), mientras que las que tienen al menos dos copias aparecen en estado verde (Green).
 
Sin embargo existe la posibilidad de que necesitemos que algunas bases sean ignoradas en este control, dado que tener alta disponibilidad en las bases es una opción, no es obligatorio.
 
Recientemente en la empresa Daris me solicitaron que ignorara las bases marcadas como "DARB", pues esas bases correspondían a usuarios "Básicos", según ellos habían definido en su nomenclatura. Para realizar eso, en el script de control, cambiamos una línea:
 
[string] $SkipDatabasesRegex = "DARB",

Si volvemos a ejecutar el script, vemos que esas bases no se controlan (Figura 4 ).


Figura 4
Luego me pidieron que se ignorararan además las bases que contenían "DARA", dado que éstas son bases de pruebas para aplicativos, por lo cual tampoco necesitaban tener alta disponibilidad.
 
Para ignorar qué Mailbox Databases se deben verificar, este script utiliza  una "Regular Expression" en Power Shell, entonces construimos una que incluya ambas cadenas.
 
[string] $SkipDatabasesRegex = "DARB|DARA",

Cuando ejecutamos el script podemos ver que ya no aparecen las bases que concuerdan con nuestra regular expression (Figura 5), tampoco aparecen más los eventos 4113 ni las alertas de scom.

Figura 5
 
Para construir estas regular expressions hay algunas opciones simples, pero muy interesantes:

"Texto" = Ignora las Mailbox Databases que incluyen "Texto" en cualquier parte.
Ej "EsteTexto"

"^Texto" = Ignora las Mailbox Databases que comienzan con "Texto".
Ej "TextoDeEjemlo"

"Texto$" = Ignora las Mailbox Databases que finalizan con "Texto".
Ej "EjemploDeTexto"

"|" = El separado "Pipe" funciona como un "or" y nos permite incluir varias expresiones.
Ej:"Texto1|Text2"

lunes, 7 de octubre de 2013

Removiendo Exchange Server 2010 Provisionados

Antes de instalar un Exchange Server 2010, un miembro del grupo Organization Management debe provisionar la cuenta de equipo en donde se realizará la instalación.
 
Setup.com /NewProvisionedServer:ServerName
 
De forma similar, cuando alguien que no es miembro de ese grupo desinstala un Exchange Server 2010 (por renovación de hardware, migración, etc.) hay que desaprovisionar la cuenta de equipo para evitar que Exchange Server 2010 se vuelva a instalar en ese server. Podemos utilizar un cmdlet para verificar si hay algún server en este estado dentro de la organización de Exchange  (Figura 1).

Get-ExchangeServer | ? {$_.ServerRole -like "*Provisioned*"} | ft Name, ServerRole,Edition -AutoSize






Figura 1

Con el "Setup.com" de Exchange Server 2010 es posible desaprovisionar el equipo.

Setup.com /RemoveProvisionedServer:ServerName

viernes, 13 de septiembre de 2013

Lab Tip Nro 2 - Imagen lista con Server Core

Para acelerar el armado de algún ambiente de laboratorio, siempre es bueno tener un archivo .vhd (o vhdx) listo y con sysprep para poder copiarlo en los equipos que queremos crear.
 
Desde Windows Server 2012, las ediciones Standard y Enterprise tienen las mismas características técnicas. También es posible pasar de Server Core a instalación con GUI sin necesidad de reinstalar el sistema operativo.

Con estas novedades, es posible utilizar un solo .vhd (o .vhdx) para armar máquinas con diferentes roles (DC, Cluster, File Server, etc), basadas en un server core (lo que reduce el espacio de almacenamiento) y con la opción de agregarle GUI en caso de ser necesario.

Cambiar de Server Core a un server con GUI es bastante simple, solo necesitamos un cmdlet de PowerShell ...
 
Install-WindowsFeature  Server-Gui-Shell
 
Pero cuando intenté realizar esto en mi lab con Windows Server 2012 R2, me encontré con un error (Figura 1).
 
Figura 1 
 
Install-WindowsFeature : The request to add or remove features on the specified server failed.
Installation of one or more roles, role services, or features failed.
The source files could not be downloaded.

 
Para ver qué estaba pasando, me ayudé con otro cmdlet (Figura 2).

Get-WindowsFeature Server-GUI-Shell | fl Name,InstallState,DependsOn
 
Figura 2
 
Con Windows Server 2012 R2, no todas las características son copiadas al disco rígido al momento de la instalación. En este caso el "InstallState: Removed" nos indica que no está disponible.

Ejecutamos nuevamente el primer cmdlet, pero agregando un parámetro extra para indicar donde está el archivo .wim de instalación para que lo use como fuente de los componentes faltantes (Figura 3).

-source:wim:D:\sources\install.wim:2

Figura 3

Así nuestro equipo originalmente creado con una instalación de Windows Server 2012 R2 Core, después de ser reiniciado, ya tiene GUI.
 

sábado, 31 de agosto de 2013

¿Que paso ayer?... Con los mails

Exchange Server 2010 guarda, de forma predeterminada, información de seguimiento de los correos que los usuarios envían y reciben. Estos logs son útiles cuando queremos saber qué pasó con un mail.
 
Como casi todo lo relacionado con Exchange Server 2010, la forma más simple de acceder a estos logs es a través de PowerShell.
 
Lo primero es identificar qué mensaje queremos buscar, para lo que podemos utilizar el campo "MessageID" el cual es único para cada mensaje. En muchos casos podemos consultar el "MessageID" en el "Internet Header" del mensaje, pero algunas veces esta información no está disponible ahí, en ese caso podemos consultarlo con PowerShell (Figura 1).

Con el "Subject" del mensaje del cual queremos obtener información y el nombre del Mailbox Server del usuario que envió o recibió el mensaje, podemos hacer la consulta del "MessageID".
 
Get-MessageTrackingLog -Server ARRMBX010 -MessageSubject "MAIL PARA TRACK" | fl EventID, Sender, Mess*ID
 
Figura 1
 
Con el "MessajeID" podemos buscar en los servers que tienen información de Tracking (Los Hub Transport y los Mailbox Servers). Si tenemos unos pocos servers, la búsqueda es simple.
 
 Get-MessageTrackingLog -Server ARRMBX010 -MessageId C1CE5ADA5ED3D246B3E6095DA22AF1FA1D4A67FC@ARRMBX010.arrakis.org | ft EventId, Source, Sender, Recipients, *HostName, Time*
 
Podemos ir cambiando el valor "Server" y de esa forma buscar en otros servidores.  
 
Cuando la infraestructura es más compleja, ¿Como podemos buscar tracking logs en varios servers, que están en diferentes sites-AD, que sean Exchange 2010 y no sean UM ni Client Access? Combinando algunos cmdlets!
 
Get-ExchangeServer: Para obtener el listado de los servers.
Where-Object: Para filtrar esos resultados.
Get-MessageTrackingLog: Para obtener la información de los archivos de logs.
Ft (Format-Table) o Fl (Format-List) : Para seleccionar las propiedades que queremos ver.
 
 
Get-ExchangeServer | Where-Object {($_.AdminDisplayVersion -Like "*14*") -and ($_.ServerRole -ne "UnifiedMessaging" -and $_.ServerRole -ne "ClientAccess") -and ($_.Site -like "*DuneNorte*" -or $_.Site -like "*DuneOeste*")} | Get-MessageTrackingLog -MessageId C1CE5ADA5ED3D246B3E6095DA22AF1FA1D4A7282@ARRMBX010.arrakis.org | ft EventId, Source, Sender, Recipients, *HostName, Time*

La información se mostrará de forma similar al ejemplo (Figura 2)

Figura 2


Para saber qué significan las diferentes combinaciones de "EventId" y "Source", se puede consultar la documentación de TechNet.

Understanding Message Tracking