Mostrando entradas con la etiqueta exchange2010. Mostrar todas las entradas
Mostrando entradas con la etiqueta exchange2010. Mostrar todas las entradas

miércoles, 7 de octubre de 2015

GTD con iOS y Microsoft Exchange (Parte 2) : Wunderlist

Como comente en el post anterior, mi objetivo final es usar para el GTD el Recordatorios de iOS con Siri y sincronizado con Exchange. Sigo trabajando en ello, adaptando el método que usaba con Wunderlist a este nuevo sistema.

Cuando empeze con esto del GTD, me encontre con un par de necesidades para poder gestionar las tareas sin volverme loco. Entre las diferentes opciones que encontre (Trello, RememberTheMilk,Tasks) Wunderlist era la que era la más sencilla de utilizar, compatible con todos los dipositivos y que incluía notificaciones.


  • Porque sencilla? porque cuando más completo és una herramienta, más complejo es de gestionar y más tiempo requiere. La idea es que puedas introducir lo más rapido posible en tu lista para poder registrarlas y olvidarte de ellas hasta que sea el momento de realizarlas. 
  • Porque compatible con todos los dispositivos? podria gestionarlo todo desde una único dispositivo y tal vez seria más sencillo, pero para Procesar y Organizar las tareas es más comodo hacerlo con un teclado y raton y en una grande que con una pantalla de telefono. Tambien es compatible con Android. 
  • Para que las notificaciones? Aunque se supone que tenemos planificadas las tareas que vamos a realizar durante el dia de hoy, siempre va bien tener añadir una alerta de alguna tarea, realizar una llamada, etc...

Como organizo las tareas con Wunderlist

Wunderlist tiene cuatro de listas automáticas y predeterminadas muy útiles y que he podido aprovechar:

  • Bandeja de entrada: Aquí es donde automáticamente entran todas las tareas que apunto, y se quedan a la espera de ser ordenadas. 
  • Destacados: Existe una etiqueta especial para destacar ciertas tareas. 
  • Hoy: Las tareas que tienen fecha límite para hoy ( o más antiguas y se están acumulando! Hay que hacer algo!!) 
  • Semana: Las próximas tareas a una semana vista. 


Después tengo una serie de listas y carpetas de listas para poder organizarme. Concretamente tengo:

  • Lista de la compra: Una lista de la compra compartida con mi pareja 
  • Trabajo 
    • Importante: La lista de las cosas a hacer. 
    • Urgente: Como dice Fito, no siempre lo Urgente es lo Importante, pero las Urgencias son las urgencias y si no se apagan los fuegos se te quema, el Arbol, el Bosque y todo el Active Directory. 
    • Algún dia: Cajon desastre de tareas que seguramente no llegaran a buen puerto y están a la espera que las borre definitivamente. 
    • Pendiente: Las tareas que quedan pendientes de que otra persona algo. 
  • Personal
    • Proyectos: Una lista de ideas que se me van ocurriendo y que hace falta desarrollar y desglosar.
    • Personal: Las tareas personals que tengo que hacer. Llevar el coche al tallar, colgar tal cuadro, Ir a recoger resultados, etc. Ese tipo de cosas. 
    • Debo o me deben: Una lista con las cosas que me han prestado o he prestado y que estaría devolver o recuperar algún día. 

Como proceso las tareas


  1. Cuando alguien interrumpe lo que sea que estoy haciendo y me pide que haga algo, si no és una urgencia o lo puedo realizar en menos de 2 minutos, lo escribo como una tarea por alguno de los múltiples métodos de entrada que ofrece Wunderlist: widgets, email, plugins, etc.
  2. Cada dos horas o cada vez que he completado dos tareas reviso la Bandeja de Entrada para procesar y organizar la tareas. La asigno a una lista según su prioridad y propongo una fecha en la que voy a realizarla.Una vez completo el dia, media hora antes de irme para casa, vuelvo a revisar la Bandeja de Entrada para que no me haya quedado ninguna tarea pendiente de revisar. 
  3. Después reviso las tareas que tengo programadas para el día siguiente, muchas de ellas según el criterio que según la propuesta que hice cuando la procesé por primera vez. Reviso las tareas para el día siguiente y compruebo que no haya ninguna que tenga prioridad y que sea necesario adelantar la fecha de acción.
  4. Una vez llego al trabajo por la mañana, solo tengo que revisar la lista de tareas para Hoy y pasar a la acción.  






