martes, 26 de marzo de 2013

Script que permite limpiar o subir fotografía a AD.

 

Hola.

Os cuelgo a continuación un Script que he terminado y que permite al usuario subir o limpiar su foto del directorio activo, para que luego se alimente, ya sabéis, Exchange, Lync, etc.

Diréis, ¿Por qué no lo haces en C# y lo compilas?, pues porque lo he ido haciendo en mis ratos libres y como muchas otras cosas, nació para algo diferente. Pero me gusta porque el usuario lo puede lanzar con unas simples instrucciones (botón derecho, ejecutar con poweshell) y al contrario de algunas aplicaciones, no tiene por qué, tener derechos de administrador local para instalarse nada. Sonrisa

Como es común en estas cosas, solo tenéis que localizar y adaptar esta línea de aquí:

$root = [ADSI]'GC://dc=dominio,dc=local' #Inyecta el dominio con el que trabajar

Se que es mejorable,  lo se Guiño.

También tiene varias funciones que os pueden servir de utilidad.

#------------------------------------------------------
#Script encargado de guardar o limpiar fotografía en AD del campo Thumbnailphoto

#Autor: Miguel Hernández

#------------------------------------------------------

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

#-------------------------------------------------------------------------------
#Funciones
#-------------------------------------------------------------------------------

#Toma usuario y lo devuelve con valor $X0
function tomausuario
{

    $objForm0 = New-Object System.Windows.Forms.Form
    $objForm0.Text = "Fotografía en Directorio Activo"
    $objForm0.Size = New-Object System.Drawing.Size(300,120)
    $objForm0.StartPosition = "CenterScreen"

    $objForm0.KeyPreview = $True
    $objForm0.Add_KeyDown({if ($_.KeyCode -eq "Enter")
        {$x0=$objTextBox0.Text;$objForm0.Close()}})    #toma el valor X0
    $objForm0.Add_KeyDown({if ($_.KeyCode -eq "Escape")
        {$objForm0.Close()}})

    $objLabel0 = New-Object System.Windows.Forms.Label
    $objLabel0.Location = New-Object System.Drawing.Size(10,10)
    $objLabel0.Size = New-Object System.Drawing.Size(280,20)
    $objLabel0.Text = "Usuario:"
    $objForm0.Controls.Add($objLabel0)

    $objTextBox0 = New-Object System.Windows.Forms.TextBox
    $objTextBox0.Location = New-Object System.Drawing.Size(10,30)
    $objTextBox0.Size = New-Object System.Drawing.Size(260,20)
    $objForm0.Controls.Add($objTextBox0)

    $OKButton0 = New-Object System.Windows.Forms.Button
    $OKButton0.Location = New-Object System.Drawing.Size(110,60)
    $OKButton0.Size = New-Object System.Drawing.Size(75,23)
    $OKButton0.Text = "OK"
    $OKButton0.Add_Click({$x=$objTextBox0.Text;$objForm0.Close()})
    $objForm0.Controls.Add($OKButton0)

    $objForm.Topmost = $True

    $objForm0.Add_Shown({$objForm0.Activate()})
    [void] $objForm0.ShowDialog()

return $x0

}

#----------------------------------------------------------
#Función resultado
#----------------------------------------------------------

#Abre form con el valor $valor escrito.

function resultado
{

    $objForm0 = New-Object System.Windows.Forms.Form
    $objForm0.Text = "Resultado"
    $objForm0.Size = New-Object System.Drawing.Size(400,90)
    $objForm0.StartPosition = "CenterScreen"

    $objLabel0 = New-Object System.Windows.Forms.Label
    $objLabel0.Location = New-Object System.Drawing.Size(10,20)
    $objLabel0.Size = New-Object System.Drawing.Size(380,20)
    $objLabel0.Text = $valor
    $objForm0.Controls.Add($objLabel0)

       $objForm.Topmost = $True

    $objForm0.Add_Shown({$objForm0.Activate()})
    [void] $objForm0.ShowDialog()
}

#-------------------------------------------------------------
#Función donde se abre ventana donde elegir fotografía
#-------------------------------------------------------------

