Archivo

Archivo para la categoría ‘Directorio Activo’

[Active Directory]–Subir fotos de usuarios al AD

viernes, 20 de noviembre de 2015 Sin comentarios

Hola a todos,

Como muchos ya sabéis, desde Windows Server 2003 funcionando como Domain Controller y nivel funcional 2003, se pueden almacenar fotos de los usuarios en el entorno.

Bien, pues después de mucho buscar por Internet y no encontrar un script de PowerShell medio decente, me aventuré a hacer el mío propio adaptado de otro.

Este es el código

##############################################################################################

# PowerShell Skript to  upload multiple Photos to Active Directory with

# automatic Logging management and Prechecks  before uploading

Author: Marc Salvador

#

# Version 1.0 – Inicial adaptada  de Internet

# Version 1.1 – Control de  errores con «Try/Catch»

# Versión 1.2 – Control de la existencia de carpetas para trabajar

##############################################################################################

 

$Date $(Get-Date -Uformat «%d.%m.%Y-%H.%M»)

# Variables de ejecución

# Se han de crear las carpetas «UploadPics» y sus subdirectorios o modificar el valor de las

# variables con el dato correcto.

# ——————————————————————

$overwrite =
«false» #Si  es necesario actualizar una foto de usuario, dejad el valor en «true»

$pathToPictures «E:\UploadPics\Pics» #only path to folder

$maxPictureSize «20000» # in byte

$pathToLog = «E:\UploadPics\PicUpload.log» #with name of the file

$maxLogSize = «10000000» #in byte

$backupFolder = «E:\UploadPics\Logs\»  #Ubicación de los backups

$backupDays = «7» #Días antes de borrar un backup

#
——————————————————————

# Existencia de la carpeta con  las fotos

if (!(Test-Path -Path $pathToPictures))

{

    Write-Host «No se encuentra la ruta de los archivos con las  fotos» -ForegroundColor Red

    Break

}

#
——————————————————————

# Existencia de la carpeta de  logs

if (Test-Path  -Path $pathToLog)

{

    $log = Get-Item $pathToLog

}

else

{

    Write-Host «No se encuentra la ruta de los archivos de  log» -ForegroundColor Red

    Break

}

# Revisar tamaño del fichero de  logs

if ($log.length -gt $maxLogSize)

{

$backupLog «$backupFolder\PicUpload-$Date.log»

Copy-Item $pathToLog $backupLog

Clear-Content $pathToLog

Write-Host «Fichero de logs copiado a $backupLog« -ForegroundColor Green

}

#Borrar los backups antiguos

$backupFiles =
Get-ChildItem $backupFolder

 

$old = $backupFiles | ? { $_.CreationTime -lt ((get-date).adddays($backupDays)) }

if ($old -eq $Null)

       {

       Write-Host «No hay backups de más de $backupDays días en ‘$backupFolder‘!» -ForegroundColor Yellow

       }

else

       {

       $old | % { Remove-Item $backupFolder$_ }

       Write-Host «Backups antiguos eliminados!»

       }

 

#Fecha actual

$Date=$(Get-Date -format g) | add-content $pathToLog

 

#Using hashtable for logs.

$errorlist=@{} #Errores de log

 

#
———————————————————————————————————————

# Cargamos el módulo de AD. Si se  ejecuta desde un Windows client,

# hay que bajar primero las RSAT para ese cliente e instalarlas.

# Control de error de carga del módulo

Try {

    Import-Module ActiveDirectory

}

Catch {

    $ErrorMessage = $_.Exception.Message

    $FailedItem = $_.Exception.ItemName

    $wshell = New-Object -ComObject Wscript.Shell   

    $wshell.Popup(«Error en la operación $ErrorMessage $FailedItem«,0,«Error de ejecución»,0x0)

    Break

}

 

#Cargamos todas las imágenes desde el directorio donde están almacenadas

$queryPics Get-ChildItem $pathToPictures -ErrorAction Stop

 

foreach ($pic  in $queryPics)

{

    $username = $pic.basename

    $dom = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()

    $root = $dom.GetDirectoryEntry()

    $search = [System.DirectoryServices.DirectorySearcher]$root

    $search.Filter = «(&(objectclass=user)(objectcategory=person)(samAccountName=$username))»

    $result = $search.FindOne()

 

#Check if user exists

if ($result  -ne $null)

       {

       $user = $result.GetDirectoryEntry()

       $thumbnailPhoto = $user.thumbnailPhoto

       #Revisar si tiene o no una imagen en el AD

       if ($thumbnailPhoto.Value -eq $null)

             {

             #Añadir la foto al usuario

             [byte[]]$jpg = Get-Content $pic.FullName -encoding byte

            #Control de errores

            Try

            {

                $user.put(«thumbnailPhoto»,  $jpg )

                $user.setinfo()

            }

 

            Catch

            {

                 $ErrorMessage = $_.Exception.Message

                 $errorlist.Add($username, $ErrorMessage)

            Break

            }

       }

       else #Sobreescribimos la foto existente

             {

             if ($overwrite -eq $true)

                    {

                    #Add picture to user property

                    [byte[]]$jpg = Get-Content $pic.FullName -encoding byte

 

            #Control de errores

            Try

            {

                $user.put(«thumbnailPhoto»,  $jpg )

                $user.setinfo()

            }

 

            Catch

            {

                 $ErrorMessage = $_.Exception.Message

                 $errorlist.Add($username, $ErrorMessage)

                Break

            }

          }

          else

              {

                    Write-Host $user.displayname «ya  tiene una imagen en el AD» -ForegroundColor  Yellow

                    $errorlist.Add($username, «ya tiene una imagen»)

                    }

             }

       }

else

       {

       Write-Host  $username » no encontrado» -ForegroundColor Red

       $errorlist.Add($username, «no encontrado»)

       }

}

 