miércoles, 30 de septiembre de 2015

GTD con iOS y Microsoft Exchange (Parte 1)

Antes de nada, si lee esto algún purista de GTD que no explote de indignación y ruego que me perdone, he interpretado el método a mi manera, a mi me funciona. Pero si alguien cree que hay cosas que puedo mejorar, le agradecere que me lo comente. 

Uno de los principales problemas que me encuentro a la hora de trabajar es la necesidad de controlar a que dedico el tiempo, algo que es bastante difícil entre los proyectos que están en marcha, los que me gustaría poner en marcha, los que me piden que colabore y las interrupciones habituales en un Administrador de Sistemas (altas de usuario express, bajas fulminantes, asignaciones de quota superimportantes, recuperaciones a vida o muerte...) .

Intente varias opciones para lograr mantener el control: decir que sí a todo, decir que no a todo, aislarme en una burbuja, responder solo a las peticiones de mi jefe, etc. Ninguna de ellas logro un buen resultado, si bien con algunas lograba acabar mi trabajo en tiempo record, en la mayoria de ocasiones el precio era el ostracismo y la marginación de los compañeros. En algún momento tal vez tenga que volver a valorar si esta era el precio o la recompensa.

Un buen dia procastinando entre blogs y artículos web alguien escribía sobre el método Getting Things Done de David Allen (GTD), un método para gestionar el tiempo basado en varios conceptos, como el de divide y vencerás y en la idea de concentrar la mente en una sola tarea a la vez. Para tener una idea general, el método de David Allen consiste en cinco principios:

  1. Recopilar todas las tareas en una lista, que podemos llamar Bandeja de Entrada. 
  2. Procesar, analizar y dividir todas las tareas en subtareas, hasta el punto en que estas tareas no se puedan dividir más. 
  3. Organizar las tareas según prioridades, cuales son Urgentes, cuales son Importantes, cuales pueden esperar, etc... Ademas de ordenar y clasificar las tareas según prioridades se pueden hacer otras divisiones: por proyectos, por clientes, por empleados, etc... Yo prefiero simplificar estas listas lo máximo para hacer el proceso mucho más sencillo. Menos és más
  4. Revisar las tareas que ya tenias procesadas y organizadas y ver cuales son las que puedes realizar Hoy.  
  5. y Hacer las tareas.  
Diagrama de flujo de tareas



miércoles, 23 de septiembre de 2015

Formulario Powershell para alta de usuarios (parte 1/3)


Estoy descubriendo la herramienta genial que es Powershell .

Como comente en el post anterior , estamos preparando una serie de scripts para automatizar la gestión de usuarios. Investigando un poco sobre como hacer estos scripts, descubrí que en PowerShell han implementado una librería para hacer un interfaz gráfico: Forms .

Después de revisar algunos tutoriales del technet, dedicí usar lo aprendido para hacer una aplicación de alta de usuarios con esta librería.

El objetivo de la aplicación es completar en un solo formulario el Alta de un usuario en Active Directory, Exchange, Lync y agregar los grupos necesarios para poder acceder a las aplicaciones corporativas de su departamento.

El script de la aplicación nos deberá permitir seleccionar lo siguiente:

  • Si queremos dar de alta la cuenta de Active Directory, de Exchange, de Lync y añadir los Grupos.
  • Escoger al entorno o país al que pertenecerá el usuario.
  • Escoger la base de datos donde se creara el buzón de Exchange
  • Escoger la plantilla que usaremos para añadir los grupos. 


