|
|
mercoledì 25 novembre 2009
lunedì 21 settembre 2009
Avendo la necessità di calcolare l'hash di un file all'interno di uno script Powershell, mi sono preparato questa piccola funzione che fa al caso mio:
function Get-HashFile([System.IO.FileInfo[]] $file)
{
if (($file.Count -le 0) )
{
#Write-Host "NA"
return $null
}
[object[]] $out = New-Object object[] $file.Length
for($z = 0; $z -lt $file.Length; $z++)
{
#Write-Host $file[$z].FullName
[System.Security.Cryptography.SHA1Managed] $hashAlg = New-Object System.Security.Cryptography.SHA1Managed
$str = New-Object System.IO.FileStream $file[$z].FullName, Open, Read
[byte[]] $hash = $hashAlg.ComputeHash($str)
#$out[$z] = [System.BitConverter]::ToString($hash)
$out[$z] = @{File=$file[$z]; FileHash=[System.BitConverter]::ToString($hash)}
$str.Close()
$str.Dispose()
}
return $out
}
$myFile = Get-Item c:\tmp\_Varie_\_Working\*.*
$test = Get-HashFile($myFile)
foreach($i in $test) {$i}
Le flessibilità e la potenzialità offerte dalla Powershell sono (come sempre) semplicemente fantastiche!
martedì 19 maggio 2009
Su http://channel9.msdn.com/ è disponibile una serie di documentari, di una 10ina di minuti l'uno, che raccontano anno dopo anno la storia della Microsoft. Si parte dal 1975 sino ad arrivare ai nostri giorni. Siamo al 1989 e settimanalmente (più o meno) viene rilasciato un video.
interessante...
http://channel9.msdn.com/shows/History/
lunedì 11 maggio 2009
Tenere in ordine gli oggetti presenti in un database, avendo cura periodicamente di eliminare tabelle, viste o procedure / funzioni non più utili, è da sempre un operazione un po critica e in alcuni casi anche abbastanza fastidiosa. Qualche giorno fa mi è stato chiesto di gestire una situazione molto simile alla suddetta. Era arrivato il momento di fare pulizia su uno dei database di supporto più grossi. Obbiettivo eliminare oggetti non più utilizzati e fare un censimento di quelli ancora utilizzati (per un eventuale aggiornamento).
Serviva monitorare l'utilizzo del suddetto database, procurando il meno "fastidio" possibile agli utenti.
Il Profiler in questi casi torna davvero utile.
Gli eventi che dobbiamo gestire sono (avendo cura di attivare tutte le colonne, vedere img.):
- Audit Schema Object Access Event
- Audit Database Object Access Event
A questo punto filtriamo solo i dati che riguardano il database che vogliamo monitorare (inserendo un filtro sulla colonna DatabaseName).
Attiviamo e verifichiamo che il tutto funzioni come previsto.
Magari potrebbe essere necessario raffinare i dati tracciati per mezzo di ulteriori filtri (in questo caso applicare un filtro sulla colonna ObjectName può tornare utile).
A questo punto possiamo generarci un template ScriptSQL (vedere img.) che andremo a parametrizzare correttamente e che quindi scheduleremo per mezzo di uno job.
Generato lo script apriamolo con query analayzer e procediamo con il configurarlo. Quattro sono le procedure che vengono utilizzate (e ben documentate su MSDN che vi invito ad consultare per ulteriori info):
- sp_trace_create: creare il trace
- sp_trace_setevent: impostare gli eventi da traccaire (e relative colonne)
- sp_trace_setfilter: impostare eventuali filtri
- sp_trace_setstatus: attivare / disattivare il trace
Per provare possiamo impostare a 2 il secondo parametro (attivando cosi il rollover del file) e inseriamo il path e relativo nome file del trace che andremo a generare:
exec @rc = sp_trace_create @TraceID output, 0, N'InsertFileNameHere', @maxfilesize, NULL (impostazioni originali)
exec @rc = sp_trace_create @TraceID output, 2, N'\\nomeShare\FolderTrace\FileName', @maxfilesize, NULL
Per monitorare lo stato dei vari trace attivi, possiamo ricorrere alla seguente funzione di sistema:
select
traceid,
case
when [property] = 1 then 'Opzioni della traccia'
when [property] = 2 then 'Nome del file'
when [property] = 3 then 'Dimensioni massime'
when [property] = 4 then 'Ora di interruzione'
when [property] = 5 then 'Stato corrente della traccia'
else convert(varchar(50), [property]) + ' - ND'
end
as [property_descr],
[property],
[value]
from fn_trace_getinfo ( 0 )
Il traceid=1 è da considerarsi di sistema.
Vediamo un esempio di script di schedulazione completo:
--Per prima cosa provvedo a stoppare eventuali trace attivi in precedenza...
DECLARE @TraceID_ToStop AS INT
select @TraceID_ToStop = 0
--Recupero il traceid
select @TraceID_ToStop = isnull(traceid, 0)
from fn_trace_getinfo ( 0 )
WHERE CONVERT(NVARCHAR(255), [value]) LIKE '%Profiler_Cambusa_Log_%_.trc' and traceid > 1 --Filtro sul nome file del trace per recuperare eventuali trace attivi.
if(select @TraceID_ToStop) > 1
begin
--Arresto ed elimino trace...
exec sp_trace_setstatus @TraceID_ToStop, 0
exec sp_trace_setstatus @TraceID_ToStop, 2
print 'Stoped TraceID: ' + convert(varchar(50), @TraceID_ToStop)
end
--------------------------------------------------------------
DECLARE @DateNow AS NVARCHAR(500)
DECLARE @PathFileLog AS NVARCHAR(255)
SET @DateNow = CONVERT(VARCHAR(255), GETDATE(), 112)
SET @PathFileLog = 'F:\Profile\Cambusa\Profiler_Cambusa_Log_' + @DateNow + '_' --Preparo il path e il nome file del trace.
PRINT 'PathFileLog: ' + @PathFileLog
-- Create a Queue
declare @rc int
declare @TraceID int
declare @maxfilesize bigint
set @maxfilesize = 50
exec @rc = sp_trace_create @TraceID output, 2, @PathFileLog, @maxfilesize, NULL
if (@rc != 0) goto error
-- Client side File and Table cannot be scripted
-- Set the events
declare @on bit
set @on = 1
exec sp_trace_setevent @TraceID, 180, 7, @on
exec sp_trace_setevent @TraceID, 180, 23, @on
exec sp_trace_setevent @TraceID, 180, 8, @on
exec sp_trace_setevent @TraceID, 180, 40, @on
exec sp_trace_setevent @TraceID, 180, 64, @on
exec sp_trace_setevent @TraceID, 180, 1, @on
exec sp_trace_setevent @TraceID, 180, 41, @on
exec sp_trace_setevent @TraceID, 180, 49, @on
exec sp_trace_setevent @TraceID, 180, 6, @on
exec sp_trace_setevent @TraceID, 180, 10, @on
exec sp_trace_setevent @TraceID, 180, 14, @on
exec sp_trace_setevent @TraceID, 180, 26, @on
exec sp_trace_setevent @TraceID, 180, 34, @on
exec sp_trace_setevent @TraceID, 180, 50, @on
exec sp_trace_setevent @TraceID, 180, 3, @on
exec sp_trace_setevent @TraceID, 180, 11, @on
exec sp_trace_setevent @TraceID, 180, 19, @on
exec sp_trace_setevent @TraceID, 180, 35, @on
exec sp_trace_setevent @TraceID, 180, 51, @on
exec sp_trace_setevent @TraceID, 180, 4, @on
exec sp_trace_setevent @TraceID, 180, 12, @on
exec sp_trace_setevent @TraceID, 180, 28, @on
exec sp_trace_setevent @TraceID, 180, 60, @on
exec sp_trace_setevent @TraceID, 180, 29, @on
exec sp_trace_setevent @TraceID, 180, 37, @on
exec sp_trace_setevent @TraceID, 114, 7, @on
exec sp_trace_setevent @TraceID, 114, 23, @on
exec sp_trace_setevent @TraceID, 114, 8, @on
exec sp_trace_setevent @TraceID, 114, 40, @on
exec sp_trace_setevent @TraceID, 114, 64, @on
exec sp_trace_setevent @TraceID, 114, 1, @on
exec sp_trace_setevent @TraceID, 114, 9, @on
exec sp_trace_setevent @TraceID, 114, 41, @on
exec sp_trace_setevent @TraceID, 114, 49, @on
exec sp_trace_setevent @TraceID, 114, 2, @on
exec sp_trace_setevent @TraceID, 114, 10, @on
exec sp_trace_setevent @TraceID, 114, 26, @on
exec sp_trace_setevent @TraceID, 114, 34, @on
exec sp_trace_setevent @TraceID, 114, 50, @on
exec sp_trace_setevent @TraceID, 114, 3, @on
exec sp_trace_setevent @TraceID, 114, 11, @on
exec sp_trace_setevent @TraceID, 114, 19, @on
exec sp_trace_setevent @TraceID, 114, 35, @on
exec sp_trace_setevent @TraceID, 114, 51, @on
exec sp_trace_setevent @TraceID, 114, 59, @on
exec sp_trace_setevent @TraceID, 114, 4, @on
exec sp_trace_setevent @TraceID, 114, 12, @on
exec sp_trace_setevent @TraceID, 114, 28, @on
exec sp_trace_setevent @TraceID, 114, 44, @on
exec sp_trace_setevent @TraceID, 114, 60, @on
exec sp_trace_setevent @TraceID, 114, 5, @on
exec sp_trace_setevent @TraceID, 114, 21, @on
exec sp_trace_setevent @TraceID, 114, 29, @on
exec sp_trace_setevent @TraceID, 114, 37, @on
exec sp_trace_setevent @TraceID, 114, 6, @on
exec sp_trace_setevent @TraceID, 114, 14, @on
-- Set the Filters
declare @intfilter int
declare @bigintfilter bigint
exec sp_trace_setfilter @TraceID, 35, 0, 6, N'DbNameTest_1' --Filtro solo attività sul seguente db
exec sp_trace_setfilter @TraceID, 34, 0, 7, N'OggettoDaEscludereDalMonitoring' --escludo eventuali oggetti
-- Set the trace status to start
exec sp_trace_setstatus @TraceID, 1
-- display trace id for future references
select TraceID=@TraceID
goto finish
error:
select ErrorCode=@rc
finish:
return
Questo script potrebbe essere schedulato giornalmente, ed in automatico provvederà a creare uno o più file di trace con nome file e data di generazione.
Periodicamente potrete quindi aprire il vostro file trace con il profiler ed importarlo in una tabella per eseguire eventuali indagini (vedere img.).
mercoledì 25 marzo 2009
E da un po che non scrivo... in questo periodo tra la facoltà e il lavoro, il tempo si è ridotto notevolmente. Nel tempo "forzatamente libero" offertomi dalle Ferrovie Nord Milano che puntualmente sono in ritardo, sto avendo modo di leggere con molto interesse questo libro: Il Lato Oscuro della Rete di N. Carr.
Argomento centrale è la rete e le sue future possibili evoluzioni sia dal punto di vista prettamente informatico, sia dal punto vista sociale.
Il taglio è "giornalistico", scorrevole e piacevole e fatta eccezione le poche volte che l'autore si fa prendere da un certo pessimismo cosmico, rimane una lettura che comunque consiglio caldamente.
alla proxima!
venerdì 19 dicembre 2008
Con un mio amico stiamo portando avanti, da un po' di tempo un progetto in comune. Avere un tool di versioning inizia ad essere indispensabile. Mi sono fatto un giro in giro è ho trovato qualche provider che offre servizi di hosting per SVN. In particolare: http://xp-dev.com/ è quello che mi è sembrato il più adatto alle nostre necessità. Il servizio (almeno per ora) è gratuito è mette a disposizione circa 1,5Gb di spazio. Inoltre ha una gestione (seppur molto semplice) dei progetti, bug e wiki.
Altri provider che offrono servizi analoghi:
http://unfuddle.com/
https://www.myversioncontrol.com/
http://www.beanstalkapp.com/
http://www.codespaces.com/
http://www.beanstalkapp.com/
giovedì 13 novembre 2008
Oggi mi è arrivata la comunicazione da parte dell'università, che posso usufruire della suddetta iniziativa  :
https://www.dreamspark.com/default.aspx
La Microsoft è sempre stata molto attenta sotto questo punto di vista, e alla fine pur lavorando in questo settore e avendo la possibilità di procurarmi ugualmente i suddetti prodotti, fa ugualmente piacere poter usufruire di queste iniziative.
Forse una piccola critica la muovo proprio al mondo universitario (almeno la facoltà e il corso che frequento io), che spesso "snobba" la piattaforma Microsoft a favore di Java / PHP / Linux.
giovedì 6 novembre 2008
giovedì 11 settembre 2008
Interessante raccolta di articoli e suggerimenti riguardanti il web e la sicurezza.
http://code.google.com/doctype/
martedì 12 agosto 2008
Ho provveduto ad aggiornarli e ricompilarli con il Framework 3.5 (Sln. VS 2008).
Sono inoltre state apportate lievi modifiche.
Rilasciata una nuova release del tool SQL Server Data Pump (ver. 1.5.2).
SQL Server Data Pump (ver. 1.5.2)
sabato 5 luglio 2008
Pubblicato questo semplice Task su Codeplex. Attualmente gestisce solo il formatto ZIP, permettendo di comprimere e decomprimere un archivio. Ho aggiunto per comodità anche il supporto alla password.
http://www.codeplex.com/TaskUnZip
venerdì 6 giugno 2008
Da qualche giorno è stata rilasciata la versione SQL Lite 3.5.9 e relativa libreria .NET.
Qui trovate tutto:
http://www.sqlite.org/
http://sqlite.phxsoftware.com/
giovedì 5 giugno 2008
Durante l’attuale procedura di migrazione di una serie di database da SQL 2000 a SQL 2005 ho avuto modo di utilizzare l’ottimo tool della RedGate SQL Compare.
Ho notato che durante la migrazione degli utenti il suddetto tool provvede a crearli/migrarli ma non aggiunge la GRANT Connect.
Di default SQL 2005 non la inserisce (giustamente) e di conseguenza gli utenti che appartengono a ruoli di basso rango (es. db_datareader) non possono accedere ai vari database.
Per risolvere il problema (dato che non ho trovato soluzioni fra le opzioni offerte da SQL Compare) ho provveduto a scrivermi due righe di codice che si interfacciano con lo SMO di SQL Server (per l’occasione gli ho dato anche un occhio…).
Ve li allego, magari possono tornare utili a qualcun altro.
Il codice magari è un po’ sporco, ma l’idea c’è
Link
|