martes, 25 de noviembre de 2014

Remove-MoveRequest falla con AccessDeniedException en Exchange Server

Durante una transición de Exchange Server de 2010 a Exchange Server 2013 nos encontramos con un problema cuando se intentó mover el "Archive" de un usuario a otra MailboxDatabase.
 
En un principio, obtuvimos un error que indicaba que ya existía un MoveRequest anterior, por lo que lo verificamos y lo intentamos eliminar (Figura 1).


Figura 1

El error de AccessDeniedException nos hizo dudar, debido a que la cuenta con la que realizabamos la operación era miembro del grupo de RBAC "Organization Management". Finalmente encontramos que la cuenta en algún momento de la transición había sido movida a Exchange Server 2013 y luego vuelto a Exchange Server 2010.
 
Para resolver nuestro problema ejecutamos el cmdlet "Remove-MoveRequest" en Exchange Server 2013 (Figura 2).


Figura 2


Con eso pudimos volver a la EMS de Exchange Server 2010 y realizar el "New-MoveRequest" (Figura 3).

Figura 3
 
 



lunes, 27 de octubre de 2014

Modificar TTL para un solo registro en la zona DNS

Una de las opciones de configuración en una zona DNS es el tiempo de vida de los registros (TTL o Time To Live), el valor ingresado en el registro SOA es válido para todos los registros de la zona (Figura 1).

Figura 1
 
Sin embargo, en algún caso, puede ser necesario querer variar el TTL para un registro en particular. En las propiedades del registro no se ve la posibilidad de cambiarlo (Figura 2).
 
Figura 2
 
Para poder cambiar el TTL de un solo registro primero hay que activar las opciones avanzadas en la consola de DNS (Figura 3) y luego, al abrir las propiedades del registro, tenemos presente esa opción (Figura 4).
Figura 3

Figura 4

Podemos especificar cualquier valor, que será válido solo para ese registro. Si utilizamos nslookup en modo de debug (Figura 5), podemos ver que cuando hacemos una consulta por el registro (A) que modificamos, el TTL del registro es diferente al de la zona (Figura 6).
 
 
Figura 5

Figura 6

miércoles, 23 de abril de 2014

Borrar cuenta de equipo que es un contenedor

Cuando quisimos borrar un equipo desde el Active Directory Users And Computers (ADUC) nos hemos encontrado con un mensaje que informaba que el objeto era un contenedor, y dentro de éste había otros objetos (Figura 1), similar a cuando borramos una OU.
 
 
Object contains other objects. Are you sure you want to delefe object and all of the objects it contains
Figura 1

Si queremos saber qué objetos hay dentro de este objeto, debemos seleccionar View y luego Users, Contacts, Groups and Computers as containers dentro del ADUC (Figura 2).

Figura 2
 
 
Luego de activar esta opción, podemos ver en el ADUC que la cuenta de equipo contaba con algún ServiceConnectionPoint (Figura 3), debido a que era un Exchange Server 2010.  
 
Figura 3

Una vez que comprobamos que efectivamente no es necesario conservar esa información, podemos borrar la cuenta sin problemas.

martes, 8 de abril de 2014

So long, and thanks for all the fish

Casi todo el mundo está enterado de que hoy, 8 de Abril de 2014, se termina el soporte de Windows XP.
 
Pero tal vez para algunos sea una sorpresa que hoy termina también el soporte para Office 2003 y Microsoft Exchange 2003, aunque todavía existen varias instalaciones de estos productos, y todos ellos continúan en funcionamiento. Seguramente más de un lector de este blog recordará las horas invertidas para lograr la certificación en estos productos, el trabajo para automatizar el despliegue y las llamadas atendidas para explicar cómo funcionan.
 
Espero que todos estén terminando de migrar o hayan finalizado la migración a tecnologías más modernas. De todos modos, no va a ser tarea fácil dejar de cruzarse con alguno de estos productos, ya que los tres fueron ampliamente adoptados en numerosas organizaciones de variada magnitud.

martes, 18 de marzo de 2014

Como listar miembros de un grupo en multiples dominios con Get-ADGroupMember

Si alguna vez han intentado buscar objetos en un AD con múltiples dominios, seguramente utilizaron para ello un Global Catalog como indica un artículo anterior de este blog. Pero si trataron de ver qué usuarios pertenecen a un determinado grupo, seguramente se habrán encontrado con algún problema.
 
Como siempre, antes de utilizar un cmdlet de AD, es necesario importar el módulo (Figura 1).
 
Import-Module ActiveDirectory
Figura 1
 
Ya con el módulo importado en la sesión de PowerShell, podemos utilizar Get-ADGroup para encontrar información del grupo. Si consultamos por un grupo de nuestro propio dominio no hay mayor dificultad, pero si el grupo está en un dominio distinto no veremos resultados (Figura 2)

Figura 2
 
Para poder consultar la información de Get-ADGroup de un grupo que pertenece a un dominio distinto de aquel en el cual estamos autenticados, debemos especificar el server que queremos consultar, y aclarar que queremos utilizar el puerto de Global Catalog (Figura 3).


Get-ADGroup -Filter {name -like "NombreDelGrupo"}-Server:"NombreDelServer:PuertodeGC"
Figura 3

Con la información del grupo podemos buscar los miembros, pero si tratamos de realizar un pipe entre los cmdlets Get-ADGroup y Get-ADGroupMember obtendremos un error (Figura 4).

Figura 4

Especificar un Global Catalog no ayuda de mucho: especificar un server de otro dominio nos indica que no encuentra el grupo; especificar un server del mismo dominio, nos indica que la operación no está soportada en un Global Catalog (Figura 5).

Figura 5

La solución (Figura 6) es que no hay que especificar un server en el parámetro "-Server", sino que hay que indicar el dominio al que pertenece el grupo (Información que obtuvimos en la consulta realizada en la Figura 3).

Figura 6


Si realizamos un pipe entre ambos cmdlets, podremos obtener información de cada usuario miembro del grupo (Figura 7).

Figura 7
 

lunes, 17 de febrero de 2014

Editar todas las filas en SQL 2008 / R2

A partir de SQL Server 2008 ya no es posible ver la opción de editar todas las filas de una tabla en forma predeterminada (Figura 1).
 
 
Figura 1
 
Sin embargo podemos modificar este comportamiento desde Options en el menú Tools (Figura 2) . En SQL Server Object Explorer podemos seleccionar los valores que se verán en el menú contextual del Microsoft SQL Server Management Studio (Figura 3).

Figura 2

Figura 3

Seleccionando un valor de 0 (cero), podemos ver la opción de Edit All Rows (Editar todas las filas) en el menú contextual (Figura 4).

Figura 4


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.