Para ello necesitamos acceso a los diferentes powershell de estos servicios, que ya resolvimos en el post de Automatizar el inicio de sesiones remotas en PowerShell y unas plantillas de usuarios que dejaremos en una OU.


Formulario Powershell para alta de usuarios (parte 2/3)


Ahora empieza lo interesante. Vamos a buscar dentro de nuestro servidor de exchange (que tenemos hemos almacenado antes en la constante $mailboxserver )y escoger en que base de datos queremos crear el nuevo buzón. Para listar las bases de datos, usaremos el comando get-mailboxes y el listado obtenido lo presentaremos en una ListBox igual que la que hemos creado para seleccionar el entorno: 

# Add Mailbox Database ==================================
$objLabelMailDatabase = New-Object System.Windows.Forms.Label
$objLabelMailDatabase.Location = New-Object System.Drawing.Size(50,290)
$objLabelMailDatabase.Size = New-Object System.Drawing.Size(180,20)
$objLabelMailDatabase.Text = "Selecciona una base de datos:"
$objForm.Controls.Add($objLabelMailDatabase)
$objMailDatabaseListbox = New-Object System.Windows.Forms.Listbox
$objMailDatabaseListbox.Location = New-Object System.Drawing.Size(50,310)
$objMailDatabaseListbox.Size = New-Object System.Drawing.Size(150,400)
$objForm.Controls.Add($objMailDatabaseListbox)
$mailDatabases = Invoke-Expression "get-mailboxdatabase -server $mailboxserver | sort-object Name"
foreach ($mailDatabase in $mailDatabases)
{
      [void] $objMailDatabaseListbox.Items.Add($mailDatabase.Name)
}
Para seleccionar la plantilla necesitamos tener estas creadas en una OU del Active Directory, que hemos definido como constante al principio. Estas plantillas no son otra cosa que usuarios de AD con los grupos a los que deben pertenecer segun su entorno y departamento. Estas plantillas se pueden crear y modificar directamente sobre el Active Directory sin tener que hacer modificaciones en el script del formulario. 

El código seria el siguiente: 

# Add Groups from Template =================================
$objLabelUserTemplate = New-Object System.Windows.Forms.Label
$objLabelUserTemplate.Location = New-Object System.Drawing.Size(250,290)
$objLabelUserTemplate.Size = New-Object System.Drawing.Size(180,20)
$objLabelUserTemplate.Text = "Selecciona una plantilla:"
$objForm.Controls.Add($objLabelUserTemplate)
$objUserTemplateListbox = New-Object System.Windows.Forms.Listbox
$objUserTemplateListbox.Location = New-Object System.Drawing.Size(250,310)
$objUserTemplateListbox.Size = New-Object System.Drawing.Size(150,400)
$objForm.Controls.Add($objUserTemplateListbox)
$userTemplates = get-AdUser -Filter * -SearchBase $templateBase
foreach ($userTemplate in $userTemplates)
{
      [void] $objUserTemplateListbox.Items.Add($userTemplate.SamAccountName)
}

Lo que hace el código es leer los usuarios de la OU (en la constante $templateBase) y listarlo en un textbox.

El resultado es el siguiente: 


En este caso los objetos de Base de Datos de Exchange y Plantillas no muestran datos. Pero en un entorno consulando a servidores reales el resultado es este:


Los siguientes elementos que definiremos son los Check Box y los usaremos para definir que funciones queremos habilitar de el nuevo usuario que estamos creando.

# Add ActiveDirectory CheckBox
$objADCheckbox = new-object System.Windows.Forms.checkbox
$objADCheckbox.Location = new-object System.Drawing.Size(450,290)
$objADCheckbox.Size = new-object System.Drawing.Size(200,20)
$objADCheckbox.Text = "Crear Usuario AD"
$objADCheckbox.Checked = $false
$objForm.Controls.Add($objADCheckbox)  
 
