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.