#Notificación

$maxLogSize =
$maxLogSize/1000000

Write-Host «#Nota:  el archivos de log se puede encontrar en $pathtopictures y se llama ‘PicUpload.log’. Este archivo se moverá a ‘»$backupFolder«PicUpload-Date-Time.log’ cuando exceda los $maxLogSize MB.`n» -ForegroundColor Cyan

 

#Añadir los errores en el fichero

$errorlist | out-string | add-content $pathToLog

 

Como todo en esta vida, el script es mejorable así que acepto sugerencias

Saludos,

Marc

[AD FS] Cómo sustituir un AD FS 3.0 por otro AD FS 3.0

jueves, 9 de julio de 2015 Sin comentarios

Hola de nuevo,

No sé si es muy normal lo que os voy a contar pero, oye, pasar os puede pasar. Y como no he encontrado nada por Internet ni medio decente sobre el tema… pues me he liado yo solo.

Por necesidades de un cliente, he tenido que migrar un servidor AD FS 3.0 (ya sabéis, sobre Windows Server 2012 R2 Update) de un CPD a otro CPD, que está a unos 100 Kms.

Como un vMotion (o Live Migration) no era posible, se decidió tirar por el camino del medio, esto es, instalar otro servidor en el CPD destino y mover la federación.

Bien, los pasos son sencillos pero… han tenido algunos efectos, llamémosles, imprevistos.

 

Pasos seguidos

  • Montar el nuevo servidor de AD FS 3.0, junto con su Windows Update y demás
  • Exportar el certificado de la federación desde el servidor viejo al nuevo
  • Modificar el fichero host del AD FS Proxy (Web Application Proxy o WAP, para ser exactos) para que apunte al nuevo AD FS
  • Ejecutar un Update-MSOLFederatedDomain y…
  • Revisar que en el Visor de sucesos esté todo bien (aparentemente), tal como se ve a continuación

image

 

Los errores

El caso es que todo ha ido bien hasta pasadas unas 12 horas… de tal modo que tanto en el nuevo AD FS como en el WAP, el Visor de sucesos se ha llenado de errores como los que siguen

AD FS

 

image

WAP

 

image

 

Y la solución

Recuerdo que en la versión 2.0/2.1 de AD FS Proxy, re-ejecutando el Wizard de configuración, estas cosas se arreglaban. Pero claro, en la era de Powershell hay que tirar de comandos de teletexto así que… la cosa se arregla de esta manera

  • Primero, buscar el thumbprint del certificado de la federación, dentro de la MMC de Certificados.
  • Seguidamente, ejecutar estos cmdlet con los valores adecuados:

$federationServiceCreds = Get-Credential

Install-WebApplicationProxy -FederationServiceTrustCredential $federationServiceCreds -CertificateThumbprint ‘Thumbprint‘ –FederationServiceName ‘nombreDeLaFederacion’

Si todo va bien, veremos un mensaje como el que sigue.

image

Y ya está arreglado? No, sólo hemos hecho el 50% del trabajo.

El último paso, volver a publicar la federación en nuesto WAP.

Revisamos el visor de sucesos de ambos equipos y hemos de encontrarnos con mensajes del estilo

AD FS

image

 

WAP

 

image

image

 

Ahora sí hemos acabado.

Saludos,

Marc

[Evento] Best practices para mantener tu infraestructura on-premises y cloud bajo control

lunes, 4 de mayo de 2015 Sin comentarios

Hola a todos,

Hace tiempo que no me dejaba liar en un evento de Microsoft para la comunidad. Pero es que no sé decir que no y menos si mi amigo Miguel Hernández me lo pide.

Así que el próximo día 15 de Mayo, en Barcelona, estaré explicando cosas de Active Directory Federation Services (AD FS) y para qué nos puede servir en este mundo cada vez más cloud.

Os dejo a continuación el enlace para el registro del evento: https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032627112&Culture=es-ES&community=0

No faltéis…

 

Saludos,

Marc

ADFS 3.0–Instalación y configuración para Office 365 (II)

lunes, 30 de junio de 2014 Sin comentarios

Hola,

Después de configurar el servicio de Federación, vamos a por la parte pública instalando y configurando el Proxy.

Así que vamos al lío, al segundo servidor ubicado en la DMZ.

 

Implementación