# Add Exchange CheckBox
$objMailCheckbox = new-object System.Windows.Forms.checkbox
$objMailCheckbox.Location = new-object System.Drawing.Size(450,310)
$objMailCheckbox.Size = new-object System.Drawing.Size(200,20)
$objMailCheckbox.Text = "Habilitar Mailbox"
$objMailCheckbox.Checked = $false
$objForm.Controls.Add($objMailCheckbox)
 

# Add Group CheckBox
$objGroupCheckbox = new-object System.Windows.Forms.checkbox
$objGroupCheckbox.Location = new-object System.Drawing.Size(450,330)
$objGroupCheckbox.Size = new-object System.Drawing.Size(200,20)
$objGroupCheckbox.Text = "Habilitar "
$objGroupCheckbox.Checked = $false
$objForm.Controls.Add($objGroupCheckbox)  
# Add Lync CheckBox
$objLyncCheckbox = new-object System.Windows.Forms.checkbox
$objLyncCheckbox.Location = new-object System.Drawing.Size(450,350)
$objLyncCheckbox.Size = new-object System.Drawing.Size(200,20)
$objLyncCheckbox.Text = "Habilitar Lync"
$objLyncCheckbox.Checked = $false
$objForm.Controls.Add($objLyncCheckbox)  

Con este codigo solo añadimos los checkbox en el formulario. Estos checkbox los marcaremos para confirmar si queremos crear el usuario del AD, si queremos que habilitar el buzon de Exchange, añadir los grupos de la plantilla o habilitar las funciones de Lync.




Parte 3/3

Formulario Powershell para alta de usuarios (parte 3/3)


La última parte de este articulo/trilogia es la parte donde recogemos todos los datos que introducimos en los elementos y damos el alta del usuario en sí y mostramos un output amigable en un elemento tipo textbox.

El primer paso es crear el textbox:

# Add a text box to the form  ==================================
$objOutputBox = New-Object System.Windows.Forms.TextBox
$objOutputBox.Location = New-Object System.Drawing.Size(680,40)
$objOutputBox.Size = New-Object System.Drawing.Size(460,500)
$objOutputBox.Multiline = $True
$objOutputBox.Font = New-Object System.Drawing.Font("Courier New", "8.5")
$objOutputBox.Wordwrap = $True
$objOutputBox.ReadOnly = $True
$objOutputBox.ScrollBars = [System.Windows.Forms.ScrollBars]::Vertical
$objForm.Controls.Add($objOutputBox)



Usaremos el nuevo objeto para mostrar toda la información y los pasos que estamos dando en el proceso de creación del usuario.

El siguiente paso es añadir un boton de OK, para lanzar el procedimiento de crear el usuario.

# Add OK Button ========================================
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(500,720)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.Add_Click(
{
# TODO: Substituir por procedimiento de alta de usuario
$objForm.Close()
})
$objForm.Controls.Add($OKButton)

I el aspecto final es este:


En la procedimiento al ejecutar el Click es donde devemos introducir nuestro script para el alta de usuario que deve recoger todos los datos del formulario y teniendo en cuenta los check que haya marcados, realizar unas tareas u otras. Como esta es la madre del cordero de todo este formulario, aquí os dejo un ejemplo de el script que usamos nosotros:

