miércoles, 26 de mayo de 2021

Habiltar ejecución de scripts - PowerShell

Si están trabajando con powerShell y quieren ejecutar un script en un servidor, el error más común al que nos enfrentamos es el siguiente:

"No se puede cargar el archivo script.ps1 porque en el sistema está deshabilitada la ejecución de scripts. Vea «get-help about_signing» para obtener más información".


La descripción es bastante clara, en el sistema está deshabilitada la ejecución de scripts, ésta restricción se puede corroborar desde powershell mediante el comando "Get-ExecutionPolicy"

¿Cómo la habilitamos? Muy simple, mediante el comando "Set-ExecutionPolicy Unrestricted"


Como se puede observar, hay una advertencia y debe ser tenida en cuenta, esta forma de habilitación, permite la ejecución de "Cualquier" script.

viernes, 21 de mayo de 2021

SQL - Trigger - Disparador

En ésta ocasión quería comentarles como los Triggers en SQL, resolvieron un problema en un proceso semi automatizado.

Para empezar y para los que no saben, les voy a definir que son los triggers. 

 "objeto que se asocia con tablas y se almacena en la base de datos. Su nombre se deriva por el comportamiento que presentan en su funcionamiento, ya que se ejecutan cuando sucede algún evento sobre las tablas a las que se encuentra asociado. Los eventos que hacen que se ejecute un trigger son las operaciones de inserción (INSERT), borrado (DELETE) o actualización (UPDATE), ya que modifican los datos de una tabla" (wikipedia).

En muchas situaciones son muy útiles... y en éste caso lo digo por experiencia. 

Les planteo la situación y el problema que surgió.

En un sistema que administro hubo un cambio en la legislación que obligaba a tener en cuenta cierta información cuando se realizaba un comprobante, en particular un rango de fecha. 

La recolección y generación de los comprobantes está automatizada:

  1. Se genera un comprobante / etiqueta con un código QR, en el cual se codifica toda la información necesaria para a posterior emitir un comprobante. 
  2. Se lee la etiqueta con un colector de datos QR, En el se desarrollo una app para que de lecturas consecutivas genere un archivo .txt con todas las lecturas realizadas. 
  3. El archivo .txt se carga en un sistema el cual genera un comprobante por cada registro en el sistema ERP
  4. El Sistema ERP por último, autoriza los comprobante.

El problema surgió en el paso 4, cuando la autorización del comprobante no se pudo realizar por falta de unos datos. 

Análisis y propuestas de solución

La primera solución pensada fue, listo, no hay problema. El dato lo tengo cuando genero la etiqueta, lo incluyo en el QR para ser utilizado en la generación del comprobante en el sistema ERP y la autorización se realice sin problemas. Muy linda y simple..... pero. El sistema que genera el comprobante en el ERP, utiliza una apertura la cual no tiene en cuenta los nuevos parámetros.



La segunda opción, y la menos deseada, modificar cada uno de los comprobantes manualmente por un operador, para poder autorizar los comprobantes. Pero esa "solución" implica un retroceso en el proceso (se pasa a realizar una tarea manual), con el agravantes de los posibles errores de tipeo. Cuando se dimensionó la situación, se observa que la cantidad diaria en promedio de comprobantes es de 100, por lo que tampoco era viable. 



Finalmente, y como pueden sospechar por el titulo del blog, se pensó en una solución utilizando los Triggers del SQL, en este caso SQL Server. Primero mediante la herramienta Profiler, se depuró las acciones que hace el ERP y donde se guarda la información del período en la generación del comprobante. Una vez identificada la tabla, se programó un trigger que se ejecute cuando se inserta una fila en dicha tabla, modificando los dos parámetros del período, teniendo en cuenta que si ya tiene dato, no se haga el cambio. De esta manera, se encontró una solución intermedia, permitiendo y dejando todo el proceso intacto y transparente para el usuario.







Powershell - Wndows - SFTP

Powershell es una herramienta muy poderosa, es una evolución del cmd tradicional de windows. Este post intenta dar un simple ejemplo de su capacidad, en lo particular la conexión a un servicio SFTP. 

Mi necesidad era poder descargar los archivos de audio de un servidor SFTP de manera automática, sin la intervención del usuario, para ello se realizó el siguiente script y se lo configuró en el Programador de Tareas de Windows.

Para el script se utilizó el módulo Posh-SSH (https://github.com/darkoperator/Posh-SSH). 

Se puede utilizar cualquier editor de texto para realizar el script, como si fuera un archivo .bat, pero en éste caso se trata de un archivo .ps1, recomiendo la utilización de la herramienta Windows Power Shell ISE, es un entorno preparado para ésto con todos los aditamentos, ejecución parcial del código, ayuda de funciones, vista de la salida, etc. 

A continuación les dejo el script

Script - Codigo

$sftp = "IP_SERVER"

$usr = 'Usuario_FTP'

$pwd = 'Password_FTP'

$salida = "PATH de descarga de los archivos"

$securePwd = ConvertTo-SecureString $pwd -AsPlainText -Force

#Creo la credencial

$credentials = New-Object System.Management.Automation.PSCredential($usr, $securePwd)

$session = New-SFTPSession -ComputerName $sftp -Credential $credentials -AcceptKey -Force

Get-SFTPChildItem $session | ForEach-Object{

    if ($_.FullName -like '*.WAV') #Solo me interesan los archivos de audio

    {

        Get-SFTPFile $session $_.FullName -LocalPath $salida -Overwrite #Descargo el archivo

        Remove-SFTPItem $session $_.FullName -Force #Borro el archivo del servidor

    }

    Write-Output $_.FullName

}

Remove-SFTPSession $session -Verbose

Script - Datos a cargar

$sftp = "IP_SERVER"

$usr = 'Usuario_FTP'

$pwd = 'Password_FTP'

$salida = "PATH de descarga de los archivos"

Éstas cuatro variables son los datos que se deben configurar para que funcione el script, creo que están bastante claros y descriptivos los nombre.

Problemas

Los problemas que me surgieron al implementar el script, fueron.

  • Versión Instalada de PowerShell en windows: Se necesita tener la versión 5.x 
  • Permitir la ejecución de script en powerShell
  • Al configurar el script para que se ejecute con el programador de tareas, se tienen que poner dentro de la carpeta Microsoft.