Scarichiamo su una tabella MS-SQL i dati degli utenti Active Directory leggendoli sempre da una tabella

Se fai il sistemista e ti diverti a fare reportistica ed incrociare dati tra gli applicativi aziendali e Active Directory, questo è lo script che fa per te.

Lo script powershell sfrutta i seguenti CMDlet:
DBAtools (https://dbatools.io/)
GetADUSER di Microsoft (https://4sysops.com/wiki/how-to-install-the-powershell-active-directory-module/)

Lo script è stato customizzato per essere configurato facilmente e l’ho creato per le mie esigenze.

In breve lo script:
– Legge una tabella con le utenze AD;
– Crea se non esiste la Tabella coi dati di AD
– Interroga AD e memorizza le info in una nuova tabella

Io metto sempre Integrated Security = True per usare l’identity SQL di chi esegue lo script.

$SQLDB = 'IP DEL DB'
$DB = 'NomeDatabase'
$TABLE = 'Tabella da scrivere'
$TABLESRC = 'Tabella da leggere'

$connString = "Server = " + $SQLDB + "; Database = " + $DB +  "; Integrated Security = True"
$QueryText = "SELECT [UTENZAACTIVEDIRECTORY] FROM " + $DB + ".[dbo]." + $TABLESRC

$SqlConnection = new-object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = $connString
$SqlCommand = $SqlConnection.CreateCommand()

$SqlCommand.CommandText = $QueryText

$DataAdapter = new-object System.Data.SqlClient.SqlDataAdapter $SqlCommand
$dataset = new-object System.Data.Dataset
$DataAdapter.Fill($dataset)

$dataset.Tables[0] | ForEach {

$DataTable = Get-ADUser -identity $_.matricola.Trim() -Properties * |select samaccountname , surname, givenname, mail ,department, enabled |Where-Object {$_.LastLogonDate -ge (get-date).adddays(-400)} | ConvertTo-DbaDataTable
Write-DbaDataTable -SqlInstance $SQLDB -Database $DB -InputObject $DataTable -Table $TABLE -AutoCreateTable
}

Ovviamente è un esempio, con Get-ADUser possono essere fatte centinaia di altre operazioni. Inoltre lo script può essere schedulato su un server, eseguirlo in interattivo o inserirlo in un JOB SQL per un report.

Chiamare da un CL IBMi uno script SH e ricevere un output da esso

CLP (Control Language Program) è un linguaggio di scripting eccezionalmente potente che permette di automatizzare operazioni su IBM-i (conosciuto anche come AS400).

Seppur potente, non copre proprio tutto tutto, e spesso va affiancato ad altri strumenti quali script SH *nix-like, che permette a chi viene da sistemi Linux o Unix di poter creare cose molto interessanti.

Qui di seguito un esempio di programma che intercetta l’output di uno script SH che può essere utilizzato come variabile all’interno di un programma CLP:

PREMESSA: sulla macchina deve essere presente 5770-SS1 – Portable Application Solutions Environment.

Per intercettare il STDOUT va creata una variabile di sistema tramite il comando:

ADDENVVAR ENVVAR(QIBM_QSH_CMD_OUTPUT)  VALUE(STDOUT) LEVEL(*JOB)

Esempio di programma:

PGM                                               
DCLF       FILE(QTEMP/O1)                         
DLTF       FILE(QTEMP/O1)                         
MONMSG     MSGID(CPF2105)                         
CRTPF      FILE(QTEMP/O1) RCDLEN(1000)            
OVRDBF     FILE(STDOUT) TOFILE(QTEMP/O1)          
STRQSH     CMD('SH path dello script')
DLTOVR     FILE(*ALL)                             
RCVF                                              
MONMSG     MSGID(CPF0864)                         
SNDPGMMSG  MSG(&O1)  
ENDPGM                                            

Questo esempio:
– scrive sul file QTEMP/O1 tramite OVRDBF l’output dello script SH
– tramite RCVF del file QTEMP/O1 può essere letto il campo appena scritto come variabile &O1

Letteratura a supporto

https://www.ibm.com/docs/en/i/7.2?topic=reference-calling-qshell-commands-from-i-command-line

https://www.ibm.com/docs/en/i/7.3?topic=i-installing-pase

VBSCRIPT – Zippare ed Unzippare con 7z

In ambito sistemistico, a volte è utile avere tra le proprie armi una funzione per lavorare con i file ZIP. vi allego un comodo esempio da includere nei vostri script

Chiamata alla funzione

    ReturnCode = UnZip(“w:\file*.zip”, ”W:\CartellaOut\”)
    WScript.Echo ”ZIP ” & returnCode

    ReturnCode = Zip(“w:\file*.txt”, ”W:\CartellaOut\file.zip”)
    WScript.Echo ”ZIP ” & returnCode

Ponendo come riportato qui sopra, la funzione restituisce il return code.

Codice di Esempio

Le funzioni sono due: zip ed unzip

Function Zip(sFile,sArchiveName)

  Set oFSO = WScript.CreateObject("Scripting.FileSystemObject")
  Set oShell = WScript.CreateObject("Wscript.Shell")

  '--------Find Working Directory--------
  aScriptFilename = Split(Wscript.ScriptFullName, "\")
  sScriptFilename = aScriptFileName(Ubound(aScriptFilename))
  sWorkingDirectory = Replace(Wscript.ScriptFullName, sScriptFilename, "")
  '--------------------------------------

  '-------Ensure we can find 7z.exe------
  If oFSO.FileExists(sWorkingDirectory & "\" & "7z.exe") Then
    s7zLocation = ""
  ElseIf oFSO.FileExists("C:\Program Files\7-Zip\7z.exe") Then
    s7zLocation = "C:\Program Files\7-Zip\"
  Else
    Zip = "Error: Couldn't find 7z.exe"
    Exit Function
  End If
  '--------------------------------------

  oShell.Run """" & s7zLocation & "7z.exe"" a -tzip -y """ & sArchiveName & """ " _
  & sFile, 0, True   

  If oFSO.FileExists(sArchiveName) Then
    Zip = 1
  Else
    Zip = "Error: Archive Creation Failed."
  End If
End Function

Function UnZip(sArchiveName,sLocation)

  Set oFSO = WScript.CreateObject("Scripting.FileSystemObject")
  Set oShell = WScript.CreateObject("Wscript.Shell")

  '--------Find Working Directory--------
  aScriptFilename = Split(Wscript.ScriptFullName, "\")
  sScriptFilename = aScriptFileName(Ubound(aScriptFilename))
  sWorkingDirectory = Replace(Wscript.ScriptFullName, sScriptFilename, "")
  '--------------------------------------

  '-------Ensure we can find 7z.exe------
  If oFSO.FileExists(sWorkingDirectory & "\" & "7z.exe") Then
    s7zLocation = ""
  ElseIf oFSO.FileExists("C:\Program Files\7-Zip\7z.exe") Then
    s7zLocation = "C:\Program Files\7-Zip\"
  Else
    UnZip = "Error: Couldn't find 7z.exe"
    Exit Function
  End If
  '--------------------------------------

  '-Ensure we can find archive to uncompress-
  If Not oFSO.FileExists(sArchiveName) Then
    UnZip = "Error: File Not Found."
    Exit Function
  End If
  '--------------------------------------

  oShell.Run """" & s7zLocation & "7z.exe"" e -y -o""" & sLocation & """ """ & _
  sArchiveName & """", 0, True
  UnZip = 1
End Function