# TODO: Substituir por procedimiento de alta de usuario
$country = $objEnviromentsListbox.SelectedItem
$name = $objTextBoxName.Text
$surname = $objTextBoxSurname.Text
$username = $objTextBoxUsername.Text
$password = $objTextBoxPassword.Text
$alias = $objTextBoxAlias.Text
$database = $objMailDatabaseListbox.SelectedItem
$template = $objUserTemplateListbox.SelectedItem
$groups = Invoke-Expression "get-AdUser -Identity $template -Properties memberof | select-object -ExpandProperty memberof"
$enabledAD = $objADCheckbox.Checked
$enabledExchange = $objMailCheckbox.Checked
$enabledLync = $objLyncCheckbox.Checked
$enabledGroup = $objGroupCheckbox.Checked
$profpath = "\\fileserver\prof$country`$\profile\$username"
$homepath = "\\fileserver\prof$country`$\home\$username"
$objOutputBox.Text = " Los datos del nuevo usuario son:
Nuevo uusuario es $name $surname
Su usuario es $username y el password $password
Su Alias de email es $alias y su direccion de email $alias@dominio.com
La base de datos de correo es $database
Y usara los grupos de la plantilla $template" $objOutputBox.Text += "`r`n  "
$objOutputBox.Text += "`r`n Profile Path = $profpath"
$objOutputBox.Text += "`r`n Profile Path = $homepath"
if ($enabledAD) {
$upn = "$username" + "$intdomain"
$completename = "$name $surname"
$objOutputBox.Text +=  "`r`n  Creando AD User..."
new-aduser -Name $completename -GivenName $name -Surname $surname -UserPrincipalName $upn -Path $altaOU -SamAccountName $username -AccountPassword (ConvertTo-SecureString $password -AsPlainText -Force) -Enabled $true
$objOutputBox.Text +=  "`r`n  Esperar durante 5 segundos los cambios del AD"
Start-Sleep -s 5
if($enabledGroup)
{ $objOutputBox.Text +=  "`r`n  Habilitar perfil de TS ..."
$objOutputBox.Text += get-AdUser -Identity $template -Properties memberof | select-object -ExpandProperty memberof | Add-ADGroupMember -Members $username
$adUser = Get-ADUser $username | select -ExpandProperty disting*
$adUser = [ADSI]"LDAP://$ADUser"
$adUser.psbase.invokeset('TerminalServicesProfilePath',$profpath)
$adUser.psbase.invokeSet('TerminalServicesHomeDirectory',$homepath)
$adUser.psbase.invokeSet('TerminalServicesHomeDrive',"Y:")
$adUser.setinfo()
# Pause 10 for AD changes
$objOutputBox.Text += "`r`n  Esperar durante 10 segundos para la creación del perfil de TS"
Start-Sleep -s 10 } if($enabledExchange)
{
$objOutputBox.Text +=  "`r`n  Habilitando Mailbox..."
$objOutputBox.Text += enable-mailbox -Identity $upn -Database $database -Alias $alias
# Pause for 30 seconds for AD
$objOutputBox.Text +=  "`r`n  Esperar durante 30 segundos la creación del Mailbox"
Start-Sleep -s 30
if($enabledLync)
{
$objOutputBox.Text +=  "`r`n  Habilitando Lync ..."
$objOutputBox.Text += Get-mailbox -identity $completename | Enable-csuser -registrarpool $registrar -sipaddresstype EmailAddress
$objOutputBox.Text +=  "`r`n  Lync Habilitado"
}
} }
else
{
$objOutputBox.Text += "`r`n  NO SE HA MARCADO LA OPCION DE CREAR USUARIO DE AD"
}
Lo primero que hace el script es leer todos los elementos de entrada de datos del formulario y guardarlos dentro de variables. Despues mediante los CheckBox y con las expresiones de condicion IF..THEN.. ejecutamos los comandos para crear el usuario. En un caso completo hariamos de forma simplificada:

  1. Crear el usario en AD mediante New-ADUser
  2. Añadimos los grupos de la plantilla mediante el comando Get-ADUser $template | Add-ADGroupMember $username
  3. Creamos el perfil de Terminal Server con el InvokeSet
  4. Habilitamos el buzón de Exchange en la base de datos que hemos seleccionado Enable-Mailbox .
  5. Habilitamos el servicio de Lync usando la direccion de email como SIP Address Enable-CSUser .

El procedmiento es sencillo y el flujo de condiciones es bastante intuituvo, se puede modificar y adaptar a cualquier empresa.

Lo más importante y que hay que tener en cuenta, es que para ejecutar este formulario y poder dar de alta los usuario y todos sus servicios hay que tener sesiones abiertas con todas las consolas de gestión de estos servicio.