function Select-FileDialog
    {
        param([string]$Title,[string]$Directory,[string]$Filter="All Files (*.*)|*.*")
        [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null
        $objForm = New-Object System.Windows.Forms.OpenFileDialog
        $objForm.InitialDirectory = $Directory
        $objForm.Filter = $Filter
        $objForm.Title = $Title
        $objForm.ShowHelp = $true
        $Show = $objForm.ShowDialog()

        If ($Show -eq "OK")
        {
            Return $objForm.FileName
        }
        Else
        {
            $valor = "Operación cancelada por el usuario."
            resultado $valor
        }
    }

#------------------------------------------------------
#Empieza el script
#------------------------------------------------------

#Ventana Form donde se pregunta la acción a realizar

$objForm = New-Object System.Windows.Forms.Form
$objForm.Text = "Fotografía en Directorio Activo"
$objForm.Size = New-Object System.Drawing.Size(300,200)
$objForm.StartPosition = "CenterScreen"

$objForm.KeyPreview = $True
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter")
    {$x=$objTextBox.Text;$objForm.Close()}})
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape")
    {$objForm.Close()}})

$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(75,130)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.Add_Click({$x=$objTextBox.Text;$objForm.Close()})
$objForm.Controls.Add($OKButton)

$objLabel0 = New-Object System.Windows.Forms.Label
$objLabel0.Location = New-Object System.Drawing.Size(10,10)
$objLabel0.Size = New-Object System.Drawing.Size(280,20)
$objLabel0.Text = "1. Limpiar fotografía actual"
$objForm.Controls.Add($objLabel0)

$objLabel1 = New-Object System.Windows.Forms.Label
$objLabel1.Location = New-Object System.Drawing.Size(10,30)
$objLabel1.Size = New-Object System.Drawing.Size(280,20)
$objLabel1.Text = "2. Cambiar fotografía"
$objForm.Controls.Add($objLabel1)

$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Size(150,130)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Text = "Cancelar"
$CancelButton.Add_Click({$objForm.Close()})
$objForm.Controls.Add($CancelButton)

$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,70)
$objLabel.Size = New-Object System.Drawing.Size(280,20)
$objLabel.Text = "Seleccionar acción:"
$objForm.Controls.Add($objLabel)

$objTextBox = New-Object System.Windows.Forms.TextBox
$objTextBox.Location = New-Object System.Drawing.Size(10,90)
$objTextBox.Size = New-Object System.Drawing.Size(260,20)
$objForm.Controls.Add($objTextBox)

$objForm.Topmost = $True

$objForm.Add_Shown({$objForm.Activate()})
[void] $objForm.ShowDialog()

#Devuelve el valor $X con 1 o 2 = 1: Limpiar fotografía / 2: Cambiar fotografía

$SAMName = tomausuario  #Pregunta el usuario

    $root = [ADSI]'GC://dc=dominio,dc=local'  #Inyecta el dominio con el que trabajar
    $searcher = new-object System.DirectoryServices.DirectorySearcher($root)
    $searcher.filter = "(&(objectClass=user)(sAMAccountName=$SAMName))"
    $user = $searcher.findall()
    $userdn = $user[0].path
    $userdn = $userdn.trim("GC")
    $userdn = "LDAP" + $userdn
     
      
IF ($x -EQ "1") {

    try
    {
        $user = [ADSI]($userdn)
        $user.Properties["thumbnailPhoto"].Clear()
        $user.CommitChanges()
        $valor = "La fotografía ha sido borrada del servidor"
        resultado $valor
    }
    catch
    {
        $valor = "La fotografía no ha podido ser borrada del servidor"
        resultado $valor
    }
       
}

IF ($x -EQ "2") {
  
    try
    {
        $photo = Select-FileDialog -Title "Selecciona una fotografía (ext.jpg o .png)" -Directory "%userprofile%" -Filter "JPG Images (*.jpg)|*.jpg|PNG Images (*.png)|*.png"
        [byte[]]$file = Get-Content $photo -Encoding Byte
        $user = [ADSI]($userdn)
       
        # Limpiar foto anterior
        $user.Properties["thumbnailPhoto"].Clear()

        # Guardar fotografía
        $user.Properties["thumbnailPhoto"].Add($file)
        $user.CommitChanges()
        $valor = "La fotografía ha sido guardada del servidor"
        resultado $valor
    }
    catch
    {
        $valor = "La fotografía no ha sido guardada en el servidor"
        resultado $valor
    }      
}