Empezaremos instalado el rol de Remote Access.

    Nota: Suponemos que el certificado digital está solicitado, emitido e instalado en el equipo
    Iniciamos la instalación desde

image

image

Avanzamos con el asistente hasta la parte donde nos indica las funciones que se pueden ejecutar con el rol de Remote Access.

image

Escogemos el rol de Web Application Proxy.

image

Confirmamos. Y finalizamos la instalación

image

 

Configuración

Una vez instalado, procedemos a su configuración. Veréis que el proceso es bastante diferente de la versión 2.0, y por eso tendremos que estar atento a varios detalles.

Iniciamos el asistente.

image

Completamos los datos que nos solicita

  • Nombre de la federación: sts.dominio.com
  • Usuario: DominioDeActiveDirectory\Administrator <— Importante tiene que ser un usuario de Active Directory aunque ponga LOCAL ACCOUNT!!!!!
  • Password: el que toque

image

Continuamos y seleccionamos el certificado adecuado

image

Confirmamos los pasos y finalizamos la configuración inicial.

image

Finalizamos el asistente y… siguiente paso!!!

 

Publicación

Finalmente, el tercer y último paso: publicar el servicio Web como Proxy de la Federación.

Este procedimiento se realiza desde la consola de Remote Access Management Console y pulsando sobre Publish, que nos abre un tercer asistente.

image

 

image

Como método de pre-autenticación, y dado que el objetivo es Office 365, escogemos Pass-through

image

Completamos los datos que nos solicita

  • Nombre: Servicio de Proxy de Federación
  • Url de acceso externo: https://sts.dominio.com
  • Certificado: el que toque
  • Url del servicio de Federación: https://sts.dominio.com (esta url tiene que ser resoluble desde el proxy, añadiendo en el fichero host el nombre y la IP del servidor de Federación)

image

Confirmamos los datos y, si son correctos, los publicamos.

image

image

 

Para validar su funcionamiento, vamos a https://sts.dominio.com/adfs/ls/idpinitiatedsignon.htm

Si la página carga, es que funciona sin problemas.

image

Y esto es todo en cuanto a la instalación de AD FS 3.0 para usar con Office 365

Nota: El alta de la empresa en Office 365, su configuración, la conversión del dominio o dominios como federados y resto de pasos, no han variado y se siguen haciendo como hace 2 años por lo que me remito al artículo original para acabar las configuraciones.

 

Saludos,

Marc

ADFS 3.0–Instalación y configuración para Office 365 (I)

viernes, 27 de junio de 2014 Sin comentarios

De nuevo por aquí,

Como decía ayer, vamos a actualizar conocimientos implementando un entorno de AD FS – AD FS Proxy (aunque no se llame así de forma oficial, ni se instale igual!!!!) con la versión 3.0 del producto.

 

Requisitos

Los requisitos para llevar a cabo correctamente la implementación de AD FS 3.0, sin usar alta disponibilidad, son los siguientes

  • Un equipo Windows Server 2012 R2 Update 1 en la LAN, unido al dominio, para el rol de AD FS
  • Un equipo Windows Server 2012 R2 Update 1 en la DMZ, fuera del dominio, para el rol de Remote Acces (Web Proxy)
  • Definir el nombre de la federación con Office 365. Típicamente, sts.dominio.com
  • Creación de una cuenta ADFSService de dominio con permisos de administrador y caducidad de contraseña para el servicio de Federación. O la creación de una Managed Account siempre que el nivel funcional del dominio sea Server 2012.
  • Un certificado público con el nombre de la federación. Este certificado se instalará en ambas máquinas.

    Implementación

Empezaremos instalado AD FS 3.0 en el servidor interno.

    Nota: Suponemos que el certificado digital está solicitado, emitido e instalado en el equipo
    Iniciamos la instalación desde

image

    Del asistente de instalación de roles de Server 2012 R2, escogeremos el rol de Active Directory Federation Services

image

Después de avanzar un poco en la instalación, se nos indican los requisitos a cumplir para instalar ese rol.

image

Avanzamos y esperamos que lo instale

image

Cerramos el asistente y… abrimos un segundo asistente Winking smile!!!!

 

Configuración

Tengo la costumbre de generar farms pero es que con este asistente no puedes crear un AD FS standalone como en versiones anteriores así que marcamos la primera opción y continuamos.

image

Indicamos una cuenta con permisos suficientes para realizar la configuración, que en este caso es la creada en los Requisitos.

image

Escogemos el certificado a usar para la federación (previamente importado), que debe coincidir con el nombre a publicar y también qué nombre mostrará el portal cuando un usuario quiera hacer login.

image

Indicamos una cuenta con la que se gestionará el servicio (la creada en los Requisitos)

image

Siguiente paso: decidir dónde se almacenarán los datos del servicio de Federación. Para el ejemplo, usaremos un SQL Local.

image

Avanzamos en el asistente, verificamos las opciones y proseguimos con el check previo de requisitos.

image

Proseguimos con la instalación y cerramos el asistente.

image

 

Hasta aquí la primera parte. Mañana (o el lunes), la segunda y última parte.

 

Saludos,

Marc