jueves, 23 de julio de 2015

Automatizar el inicio de sesiones remotas en PowerShell



Estamos preparando, junto con un compañero de trabajo, un script de powershell para dar de alta usuarios en Active Directory, Exchange y Lync, y de paso agregar los grupos de seguridad para Citrix y parámetros de perfiles de Terminal Server .

El primer paso es conseguir acceso a todas las consolas de PowerShell de los diferentes servicios. Para hacerlo solo hay que crear nuevas sesiones de PoweShell con el comando New-PSSession.

Aquí dejo un pequeño script para iniciar sesión en los diferentes servicios en una misma consola PowerShell . Solo tenéis que copiar el texto, guardarlo en un archivo .ps1 y modificar los parámetros iniciales.


miércoles, 11 de marzo de 2015

Como eliminar un servidor Exchange 2007 caído


Esta semana me he decidido ha hacer limpieza del AD y dejarlo todo listo para preparar la migración a Exchange 2013.

Tenia un servidor de Exchange 2007 que no retiramos de forma limpia y aun tenia información en el Active Directory. Para poder eliminar la información de Active Directory, se suelen dar dos métodos:

A) "El limpio" recuperar el servidor Exchange caído con setup.com /M:RecoverServer y posteriormente desinstalarlo.
B) "El sucio" podar el árbol del AD con el ADSI Edit

Como para ser brutos siempre se está a tiempo, empecé (y más o menos acabe) con la método limpio.

Como Recuperar un servidor Exchange 2007 caido para despúes eliminarlo


1. El primer paso és la recuperación en sí.

Los requisitos son:
  • Sistema Operativo Windows 2003 o 2008 (el R2 da problemas). 
  • Mantener la misma IP del servidor que queremos recuperar.
  • Usar el mismo nombre NETBIOS del servidor que queremos recuperar. 
  • Tambien es necesario instalar los Roles y Características que necesita el Exchange 2007. 
Para instalar abrimos un powershell y lanzamos el siguiente comando:
> Import-Module ServerManager
> Add-WindowsFeature RSAT-ADDS,Web-Server,Web-Metabase,Web-Lgcy-Mgmt-Console,Web-Dyn-Compression,Web-Windows-Auth,Web-Basic-Auth,Web-Digest-Auth,RPC-Over-HTTP-Proxy;

2. Cumplidos los prerequisitos, lanzamos el ejecutable de Exchange 2007 con el comando:
> Setup.com /M:RecoverServer
Esto instalará los roles que tenia asignados el servidor que falló, en mi caso el de Mailbox. Durante los checks tal vez indique que le falte alguna unidad (ese fue mi caso), solo tuve que montar un disco virtual y asignar las letra que indicada a cada volumen.



3. Una vez completado la recuperación, reiniciamos el servidor.

4. Si no quedan flecos sueltos, eliminar el rastro del Active Directory tiene que ser tan sencillo como desinstalar el Exchange 2007 desde el panel de control de Windows.

Como nunca nada es tan sencillo como lo pintan, yo me encontré con varios problemas desde al principio hasta el final y tuve que utilizar el ADSI Edit para solucionar alguno de ellos.

jueves, 18 de diciembre de 2014

Problemas con las Transport Rules de Exchange 2010


Hoy, al hacer una prueba con un nuevo servicio de antispam externo me he encontrado con un error de estos que te tienen entretenido medio día.


Nuestro servicio de filtro de spam anterior marcava todos los emails que considerava como no desados con un header X-SPAM y un valor del 0 al 9.

 Si el valor era 9, el MS Exchange mediante una Transport Rule lo envía directamente a la Junk mail ( Carpeta de correo no deseado ) del usuario.


Al probar el nuevo servicio de filtro de SPAM externo, este también usa la cabecera X-Spam, pero usando otros valores:


