Archivo

Archivo para la categoría ‘PowerShell’

[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

PowerShell: Creación de contactos en Exchange Online desde un CSV

jueves, 15 de mayo de 2014 Sin comentarios

Hola,

Si ayer os publicaba qué script usé para dar de alta a usuarios en Office 365, hoy os pongo otro script para la generación de Contactos.

Usamos, como en el caso anterior, un formato concreto de los datos a cargar desde el CSV, y es

Name Nombre del usuario (campo invisible, por cierto)
DisplayName Nombre para mostrar en Exchange Online
ExternalEmailAddress Dirección de correo del contacto
FirstName Nombre
LastName Apellido
Alias Alias del usuario, campo obligatorio.

 

El código no puede ser más sencillo, y es éste:

# Solicitud de credenciales para conectar a Office 365

$cred = Get-Credential

 

#Creación de sesión para conectar a Exchange Online

$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell/ -Credential $Cred -Authentication Basic -AllowRedirection

 

#Importación de la sesión Exchange Online

Import-PSSession $Session

 

#Petición de parth del fichero donde están los contactos

[void] [System.Reflection.Assembly]::LoadWithPartialName(«System.Windows.Forms»)

$ofd = New-Object System.Windows.Forms.OpenFileDialog

$ofd.ShowHelp=$true

if($ofd.ShowDialog() -eq «OK») { $ofd.FileName }

$Fichero = $ofd.Filename

 

#Alta de contactos en Office 365 de modo recursivo a través del fichero CSV

Write-Host «Inicio de la carga de contactos en Office 365»

 

Import-Csv -Path $Fichero | ForEach-Object {

    New-MailContact -Name $_.Name -DisplayName $_.Name -ExternalEmailAddress $_.ExternalEmailAddress -FirstName $_.FirstName -LastName $_.LastName -Alias $_.Alias

 

}

 

 

#Fin de la carga de contactos

Write-Host «Fin de la carga de contactos en Office 365»

 

#Cerramos la sessión con Exchange Online

Remove-PSSession $Session

 

Saludos,

Marc

PowerShell: Alta masiva de usuarios en Office 365 desde un CSV

miércoles, 14 de mayo de 2014 Sin comentarios

Hola a todos,

No sé si trabajáis con Office 365 y os gusta PowerShell. Particularmente, no suelo usar mucho el segundo pero de vez en cuando (algún proyecto) lo requiere y, aun sabiendo que por Internet está lleno de scripts, me gusta montármelos yo mismo.

En este caso, he creado un script que ayuda a realizar la carga de usuarios desde un CSV hacia un tenant de Office 365 completamente cloud.

Los parámetros de entrada en el CSV son:

FirstName Nombre del usuario que vamos a crear
LastName Apellido del usuario
DisplayName Nombre que se mostrará en Office 365
UserPrincipalName Login name, o cómo el usuario se validará en Office 365
UsageLocation Ubicación del usuario. Importante o no podremos dar de alta correctamente al usuario.
Para España, el código es ES
Office Oficina de nuestro usuario
Department Departamento de trabajo del usuario
PhoneNumber Teléfono al que localizar a nuestro usuario

Veréis que en el código se establece un valor por defecto a la variable –Password.

Esto se hace así ya que por defecto se genera una contraseña aleatoria que tendríamos que guardar de algún modo. Si la establecemos por defecto, y por defecto caduca, el usuario pondrá la suya en el primer inicio de sesión.

Veréis que guardo en la variable $Licencias los valores de los diferentes tipos de licencias. Puede que en vuestro caso sólo tengáis un valor pero en el mío había 2 diferentes, una StandarPack y otra EnterprisePack

El código resultante es:

 

# Solicitud de credenciales para conectar a Office 365

$cred = Get-Credential

 

# Conexión a Office 365 con las credenciales solicitadas

Connect-MsolService Credential $cred

 

# Consulta del tipo de licencias. Se guardan en una variable

$Licencias = Get-MsolAccountSku

 

#Mostrar las licencias del cliente y separarlas para asignar según los usuarios

$option1 = $Licencias.AccountSkuID.Item(0)

$option2 = $Licencias.AccountSkuID.Item(1)

 

#Petición de parth del fichero donde están los usuarios

[void] [System.Reflection.Assembly]::LoadWithPartialName(«System.Windows.Forms»)

$ofd = New-Object System.Windows.Forms.OpenFileDialog

$ofd.ShowHelp=$true

if($ofd.ShowDialog() -eq «OK») { $ofd.FileName }

$Fichero = $ofd.Filename

 

#Alta de usuarios en Office 365 de modo recursivo a través del fichero CSV

Write-Host «Inicio de la carga de usuarios en Office 365»

 

Import-Csv -Path $Fichero | ForEach-Object {

   New-MsolUser -FirstName $_.FirstName -LastName $_.LastName

   -UserPrincipalName $_.UserPrincipalName

   -DisplayName «$($_.FirstName) $($_.LastName)«

   -LicenseAssignment $option1

   -UsageLocation $_.UsageLocation

   -Department $_.Department

   -PhoneNumber $_.PhoneNumber `

   -Password P@ssw0rd

 

}

 

#Fin de la carga de usuarios

Write-Host «Fin de la carga de usuarios en Office 365»

 

Saludos,

Marc