Resulta que la transport rule que tenia configurada al comprobar la condición la resuelve como TRUE y enviava todos los emails a la carpeta de Junk email.

La única explicación que encuentro es que la regla esta mal enunciada (o mal programada) y no se trata de un matches si no de un contains y por eso el Exchange me marcaba todo como SPAM. 


Para que puedan convivir los dos servicios de filtrado de email en mi servidor de correo finalmente he tenido que usar otro método para marcar los emails, añadiendo una etiqueta SPAM en el asunto del mensaje.





lunes, 16 de junio de 2014

Powershell Script para dar de alta mailbox de Exchange


Esta mañana tenia que crear varias cuentas de correo a partir de un listado de Excel, con usuarios en el que no sabia que usuarios estaban ya dados de alta, que usuarios tenian Mailbox y cuales eran usuarios nuevos.

Como eran un montón de usuarios me he dedicado ha hacer un script de Powershell que lea un CSV (creado a partir del Excel)  que comprueba si el usuario existe y crea el buzón con los parámetros deseados.

Lo primero es decir que el Excel tiene que tener un formato parecido a este:

Name;Alias;Username;Password
Hannibal Smith;asmith;asmith@ateam.local;password
M. A. Barracus;mabarracus;mabarracus@ateam.local;password
H. M. Murdock;murdock;murdock@ateam.local;password

Una vez tenemos el CSV con un formato parecido, el powershell script es el siguiente:


$listado = Import-Csv '.\<listado>.csv' -Delimiter ';'

$basededatos = "<base de datos>"
$unidadorganizativa = "<unidad organizativa>"
foreach ($user in $listado) {

$usuario = $user.Usernameecho "//////////////////////////////////"echo "## CREAR BUZON USUARIO $usuario ##"If (get-mailbox $user.username -ErrorACtion SilentlyContinue) {
echo "EL BUZON $usuario YA EXISTE"
}Else{
echo "El buzón de $usuario no existe" If (get-user $usuario -ErrorACtion SilentlyContinue) {
get-user -Identity $usuario echo "HABILITAR BUZON DEL USUARIO $usuario" enable-mailbox -identity $usuario -Database $basededatos -Alias $user.alias
}Else{
If (!(get-user $usuario -ErrorACtion SilentlyContinue)){ echo "CREAR USUARIO Y HABILITAR BUZON PARA $usuario" new-mailbox -UserprincipalName $usuario -Alias $user.alias -Name $user.name -Database $basededatos -OrganizationalUnit $unidadorganizativa -Password (ConvertTo-SecureString $user.Password –AsPlainText –force)}
}
}echo "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"
}





miércoles, 13 de junio de 2012

Como migrar carpetas públicas de Exchange 2007 a 2010


Para migrar las carpetas públicas de un servidor Exchange 2007 a otro con la versión 2010, usaremos la función de replicación de las carpetas para que sea el propio Exchange que copie los datos.


1. Creamos una carpeta pública en Exchange 2010 mediante la consola de Exchange. 

2.  Montamos la Base de Datos de carpetas públicas (en mi caso tuve que esperar un rato a que se propagara la información por los Domain Controllers)

3. Desde una consola PowerShell en el servidor de Exchange 2010 configuramos que las replicas de las carpetas públicas del antiguo servidor 2007 se hagan en el nuevo servidor mediante los siguientes comandos:
> AddReplicaToPFRecursive.ps1 -server OldServer -TopPublicFolder "\" -ServerToAdd NewServer
> AddReplicaToPFRecursive.ps1 -server OldServer -TopPublicFolder "\NON_IPM_SUBTREE" -ServerToAdd NewServer

5. Después comprobamos que se ha configurado correctamente la replica con el comando:
> Get-PublicFolder -server OldServer -recurse | ft Name, Replicas

(EN ESTE PUNTO NOS ENCONTRAMOS CON EL 1er PROBLEMA)

6. Programar la replica de las carpetas públicas:
> Get-PublicFolder -server OldServer -recurse | Set-PublicFolder -ReplicationSchedule Always

7. Comprobar que se ha aplicado correctamente revisando la configuración de 
> Get-PublicFolder -server NewServer -recurse | ft Name, Replicas, ReplicationSchedule

8. Forzamos la actualización de la estructura de carpetas públicas, primero en el servidor antiguo y al cabo de unos minutos en el nuevo. 
OLDSERVER > Update-PublicFolderHierarchy -server OldServer
NEWSERVER >Update-PublicFolderHierarchy -server NewServer

9. A partir de aquí se ira haciendo la replicación de las carpetas de un servidor a otro, si queremos acelerar el proceso para alguna carpeta en concreto lo podemos hacer desde el servidor Exchange 2010 mediante el comando. 
> update-publicfolder -Server NewServer "\<nombre de la carpeta>"

Podremos ir revisando el proceso de replicación mediante el comando Get-PublicFolderStatistics -server <nombre del servidor>, que nos mostrara las carpetas que hay en cada uno de los servidores. Al finalizar el proceso de replica la información recogida por Get-PublicFolderStatistics tiene que ser la misma en ambos servidores.




1er Problema: 
Aunque la replica esta correctamente configurada, la PublicFolder del servidor Exchange2010 no contienen información.

La transferencia de datos entre servidores Exchange se hace a través del Concentrador de Transporte (Hub Transport), esto incluye a la replica de carpetas públicas. Al revisar el visor de sucesos del Hub Transport nos encontramos con el siguiente error:

Log Name:      Application
Source:        MSExchange Store Driver
Date:          12/06/2012 16:36:45
Event ID:      1020
Task Category: MSExchangeStoreDriver
Level:         Error
Keywords:      Classic
User:          N/A
Computer:      hubtransport.lasendadeladmin.com
Description:
The store driver couldn't deliver the public folder replication message "Status Request (publicfolder@lasendadelaadmin.com)" because the following error occurred: The Active Directory user wasn't found..
Event Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="MSExchange Store Driver" />
    <EventID Qualifiers="49156">1020</EventID>
    <Level>2</Level>
    <Task>1</Task>
    <Keywords>0x80000000000000</Keywords>
    <TimeCreated SystemTime="2012-06-12T14:36:45.000000000Z" />
    <EventRecordID>61206</EventRecordID>
    <Channel>Application</Channel>
    <Computer>hubtransport.lasendadeladmin.com
    <Security />
  </System>
  <EventData>
    <Data>"Status Request (publicfolder@lasendadelaadmin.com)"</Data>
    <Data>The Active Directory user wasn't found.</Data>
  </EventData>
</Event>

Según Microsoft este error es causado si anteriormente a Exchange 2007 o 2010 han existido versiones 2000 o 2003 y, aunque se halla desinstalado correctamente estas versiones, hay información que queda residente en el Active Directory (ADSI).

Aplicamos las modificaciones en el ADSI que indica Microsoft en la siguiente KB para eliminar la información antigua del Active Directory:




Links usados:

Documentación de Scripts de Public Folders

lunes, 4 de junio de 2012

Problemas con WinRM al abrir la Exchange-PowerShell

Sintomas: 

Al intentar abrir una ventana de Exchange Management Shell recibo el siguiente error:
The following error occurred when searching for On-Premises Exchange server: Connecting to remote server failed with the following error message: The WinRM client cannot process the request because the server name cannot be resolved.
La consola trata de conectarse a todos los servidores Exchange de mi organización y siempre recibo el mismo error.

La configuración de red y los DNS están configurados correctamente y en una consola las direcciones IP de los servidores se resuelven por nombre.

Causa: 

Después de la habitual cara de poker, compruebo la configuración del netsh y verifico que winhttp tiene configurado un proxy a ninguna parte:



Solución:

Eliminar la configuración del proxy:



http://blogs.pointbridge.com/Blogs/olson_andy/Pages/Post.aspx?_ID=7