<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mauro Dalfreddo</title>
	<atom:link href="http://www.maurodalfreddo.it/feed" rel="self" type="application/rss+xml" />
	<link>http://www.maurodalfreddo.it</link>
	<description>My work, my life... my Blog</description>
	<lastBuildDate>Thu, 24 Jun 2010 12:10:20 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Enrico Ruggeri</title>
		<link>http://www.maurodalfreddo.it/archives/350/enrico-ruggeri</link>
		<comments>http://www.maurodalfreddo.it/archives/350/enrico-ruggeri#comments</comments>
		<pubDate>Thu, 24 Jun 2010 12:06:43 +0000</pubDate>
		<dc:creator>Mauro Dalfreddo</dc:creator>
				<category><![CDATA[Musica]]></category>

		<guid isPermaLink="false">http://www.maurodalfreddo.it/?p=350</guid>
		<description><![CDATA[Primo concerto del tour estivo 2010 di Enrico Ruggeri ]]></description>
			<content:encoded><![CDATA[<div class="mceTemp mceIEcenter" style="text-align: left;"><em> </em></div>
<div class="mceTemp mceIEcenter" style="text-align: left;"><em>Un grande ed emozionante primo concerto del tour estivo 2010 di Enrico Ruggeri</em></div>
<div class="mceTemp mceIEcenter" style="text-align: left;"><em> </em></div>
<div id="attachment_356" class="wp-caption aligncenter" style="width: 510px"><a href="http://www.maurodalfreddo.it/wp-content/uploads/2010/06/ruggeri2m.jpg" target="_blank"><img class="size-full wp-image-356 " title="Enrico Ruggeri - La Ruota Tour 2010" src="http://www.maurodalfreddo.it/wp-content/uploads/2010/06/ruggeri2p.jpg" alt="Enrico Ruggeri - La Ruota Tour 2010" width="500" height="287" /></a><p class="wp-caption-text">Enrico Ruggeri - La Ruota Tour 2010</p></div>
<p> </p>
<p>E&#8217; cominciato venerdì 18 giugno scorso a Cologna Veneta il tour estivo di Enrico Ruggeri. Ero presente anch&#8217;io. E&#8217;da tanti anni che non assistevo ad un suo concerto, dal lontano &#8216;92: quello fù un concerto del &#8220;Peter Pan Tour&#8221; tenuto al Supercinema di Padova.  Oggi come allora ho goduto di un concerto perfetto ed <em>a misura d&#8217;uomo</em>, ovvero dall&#8217;atmosfera coinvolgente, con acustica perfetta (non scadente come negli stadi o negli infernali palasport), e senza l&#8217;affollamento caratteristico dei mega-concertoni, dovuto sicuramente anche al carattere elitario della sua musica e quindi ad un pubblico relativamente selettivo&#8230;</p>
<p>Ed è proprio a questo tipo di eventi che puoi portare anche la famiglia; oltre a Romy c&#8217;era anche Sebastiano: il suo primo concerto. Ho potuto trasmetteregli un po&#8217; di passione per Enrico, per il Rock melodico e per la musica suonata in generale&#8230; Sicuramente un&#8217;esperienza forte, che rimmarrà impressa nei ricordi.</p>
<p>Un concerto incredibile, grandioso, straordinario&#8230; lo show veramente emozionante. E&#8217; musica da ascoltare e da cantare nel migliore dei modi, quindi comodi e da seduti, ma non è mancata l&#8217;occasione per poter saltare e scatenarsi davanti al palco nel finale, alle parole di Enrico <em>&#8220;..ed ora scatenate l&#8217;inferno!&#8221;</em>; insomma un modo per accontentare un po&#8217; tutti, anche quel popolo &#8220;punk&#8221; che lo segue dagli esordi&#8230;.</p>
<p> </p>
<div id="attachment_358" class="wp-caption aligncenter" style="width: 510px"><img class="size-full wp-image-358" title="Enrico Ruggeri e Luigi Schiavone" src="http://www.maurodalfreddo.it/wp-content/uploads/2010/06/ruggeri3.jpg" alt="Enrico Ruggeri e Luigi Schiavone" width="500" height="333" /><p class="wp-caption-text">Enrico Ruggeri e Luigi Schiavone</p></div>
<p>Il &#8220;La Ruota Tour 2010&#8243; oltre a proporre i nuovi brani dell&#8217;ultimo album, ripercorre gran parte dei brani storici, alcuni dei quali scelti direttamente dal pubblico invitato sul palco con il meccanismo di una ruota virtuale dove sono riportati moltissimi titoli delle sue canzoni: il concerto è iniziato con <em>Vivi</em> e seguendo un po&#8217; la sceletta e lasciando un po&#8217; di spazio all&#8217;improvvisazione e al caso si è giunti al termine con<em> La notte delle fate</em> e la celeberrima <em>Contessa</em>.  Enrico si è dato un gran da fare ed ha cantato per più di due ore ininterrotamente e con lui la sua band. Gli amici musicisti con cui suona Enrico sono sempre rimasti gli stessi fin dai tempi dei Decibel, tra i quali il mitico <a href="http://www.luigischiavone.com/" target="_blank">Luigi Schiavone</a> alla chitarra ed il grande <a href="http://www.fabriziopalermo.it/" target="_blank">Fabrizio Palermo</a> al basso.</p>
<p> </p>
<div id="attachment_357" class="wp-caption aligncenter" style="width: 510px"><img class="size-full wp-image-357    " title="Ho beccato Rrouge appena prima del concerto" src="http://www.maurodalfreddo.it/wp-content/uploads/2010/06/ruggeri1.jpg" alt="Rrouge appena prima del concerto" width="500" height="382" /><p class="wp-caption-text">Ho beccato Rrouge nel backstage appena prima del concerto: indossavo la gloriosa maglietta del Peter Pan Tour del &#39;92</p></div>
<div class="mceTemp mceIEcenter" style="TEXT-ALIGN: left"><strong> </strong></div>
<div class="mceTemp mceIEcenter" style="TEXT-ALIGN: left"><strong>Link utili</strong></div>
<div class="mceTemp mceIEcenter" style="TEXT-ALIGN: left">
<div style="TEXT-ALIGN: left"><a href="http://www.enricoruggeri.info/">http://www.enricoruggeri.info/</a> Sito ufficiale di Enrico Ruggeri</div>
<div style="TEXT-ALIGN: left"><a href="http://www.nuovoswing.com/">http://www.nuovoswing.com/</a> Nuovo Swing, web-zine dedicata ad Enrico Ruggeri</div>
<div style="TEXT-ALIGN: left"><a href="http://www.youtube.com/watch?v=7QY9IKURVNM">http://www.youtube.com/watch?v=7QY9IKURVNM</a>  You Tube, alcuni momenti del concerto di Cologna Veneta</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.maurodalfreddo.it/archives/350/enrico-ruggeri/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Eseguire Stored Procedures in una funzione UDF (SQL Server)</title>
		<link>http://www.maurodalfreddo.it/archives/328/eseguire-stored-procedures-in-una-funzione-udf-sql-server</link>
		<comments>http://www.maurodalfreddo.it/archives/328/eseguire-stored-procedures-in-una-funzione-udf-sql-server#comments</comments>
		<pubDate>Wed, 28 Apr 2010 20:34:56 +0000</pubDate>
		<dc:creator>Mauro Dalfreddo</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Hack]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://www.maurodalfreddo.it/?p=328</guid>
		<description><![CDATA[E'possibile eseguire stored procedures in functions UDF con Microsoft SQL SERVER attraverso un workaround. Analisi della problematica e codifica di una .NET external function che permette l'esecuzione di dynamic SQL. (SQL Server: How to execute Stored procedures into a UDF function)]]></description>
			<content:encoded><![CDATA[<p><em>Un workaround per eseguire stored procedures in functions UDF con Microsoft SQL SERVER. Analizziamo la problematica e scriviamo una .NET external function che permette l&#8217;esecuzione di dynamic SQL. </em></p>
<p>Ultimamente mi sono scontrato con la problematica di eseguire una stored procedure da una funzione SQL UDF (<a href="http://www.google.it/search?hl=it&amp;rlz=1G1GGLQ_ITIT252&amp;q=How+to+execute+Stored+procedures+into+a+UDF+function&amp;meta=&amp;aq=f&amp;aqi=&amp;aql=&amp;oq=&amp;gs_rfai=" target="_blank">google</a>: <em>How to execute Stored procedures into a UDF function</em>).<br />
L&#8217;esecuzione di codice INSERT/UPDATE/DELETE/STORED PROCEDURE che alterano il contesto esterno alla funzione non è possibile <a href="http://msdn.microsoft.com/en-us/library/ms191320(SQL.90).aspx" target="_blank">by design</a>; è possibile solo apportare modifiche a variabili locali definite nella funzione. Infatti appena tentiamo di alterare il contesto del database otteniamo uno dei seguenti messaggi di errore, rispettivamente se stiamo utilizzando comandi TSQL INSERT/UPDATE/DELETE, chiamando STORED PROCEDURE o cercando di eseguire SQL dinamico:</p>
<p><span style="color: #ff0000;">Invalid use of side-effecting or time-dependent operator in &#8216;INSERT&#8217; within a function.</span></p>
<p><span style="color: #ff0000;">Only functions and extended stored procedures can be executed from within a function.</span></p>
<p><span style="color: #ff0000;">Invalid use of side-effecting or time-dependent operator in &#8216;EXECUTE STRING&#8217; within a function.</span></p>
<p>L&#8217;utilizzo delle funzioni SQL è utilizzato per leggere e applicare una certa logica ai dati letti, ma non a trasformarli o modificarli. E&#8217;difficile pensare che leggendo dei dati da una tabella con una SELECT questi vengano modificati sotto il naso.<br />
Se ci dovessero essere logiche più complesse, come l&#8217;utilizzo di tabelle di appoggio temporanee, certo è preferibile e doveroso racchiudere il codice in una stored procedure.</p>
<p>Questo in linea di principio e come best practice.<br />
Un caso che ho dovuto affrontare era quello dell&#8217;ottimizzazione delle performance di una serie di applicazioni. Queste, accedendo al DB, ed utilizzando gli strumenti offerti TSQL, utilizzavano tutte, in più punti e ripetutamente una certa funzione, che, accedendo a dati esterni al DB con protocollo TCP/IP, risultava particolarmente lenta a rispondere.</p>
<p>Da qui l&#8217;idea di implementare un <em><strong>meccanismo di caching</strong></em> nella funzione stessa; non era assolutamente pensabile cambiare la logica<br />
applicativa modificando il codice e le modalità di interfacciamento al DB. L&#8217;operazione doveva essere completamente trasparente per le applicazioni!</p>
<p>L&#8217;algoritmo di caching può essere banalmente il seguente:</p>
<pre>IF (prima volta)
 BEGIN
  recupera i dati online
  memorizzali nella cache
 ELSE
  recupera i dati dalla cache
 END</pre>
<p>Includere tale logica in una funzione SQL è semplice&#8230;<br />
Peccato che il significato di <em>memorizzare i dati</em> è quello di utilizzare un&#8217;istruzione del tipo INSERT/UPDATE/ST.PROCEDURE e che quindi modifica il contesto esterno alla funzione.</p>
<p>Nel seguito espongo la soluzione di <strong>come eseguire una stored procedure in una funzione</strong>, descrivendo i passi utili a creare una logica di caching sopra descritta.</p>
<p> </p>
<p><span id="more-328"></span></p>
<p>Immaginiamo di avere una funzionalità di basso livello (my_very_slow_function) che, dopo essersi connessa con un tal sistema autorizzativo, restituisca i ruoli associati ad un utente.<br />
Vogliamo utilizzare questa funzionalità in una funzione di più alto livello (my_function) che incapsuli la logica (quindi una funzione wrapper)</p>
<pre>CREATE FUNCTION [dbo].my_very_slow_function(@login nvarchar(50))
RETURNS TABLE
AS
RETURN
(  
 SELECT 'Administrator' as Role,0 as Type UNION
 SELECT 'Contributor', 0 UNION   
 SELECT 'Public role', 0 UNION   
 SELECT @login, 1
)</pre>
<pre>SELECT type,role FROM [dbo].my_very_slow_function('DOMAIN\testuser') ORDER BY type,role
<span style="color: #3366ff;"><em>type role</em>
0    Administrator
0    Contributor
0    Public role
1    DOMAIN\testuser</span></pre>
<pre>CREATE FUNCTION [dbo].[my_function](@login nvarchar(50))
RETURNS
@roles TABLE (role varchar(400), type int)
AS
BEGIN
 INSERT INTO @roles (role,type)
  SELECT role,type FROM my_very_slow_function(@login)
  RETURN
END</pre>
<pre>SELECT type,role FROM [dbo].my_function('DOMAIN\testuser') ORDER BY type,role</pre>
<p>Vogliamo quindi inserire nella funzione wrapper my_function la logica di caching. Creiamo la tabella per la cache e modifichiamo opportunamente la funzione.</p>
<pre>CREATE TABLE dbo.MYCACHE (
login VARCHAR(50) NOT NULL,
role VARCHAR(400) NOT NULL,
type INT NOT NULL,
ts datetime DEFAULT getdate(),
PRIMARY KEY (login,role)
)</pre>
<pre>GO</pre>
<pre>ALTER FUNCTION [dbo].[my_function](@login nvarchar(50))
RETURNS
@roles TABLE (role varchar(400), type int)
AS
BEGIN
 INSERT INTO @roles (role,type)
  SELECT role,type FROM dbo.MYCACHE
  WHERE login = @login
 IF @@ROWCOUNT = 0
 BEGIN  
  INSERT INTO [dbo].MYCACHE (login,role,type)
   SELECT @login,role,type FROM my_very_slow_function(@login)
  INSERT INTO @roles (role,type)
   SELECT role,type FROM dbo.MYCACHE
   WHERE login = @login
 END  
  RETURN
END</pre>
<p>Se tentiamo di modificare la funzione in tal senso otteniamo il seguente errore:</p>
<pre><span style="color: #ff0000;">Msg 443, Level 16, State 15, Procedure my_function, Line 11
Invalid use of side-effecting or time-dependent operator in 'INSERT' within a function.</span></pre>
<p>Cerchiamo di seguire un&#8217;altra strada: eseguire nella funzione una stored procedure contenente la logica del caching.</p>
<pre>CREATE PROCEDURE [dbo].MYCACHEINSERT 
 @login VARCHAR(50) 
AS
BEGIN
 INSERT INTO [dbo].MYCACHE (login,role,type)
  select @login,role,type
  FROM dbo.my_very_slow_function(@login) 
END
GO

ALTER FUNCTION [dbo].[my_function](@login nvarchar(50))
RETURNS
@roles TABLE (role varchar(400), type int)
AS
BEGIN
 DECLARE @sql NVARCHAR(400)

 INSERT INTO @roles (role,type)
  SELECT role,type FROM dbo.MYCACHE
  WHERE login = @login
 IF @@ROWCOUNT = 0
 BEGIN  
  exec dbo.MYCACHEINSERT @login
  
  INSERT INTO @roles (role,type)
   SELECT role,type FROM dbo.MYCACHE
   WHERE login = @login
 END  
  RETURN
END
GO</pre>
<p>Questa volta la creazione/aggiornamento non hanno problemi ma si presenta un errore in fase di esecuzione</p>
<pre>SELECT type,role FROM [dbo].my_function('DOMAIN\testuser') ORDER BY type,role</pre>
<pre><span style="color: #ff0000;">Msg 557, Level 16, State 2, Line 1
Only functions and extended stored procedures can be executed from within a function.
</span></pre>
<p><span style="color: #000000;">Possiamo anche provare a modificare la funzione per farle eseguire codice SQL dinamico, e questa volta otteniamo un errore in fase di modifica.</span></p>
<pre>ALTER FUNCTION [dbo].[my_function](@login nvarchar(50))
RETURNS
@roles TABLE (role varchar(400), type int)
AS
BEGIN
 DECLARE @sql NVARCHAR(400)

 INSERT INTO @roles (role,type)
  SELECT role,type FROM dbo.MYCACHE
  WHERE login = @login
 IF @@ROWCOUNT = 0
 BEGIN  
  SELECT @sql = 'exec dbo.MYCACHEINSERT '''+@login+''''
  exec(@sql)
  
  INSERT INTO @roles (role,type)
   SELECT role,type FROM dbo.MYCACHE
   WHERE login = @login
 END  
  RETURN
END</pre>
<pre><span style="color: #ff0000;">Msg 443, Level 16, State 14, Procedure my_function, Line 14
Invalid use of side-effecting or time-dependent operator in 'EXECUTE STRING' within a function.</span></pre>
<pre> </pre>
<p>La spiegazione nella difformità di comportamento dal precedente tentativo sta nel fatto che si può usare EXEC giusto per chiamare Extended Stored Procedures, ovvero le stored procedures scritte in C e compilate. Per definizione non si può cambiare lo stato del Database da dentro la funzione UDF, e così non si può costruire SQL dinamico ed eseguirlo con la stored procedure estesa &#8220;sp_executesql&#8221; (EXEC).</p>
<p>Documentandomi in Internet ho trovato un modo per eseguire uno statement SQL di aggiornamento/inserimento usando la funzione OPENQUERY e un LINKED SERVER che si autoreferenzia:</p>
<pre>SELECT count(*) FROM OPENQUERY(LINKED SERVER,'INSERT INTO ....')</pre>
<p>Peccato che la stringa di testo deve essere una costante, e non è possibile sostituirla con variabili e/o espressioni.</p>
<p>L&#8217;unico modo by design per risolvere il problema è quello di scrivere un&#8217;extended stored procedure in C, correndo il rischio che questa non funzioni più nelle prossime versioni di SQL Server, visto che la scrittura di questo tipo di procedures è deprecata. Scrivendo una external stored procedure in C# (.NET) non si risolve il problema, visto che non viene marcata come &#8220;extended&#8221; da SQL Server e che quindi non è possibile usarla dentro una funzione UDF.</p>
<p>Anche scrivendo una funzione external in C# ed eseguendo un&#8217;operazione INERT, ottenendo la connessione dal contesto con</p>
<pre><span style="color: #339966;">SqlConnection conn = new SqlConnection("context connection= true");</span></pre>
<p>otterremmo gli errori iniziali per i quali non è possibile modificare il contesto del DB. L&#8217;unico modo alla fine è quello di scrivere una funzione esterna C# ed istanziare una nuova connessione, ma sempre allo stesso database. In tal modo si inganna SQL Server, che non può più riconoscere l&#8217;eventuale modifica al contesto esterno.</p>
<p>Ora apriamo Visual Studio e creiamo un nuovo progetto SQL Server &#8220;MYUDF&#8221; in C#. Nelle proprietà del progetto ricodiamoci di impostare l&#8217;opzione &#8220;Sign the assembly&#8221;.</p>
<p>Poi aggiungiamo un nuovo file al progetto dti tipo Funzione UDF:</p>
<pre><span style="color: #339966;">using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction(Name = "ExecuteSQL", </span></pre>
<pre><span style="color: #339966;">     </span><span style="color: #339966;">DataAccess = DataAccessKind.Read, IsDeterministic = false)]</span></pre>
<pre><span style="color: #339966;">    public static int ExecuteSQL(SqlString sql, SqlString connstr)
    {
        using (SqlConnection conn = new SqlConnection(connstr.Value))
        {
            int res=0;
            try
            {                            
                conn.Open();               
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = sql.Value;               
                res = (int)cmd.ExecuteNonQuery();               
            }
            catch (Exception ex)
            {               
                throw;
            }
            finally {                               
                conn.Close();               
            }
            return res;
        }
       
    }
}</span></pre>
<p>La funzione riceve dall&#8217;input due parametri: la stringa contenente il codice SQL e quella per la connessione ad un DB. I controlli per la sicurezza e la gestione dell&#8217;errore è stata volutamente trascurata per semplificare la lettura. Al build del progetto verrà prodotto l&#8217;assembly MYUDF.dll, che dovrà essere copiato sul database server in una certa cartella, diciamo C:\TEMP. Creiamo e carichiamo l&#8217;assembly nel DB con il comando TSQL &#8220;CREATE ASSEMBLY&#8221;:</p>
<p>L&#8217;istruzione CREATE ASSEMBLY MYUDF può fallire e produrre i seguenti messaggi d&#8217;errore:</p>
<p>A) <span style="color: #ff0000;">Msg 10327, Level 14, State 1, Line 1 </span></p>
<p><span style="color: #ff0000;">CREATE ASSEMBLY for assembly &#8216;MYUDF&#8217; failed because assembly &#8216;MYUDF&#8217; is not authorized for PERMISSION_SET = UNSAFE.  The assembly is authorized when either of the following is true: the database owner (DBO) has UNSAFE ASSEMBLY permission and the database has the TRUSTWORTHY database property on; or the assembly is signed with a certificate or an asymmetric key that has a corresponding login with UNSAFE ASSEMBLY permission. </span></p>
<pre>ALTER DATABASE MYDB set trustworthy on;</pre>
<p>B) <span style="color: #ff0000;">Msg 0, Level 20, State 0, Line 0  </span></p>
<p><span style="color: #ff0000;">Errore grave durante l&#8217;esecuzione del comando corrente. Annullare i risultati eventuali.</span></p>
<p>Questo è un BUG noto (almeno per SQL2005), basta eseguire il seguente comando: <em>exec sp_changedbowner &#8216;&lt;username of the db attacher, ‘sa’, or any windows authenticated login&gt;&#8217;</em></p>
<pre>EXEC sp_changedbowner 'sa'

CREATE ASSEMBLY MYUDF
AUTHORIZATION [dbo] FROM 'C:\TEMP\MYUDF.dll' WITH PERMISSION_SET = UNSAFE;

CREATE FUNCTION [dbo].[ExecuteSQL](@sql [nvarchar](4000),@conn [nvarchar](200))
RETURNS int
AS EXTERNAL NAME MYUDF.[UserDefinedFunctions].ExecuteSQL</pre>
<pre>GRANT EXECUTE ON [dbo].[ExecuteSQL] TO [public]</pre>
<p>Abbiamo appena creato la funzione UDF .NET, ed ora ci prepariamo a testarla:</p>
<pre>select [dbo].[ExecuteSQL]('exec dbo.MYCACHEINSERT ''WORKGROUP\user1''','Data Source=MYSERVER;Initial Catalog=MYDB;Integrated Security=False;user id=dbu;password=dbu;')

<span style="color: #ff0000;">Msg 6522, Level 16, State 1, Line 1
A .NET Framework error occurred during execution of user defined routine or aggregate 'ExecuteSQL':
System.Data.SqlClient.SqlException: EXECUTE permission denied on object 'MYCACHEINSERT', database 'MYDB', schema 'dbo'.</span></pre>
<pre>GRANT EXECUTE ON [dbo].MYCACHEINSERT TO [dbu]</pre>
<p>Ora che abbiamo dato i permessi &#8220;rieseguiamo&#8221; la funzione, che &#8220;magicamente&#8221; ritorna i risultati attesi. Infatti nella tabella ci sono 4 righe. Bisogna far notare che è stato creata una login specifica &#8220;dbu&#8221; per inserire i dati nella tabella di cache e solo per quello scopo. Poi integriamo la chiamata ad ExecuteSQL in my_function.</p>
<pre>SELECT * FROM dbo.MYCACHE
<span style="color: #3366ff;"><em>login           role            type ts</em>
WORKGROUP\user1 Administrator   0    2010-04-25 12:08:13.513
WORKGROUP\user1 Contributor     0    2010-04-25 12:08:13.513
WORKGROUP\user1 Public role     0    2010-04-25 12:08:13.513
WORKGROUP\user1 WORKGROUP\user1 1    2010-04-25 12:08:13.513</span>
SELECT count(*) FROM dbo.MYCACHE
<span style="color: #3366ff;">4</span>

ALTER FUNCTION [dbo].[my_function](@login nvarchar(50))
RETURNS
@roles TABLE (role varchar(400), type int)
AS
BEGIN
 DECLARE @sql NVARCHAR(400)
 DECLARE @conn NVARCHAR(200)
 DECLARE @count INT

 INSERT INTO @roles (role,type)
  SELECT role,type FROM dbo.MYCACHE
  WHERE login = @login
 IF @@ROWCOUNT = 0
 BEGIN  
  SELECT @sql = 'exec dbo.MYCACHEINSERT '''+@login+'''',
   @conn = 'Data Source=MYSERVER;Initial Catalog=MYDB;Integrated Security=False;user id=dbu;password=dbu;'
  SELECT @count = [dbo].[ExecuteSQL] (@sql,@conn)
  
  INSERT INTO @roles (role,type)
   SELECT role,type FROM dbo.MYCACHE
   WHERE login = @login
 END  
  RETURN
END

SELECT type,role FROM [dbo].my_function('DOMAIN\testuser') ORDER BY type,role
<span style="color: #3366ff;"><em>type role</em>
0    Administrator
0    Contributor
0    Public role
1    DOMAIN\testuser</span>

SELECT count(*) FROM dbo.MYCACHE
<span style="color: #3366ff;">8</span></pre>
<p>Verifica effettuata e possiamo affermare che&#8230; il gioco è fatto! A questo punto abbiamo terminato di implementare il caching che ci prefiggevamo. Infatti le chiamate successive alla prima sono molto più veloci nell&#8217;esecuzione. Ora la funzione wrapper my_function può essere utilizzata in altri contesti, in altre funzioni o stored procedures.</p>
<p>Per esempio:</p>
<pre>CREATE FUNCTION [dbo].[my_function2](@login nvarchar(50),@param1 varchar(50))
RETURNS TABLE
AS
RETURN
( 
 SELECT count(*) as N, @param1 as M FROM [dbo].my_function(@login)  
)
SELECT * FROM [dbo].[my_function2]('DOMAIN\test2','param')
<span style="color: #3366ff;"><em>N M</em>
4 param</span></pre>
<p>Di seguito espongo una problematica che ho incontrato nell&#8217;utilizzare la tecnica sopra esposta in una stored procedure che utilizza un oggetto non locale quale una tabella temporanea (ricordo che è comunque una TABLE nel tempdb). Con simili oggetti si verrebbe a creare una transazione distribuita, ma SQL Server, capendo che la connessione istanziata dal codice .NET, individua un conflitto di sessioni. E da qui il messaggio di errore di cui sotto.</p>
<pre>CREATE PROCEDURE [dbo].[my_procedure]  
 @login varchar(50),
 @param1 varchar(50)
AS
BEGIN 
 SET NOCOUNT ON;
 SELECT count(*) as N, @param1 as M FROM [dbo].my_function(@login)  
END
exec [dbo].[my_procedure] 'DOMAIN\test2','param'
--N M
--4 param
ALTER PROCEDURE [dbo].[my_procedure]  
 @login varchar(50),
 @param1 varchar(50)
AS
BEGIN 
 SET NOCOUNT ON;
 SELECT count(*) as N, @param1 as M INTO #temp FROM [dbo].my_function(@login)  
 SELECT * FROm #temp
END
GO
exec [dbo].[my_procedure] 'DOMAIN\test5','param'</pre>
<pre><span style="color: #ff0000;">Msg 6522, Level 16, State 1, Procedure my_procedure, Line 7
A .NET Framework error occurred during execution of user defined routine or aggregate 'ExecuteSQL':
System.Data.SqlClient.SqlException: Transaction context in use by another session.</span></pre>
<p>La soluzione è più semplice del previsto: poichè SQL Server tenta implicitamente di costruire una transazione distribuita, il workaround è quello di inibire a priori tale possibilità attraverso il parametro opzionale <strong>Enlist</strong> nella connectionstring. E infatti, dopo la modifica della stringa di connessione, l&#8217;esecuzione funziona come ci si aspetta, ritornando i valori aspettati.</p>
<pre>ALTER FUNCTION [dbo].[my_function](@login nvarchar(50))
RETURNS
@roles TABLE (role varchar(400), type int)
AS
BEGIN
 DECLARE @sql NVARCHAR(400)
 DECLARE @conn NVARCHAR(200)
 DECLARE @count INT

 INSERT INTO @roles (role,type)
  SELECT role,type FROM dbo.MYCACHE
  WHERE login = @login
 IF @@ROWCOUNT = 0
 BEGIN  
  SELECT @sql = 'exec dbo.MYCACHEINSERT '''+@login+'''',
   @conn = 'Data Source=MYSERVER;Initial Catalog=MYDB;Integrated Security=False;user id=dbu;password=dbu;Enlist=no'
  SELECT @count = [dbo].[ExecuteSQL] (@sql,@conn)
  
  INSERT INTO @roles (role,type)
   SELECT role,type FROM dbo.MYCACHE
   WHERE login = @login
 END  
  RETURN
END

exec [dbo].[my_procedure] 'DOMAIN\test7','param'
<span style="color: #3366ff;"><em>N M</em>
4 param</span></pre>
<p><strong>Conclusioni</strong></p>
<p>L&#8217;utilizzo di stored procedures in funzioni è inibito in SQL Server by design, ma creando una external UDF in C#.NET è possibile aggirare l&#8217;ostacolo. E&#8217;stato presentato il codice e un esempio di come implementare il caching per una funzione &#8220;lenta&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.maurodalfreddo.it/archives/328/eseguire-stored-procedures-in-una-funzione-udf-sql-server/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I Toto di nuovo in tour nell&#8217;estate 2010!</title>
		<link>http://www.maurodalfreddo.it/archives/309/toto-tour-2010</link>
		<comments>http://www.maurodalfreddo.it/archives/309/toto-tour-2010#comments</comments>
		<pubDate>Fri, 23 Apr 2010 19:11:01 +0000</pubDate>
		<dc:creator>Mauro Dalfreddo</dc:creator>
				<category><![CDATA[Musica]]></category>
		<category><![CDATA[Toto]]></category>

		<guid isPermaLink="false">http://www.maurodalfreddo.it/?p=309</guid>
		<description><![CDATA[Dopo lo scioglimento del 2008, i Toto si riformano per il tour europeo dell'estate 2010.]]></description>
			<content:encoded><![CDATA[<p>I Toto si preparano per il nuovo tour estivo europeo.</p>
<p>A fine febbraio (Feb 27th 2010) sul sito ufficiale dei TOTO è comparso il tanto atteso annuncio della réunion del gruppo californiano per un breve tour europeo.<br />
I membri storici del gruppo si stanno ritrovando per organizzare un breve tour estivo in Europa per onorare Mike Porcaro, che sta convivendo con una grave malattia neurologica, la sclerosi laterale amiotrofica o ALS, che in precedenza veniva denominata &#8220;Morbo di Lou Gehrig&#8221;.<br />
La band includerà David Paich, Steve Lukather, Steve Porcaro, Simon Phillips, Joseph Williams e il bassista Nathan East come special guest.<br />
Il tour partirà in luglio dalla Germania e toccherà Austria, Olanda, Svizzera, Danimarca e Finlandia, ma il <a href="http://www.toto99.com/tourdates/calendar/list.php" target="_blank">programma</a> è tutt&#8217;ora in fase di evoluzione e definizione.</p>
<p> </p>
<div id="attachment_314" class="wp-caption aligncenter" style="width: 369px"><img class="size-full wp-image-314  " title="Steve Luckather e Mike Porcaro nel 2005" src="http://www.maurodalfreddo.it/wp-content/uploads/2010/04/toto_mannheim5.jpg" alt="Steve Luckather e Mike Porcaro" width="359" height="450" /><p class="wp-caption-text">Steve Luckather e Mike Porcaro nel 2005</p></div>
<p> </p>
<p>E&#8217; da due anni che attendo questa notizia, da quando appresi nell&#8217;estate del 2008 che <a href="http://www.stevelukather.net/NewsView.aspx?id=758" target="_blank">Steve Lukather</a> aveva annunciato lo scioglimento della band:</p>
<p><span style="color: #339966;"><strong><em>An official announcement from Toto</em></strong></span></p>
<p><span style="color: #339966;"><em>After a 31 year career, the current line up of Toto (Steve Lukather, David Paich, Mike Porcaro, Simon Phillips, Bobby Kimball and Greg Phillinganes) have decided to go their separate ways and begin new chapters in their lives. </em></span></p>
<p><span style="color: #339966;"><em>The band&#8217;s final CD &#8220;Falling In Between&#8221; and subsequent tours around the world have been extremely successful and well received and we have probably been more active than ever in the band&#8217;s lifespan. </em></span></p>
<p><span style="color: #339966;"><em>We managed to capture the last tour on a wonderful DVD (&#8221;Falling In Between Live&#8221;) of which we are tremendously proud, and we all feel the time is right to disband and finish on a high. </em></span></p>
<p><span style="color: #339966;"><em>If it were not for our loyal fans who have stuck with us through all of the ups and downs we would not have been able to have continued for as long as we did. We would like to thank all our fans all over the world who have continued to support us and we will all be very busy with our own individual projects so we hope to see many of you in the future. </em></span></p>
<p><span style="color: #339966;"><em>Toto, July 15th 2008 </em></span></p>
<p>Steve Lukather in <a href="http://www.stevelukather.net/Article.aspx?id=55" target="_blank">un articolo </a> sul suo sito spiega poi i motivi:</p>
<p><span style="color: #339966;"><em>I would like to make a formal annoucement as I have been barraged by e-mails and speculations on various websites. The fact is yes I have left Toto. <strong>There is no more Toto</strong>. I told the guys before the last leg of our tour.</em></span></p>
<p>Me li ricordo bene quei momenti, quando appresi la notizia; per un attimo rimasi sconvolto, come paralizzato: si era sciolto il gruppo, che aveva creato e suonato la musica che mi accompagna nella vita fin dall&#8217;88 (infatti è da quando vidi ed ascoltai il video di &#8220;Pamela&#8221; che cominciai ad interessarmi della produzione musicale dei Toto).<br />
La tristezza, che mi aveva pervaso, si dissolse pian piano (e scomparì del tutto solo lo scorso febbraio 2010) dopo che capii le ragioni che spinsero Steve Lukather a prendere questa decisione.</p>
<p>Le motivazioni furono molteplici e sinteticamente queste:<br />
- i vincoli contrattuali con al casa discografica erano decaduti<br />
- la voglia di cambiare, di affrontare nuovi progetti (Il titolo del suo singolo &#8220;<em>Ever Changing Times</em>&#8221; parla chiaro)<br />
- la diversa visione del futuro e di come gestire il business, rispetto agli altri membri (es. Bobby Kimball)<br />
- ma soprattutto il fatto che David Hungate, Jeff Porcaro (mancato nel 1992), David Paich, Mike Porcaro, ovvero tutti gli altri membri fondatori della band ad uno ad uno, avevano lasciato (per motivi diversi) il gruppo; per cui Steve risultava l&#8217;unico membro fondatore nella formazione del 2008&#8230; e che quindi non si riconosceva più nel gruppo, anche se composto da ottimi elementi.</p>
<p> </p>
<div id="attachment_315" class="wp-caption aligncenter" style="width: 410px"><img class="size-full wp-image-315" title="I Toto negli anni '80" src="http://www.maurodalfreddo.it/wp-content/uploads/2010/04/toto_old.jpg" alt="I Toto negli anni '80" width="400" height="261" /><p class="wp-caption-text">I Toto negli anni &#39;80</p></div>
<p> </p>
<p><span style="color: #339966;"><em>[Steve Luckather] This was NOT the high school band of brothers that we started in the 70&#8217;s. We had a magic thing and the same sense of humour and the same views on life. Somehow that was lost. </em></span></p>
<p>Mi ricorda molto quando ho iniziato a suonare alla fine degli anni &#8216;80 in una band di amici in parrocchia, nei garages, sui primi piccoli palchi &#8230; la magia della musica, le speranze e le emozioni di quei momenti&#8230; forse è anche per questo che tengo tanto ai Toto e alla loro musica. <br />
Ma questa è un&#8217;altra storia&#8230; e dei <em>Local Heroes</em> e dei <em>Prae Testo</em> scriverò in un altro momento.</p>
<p>Spero che questo breve tour estivo in qualche modo risaldi i rapporti tra i membri dei Toto e in qualche modo li faccia ritornare a quei momenti magici di un tempo&#8230; per un&#8217;unione più duratura&#8230;<br />
La speranza è anche quella di rivederli qui in Italia; l&#8217;ultima volta è successo a Padova nell&#8217;estate del 2003, nel tour del 25^anniversario: è stato proprio uno spettacolo fantastico!</p>
<p> </p>
<div id="attachment_323" class="wp-caption aligncenter" style="width: 460px"><img class="size-full wp-image-323" title="Toto, Padova 2003" src="http://www.maurodalfreddo.it/wp-content/uploads/2010/04/toto_100-0006_IMGb.jpg" alt="Toto, Padova 2003" width="450" height="290" /><p class="wp-caption-text">Toto, Padova 2003</p></div>
<p> </p>
<p><span style="color: #3366ff;">Per chi non lo sà, il nome della band, &#8220;<em>Toto</em>&#8221; venne proposto da Jeff Porcaro negli anni &#8216;70, quasi per scherzo, ma poi, quando David Hungate, fece notare che in latino la parola toto significa &#8220;<em>totale</em>&#8220;, &#8220;<em>che comprende tutto</em>&#8220;, venne ritenuto il nome ideale per identificare il repertorio musicale della band che nella sua carriera avrebbe abbracciato a 360 gradi tutti i generi musicali.</span></p>
<p> </p>
<p> </p>
<h2>Riferimenti</h2>
<p><strong>www.toto99.com</strong>  </p>
<p><a href="http://www.toto99.com/tourdates/calendar/list.php">http://www.toto99.com/tourdates/calendar/list.php</a></p>
<p><strong>www.stevelukather.net</strong></p>
<p><a href="http://www.stevelukather.net/NewsView.aspx?id=758">http://www.stevelukather.net/NewsView.aspx?id=758</a></p>
<p><a href="http://www.stevelukather.net/Article.aspx?id=55">http://www.stevelukather.net/Article.aspx?id=55</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.maurodalfreddo.it/archives/309/toto-tour-2010/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ciao Bill</title>
		<link>http://www.maurodalfreddo.it/archives/304/ciao-bill</link>
		<comments>http://www.maurodalfreddo.it/archives/304/ciao-bill#comments</comments>
		<pubDate>Thu, 25 Mar 2010 11:55:57 +0000</pubDate>
		<dc:creator>Mauro Dalfreddo</dc:creator>
				<category><![CDATA[Ralph Supermaxieroe]]></category>

		<guid isPermaLink="false">http://www.maurodalfreddo.it/?p=304</guid>
		<description><![CDATA[Muore Robert Culp]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;"><a href="http://www.maurodalfreddo.it/wp-content/uploads/2010/03/robert_culp.jpg"></a>Ieri 24 marzo 2010 a Los Angeles, è morto Robert Culp, l&#8217;agente Bill Maxwell del ben noto telefilm &#8220;Ralph Supermaxieroe&#8221;.<br />
L&#8217;attore americano aveva 79 anni ed è deceduto per un trauma cranico riportato dopo una brutta caduta nella sua casa di Hollywood.</p>
<p><em><a href="http://www.maurodalfreddo.it/wp-content/uploads/2010/03/robert_culp.jpg"><img class="size-medium wp-image-305 " align="left" style="padding: 5px;" title="robert_culp" src="http://www.maurodalfreddo.it/wp-content/uploads/2010/03/robert_culp-300x299.jpg" alt="robert_culp" width="300" height="299" /></a>Attore atletico, aggressivo e allo stesso tempo simpatico, non ha avuto troppa fortuna nel cinema<br />
(dove esordì interpretando lo stolido fidanzato di Jane Fonda in Una domenica a New York).<br />
In tv invece ha lavorato moltissimo, passando dalle parti di intrepido eroe (Il ritorno delle spie accanto a Bill Cosby negli anni 60)  a quelle di co-eroe, appesantito dall&#8217;età e dalle frustrazioni (l&#8217;anziano agente Bill Maxwell in Ralph Supermaxieroe).<br />
Anche in ruoli decisamente antipatici, s&#8217;è rivelato incisivo. Per ben due volte è stato un avversario del tenente Colombo (tracotante, ma destinato inevitabilmente alla sconfitta).<br />
Nel 1994 ha interpretato il presidente degli Stati Uniti nel thriller &#8220;Il rapporto Pelican&#8221; con Denzel Washington e Julia Roberts.</em></p>
<p>La sua interpretazione in TGAH mi ha lasciato ed insegnato molto; mi ha colpito molto il carattere coriaceo, l&#8217;humor e la tenacia&#8230; per me è stato forse<br />
lui più super-eroe del collega in calzamaglia&#8230;</p>
<p>Ciao Bob.</p>
<p> </p>
<p><strong>Alcuni riferimenti:<br />
</strong></p>
<p><a href="http://it.wikipedia.org/wiki/Robert_Culp">http://it.wikipedia.org/wiki/Robert_Culp</a></p>
<p><a href="http://www.robertculponline.com/bio.html">http://www.robertculponline.com/bio.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.maurodalfreddo.it/archives/304/ciao-bill/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ralph è stato (s)congelato !?</title>
		<link>http://www.maurodalfreddo.it/archives/273/ralph-e-stato-scongelato</link>
		<comments>http://www.maurodalfreddo.it/archives/273/ralph-e-stato-scongelato#comments</comments>
		<pubDate>Sat, 28 Nov 2009 12:31:30 +0000</pubDate>
		<dc:creator>Mauro Dalfreddo</dc:creator>
				<category><![CDATA[Ralph Supermaxieroe]]></category>
		<category><![CDATA[The Greatest American Hero]]></category>

		<guid isPermaLink="false">http://www.maurodalfreddo.it/?p=273</guid>
		<description><![CDATA[Ci sono delle conferme sullo stop del film remake della famosa serie TV Ralph Supermaxieroe (The Greatest American Hero), ma anche numerosi segnali positivi per i fan]]></description>
			<content:encoded><![CDATA[<p><em>Ci sono delle conferme sullo stop del film remake della famosa serie TV Ralph Supermaxieroe, ma anche numerosi segnali positivi per i fan&#8230;</em></p>
<div id="attachment_294" class="wp-caption aligncenter" style="width: 385px"><img class="size-full  wp-image-294 " title="GAH Symbol" src="http://www.maurodalfreddo.it/wp-content/uploads/2009/11/gah-symbol.jpg" alt="Il simbolo di The Greatest American Hero" width="375" height="345" /><p class="wp-caption-text">Il simbolo di The Greatest American Hero</p></div>
<p>Come era facile intuire il remake del film The Greatest American Hero, l&#8217;inizio della cui produzione era stato pianificato per il luglio 2008, è stato &#8220;<em>temporaneamente congelato</em>&#8221; per motivi meramente finanziari. Il progetto doveva proprio essere a buon punto: dopo il copione ed il regista, sembra che l&#8217;attore protagonista fosse stato già individuato in Eric Christian Olsen&#8230;</p>
<p> </p>
<div id="attachment_286" class="wp-caption aligncenter" style="width: 310px"><img class="size-full wp-image-286 " title="Eric Christian Olsen e Nathan Fillion" src="http://www.maurodalfreddo.it/wp-content/uploads/2009/11/olsen_fillion.jpg" alt="olsen_fillion" width="300" height="250" /><p class="wp-caption-text">Eric Christian Olsen e Nathan Fillion</p></div>
<p style="text-align: center;"> </p>
<p>Nell&#8217;aprile 2009 Clint Morris raccontò su <a href="http://www.moviehole.net/200918628-exclusive-olsen-was-greatest-american-hero" target="_blank">MovieHole</a> che, durante un&#8217;intervista con <a href="http://www.mymovies.it/biografia/?a=55564" target="_blank"><strong>Eric Christian Olsen</strong></a> in merito al suo ruolo nel film <a href="http://www.mymovies.it/dizionario/recensione.asp?id=57760" target="_blank">&#8220;Fired Up&#8221;</a> , l&#8217;attore gli rivelò di essere stato contattato per interpretare il ruolo cinematografico di Ralph Hinkley nel nuovo film GAH.<br />
Sfortunatamente, i finanziamenti per il remake andarono a monte prima che l&#8217;attore potesse provare il leggendario costume rosso&#8230;</p>
<p><span style="color: #008000;">&#8220;Sono stato scritturato per il film&#8221;, raccontò Olsen, quando Morris suggerì che sarebbe stato perfetto per la parte.<br />
&#8220;Vi partecipai giusto dopo Fired Up&#8230; &#8216;Questo è il nostro ragazzo&#8217; dissero, ma non ebbero sufficenti finanziamenti. Si, fui scritturato, ma poichè il budget era così enorme, non poterono ottenere tutti i soldi&#8230;<br />
&#8220;Era realmente una sceneggiatura divertente, su un eroe riluttante che entra in scena con le gambe all&#8217;aria, e c&#8217;erano davvero molte scene fantastiche&#8230;<br />
&#8220;Ebbi una vampata quando seppi che dovevo lavorare con tutte queste persone. Poi ricevemmo una telefonata, proprio mentre ci stavamo accordando, per dirci che non c&#8217;erano i finanziamenti&#8230;<br />
&#8220;&#8230;Ora non sono più impegnato nel cast.<br />
&#8220;No, non ho mai ottenuto quella parte, ho potuto solo leggere il contratto, e non ho provato nessun costume!&#8221;</span></p>
<p><span style="color: #008000;">Olsen, che sta iniziando a girare il nuovo film di Jennifer Lopez &#8221;Plan B&#8221; è sicuro che impersonerà prima o poi un supereroe, anche se non sarà Ralph Hinkley:<br />
&#8220;Vedremo cosa accadrà; intanto ci sono un paio di cose che ho quasi terminato&#8221;.</span></p>
<p>Il fatto che le cose, anche se lentamente, si stiano muovendo dopo questo stop è dimostrata dal candidarsi spontaneo e pubblico di alcuni attori al ruolo chiave del remake di Ralph Supermaxieroe.</p>
<p>In un&#8217;intervista su MTV News del 28 ottobre 2009, ovvero proprio un mese fà, <a href="http://www.mymovies.it/filmografia/?a=60410" target="_blank"><strong>Nathan Fillion</strong></a>, protagionista della serie televisiva <a href="http://it.wikipedia.org/wiki/Firefly_(serie_televisiva)" target="_blank">Firefly</a> (film di fantascienza, del 2002) ed attore protagonista anche nella recente serie <a href="http://www.mymovies.it/dizionario/recensione.asp?id=60519" target="_blank">Castle</a> (2009), si candida nel ruolo del The Greatest American Hero, parlando del desiderio di apparire nel remake della vecchia serie tv.</p>
<p><span style="color: #008000;">Fillon dice: &#8220;Penso che GAH sia maturo per un ritorno. Lo so che sono canadese, ma penso che quella potrebbe essere la mia parte&#8221;.</span></p>
<p><span style="color: #008000;">Non è la prima volta che Fillion cita il ruolo; in precedenza disse a </span><a href="http://www.ifc.com/news/2009/10/nathan-fillion.php?page=2" target="_blank"><span style="color: #008000;"><strong>IFC.com</strong></span></a><span style="color: #008000;"> che il remake di GAH è sempre stato il suo sogno nel cassetto;<br />
inoltre ha anche qualche idea su come le nuove tecnologie potrebbero arricchire una nuova versione:<br />
&#8220;Utilizzando la tecnologia che abbiamo oggi a disposizione per gli effetti,<br />
e pur mantenendo la stessa idea e la stessa storia,<br />
il costume potrebbe dare il potere di cambiare e a trasformarsi in quello che è necessario: potrebbe diventare un armatura, una muta subaquea&#8230;</span></p>
<p><span style="color: #008000;">In realtà conobbi William Katt e Robert Culp sul set di Castle; sono amici del padre di un nostro produttore esecutivo. E abbiamo lo stesso stunt coordinator di The Greatest American Hero, così ogni volta che ho visto William Katt cadere volando, so che è stato il nostro buon ragazzo </span><a href="http://en.wikipedia.org/wiki/Dennis_Madalone" target="_blank"><span style="color: #008000;">Dennis [Madalone]</span></a><span style="color: #008000;">&#8230;</span></p>
<p><span style="color: #008000;">Ho appena terminato di guardare la collezione dei DVD di GAH e ho pensato che abbia avuto davvero una grande regia, e ripenso al tipo di incongruenze e piccole imprecisioni: per esempio il nome del personaggio principale cambiò un paio di volte.<br />
Sembra che GHA abbia sofferto lo stesso tipo di bistrattamento che subì Firefly nei vari episodi (episodi mostrati fuori ordine, mai per più di 2 settimane consecutive, e la serie interrotta per vari motivi)</span></p>
<p><span style="color: #008000;">A Firefly fu garantita la possibilità di sfumare con una fine vaga e &#8220;ricomparire&#8221; con l&#8217;eccellente film Serenity. Ma per GAH non c&#8217;e&#8217; stata questa fortuna&#8230;</span></p>
<p><em>♫ Flying away on a wing and a prayer, ♪ Who could it be? ♫ Believe it or not, it&#8217;s just&#8230;Nathan Fillion</em></p>
<p>Certo Fillon è fisionomicamente differente da William Katt e dalla bionditudine di Olsen, ma non è detto che nel remake si debbano conservare completamente tutti gli aspetti e le caratteristiche del personaggio Ralph, che tutti conosciamo; forse avrebbe più senso creare una certa rottura con la serie televisiva, reinventando parzialmente i personaggi o la trama, giusto per creare novità ed interesse, ma soprattutto per evitare l&#8217;effetto <em>brutta copia</em>, evitando così di rovinare il bel ricordo dei fan.</p>
<p> </p>
<div id="attachment_296" class="wp-caption aligncenter" style="width: 310px"><img class="size-full wp-image-296" title="robert-culp-maxwell" src="http://www.maurodalfreddo.it/wp-content/uploads/2009/11/robert-culp-maxwell.jpg" alt="Bill Maxwell (Robert Culp)" width="300" height="297" /><p class="wp-caption-text">Il grande Bill Maxwell (Robert Culp)</p></div>
<p>Rimane comunque una domanda: chi interpretarà il <strong>Bill Maxwell</strong> del grande Robert Culp? Senza l&#8217;uomo giusto, il remake non otterrebbe sicuramente il successo&#8230;</p>
<p> </p>
<div id="attachment_287" class="wp-caption aligncenter" style="width: 410px"><img class="size-full wp-image-287" title="TGAH Web series" src="http://www.maurodalfreddo.it/wp-content/uploads/2009/11/gah_webseries.jpg" alt="TGAH Web series" width="400" height="160" /><p class="wp-caption-text">TGAH Web series</p></div>
<p>Dopo una lunga attesa  (il clip di intro era effettivamente accattivante), ecco è venuta alla luce a fine luglio 2009  la <strong>Serie Web di The Greatest American Hero</strong>, e gli episodi (i cosiddetti Webisodes), finora 6 della durata di poco più di 5 minuti, sono visibili su <a href="http://www.staytunedtv.net/showvideo.php?sid=18" target="_blank"><strong>StayTunedTV.net</strong></a>, un sito ideato per connettere autori, registi, sceneggiatori ed attori e a promuovere il loro lavoro. </p>
<p>Questi episodi sono filmati semiseri, sicuramente irriverenti, nei quali gli alieni affiancano ai due nostri eroi (Allen Rueckert, Don Stark) una nuova eroina bionda (Brittany Ross) dal costume rosso&#8230; In realtà Ralph aveva dovuto cedere il costume già nel 1986 a Holly Hathaway la <a href="http://www.superheroeslives.com/originals/the_greatest_american_heroine_(1986).htm" target="_blank">Greatest American Heroine</a>  in uno spinoff della serie mai mandato in onda da NBC.</p>
<p>Possono piacere o no, ma sicuramente fanno sorridere&#8230;.</p>
<p> </p>
<div id="attachment_292" class="wp-caption aligncenter" style="width: 410px"><a href="http://www.maurodalfreddo.it/wp-content/uploads/2009/11/gah_comicbooks800b.jpg"><img class="size-full wp-image-292" title="GAH Comic books" src="http://www.maurodalfreddo.it/wp-content/uploads/2009/11/gah_comicbooks400.jpg" alt="I tre Comic books pubblicati" width="400" height="300" /></a><p class="wp-caption-text">I tre Comic books pubblicati</p></div>
<p>Sul fronte <strong>ComicBooks</strong> sono stati pubblicati quest&#8217;anno i 3 fumetti promessi, anche se con qualche ritardo rispetto alle date schedulate. Dopo qualche ricerca, sono riuscito a procurarmi delle copie su ebay direttamente da William Katt (alias <a href="http://myworld.ebay.it/catastrophic_comics2/" target="_blank">catastrofic_comics2</a> ), debitamente dedicate e autografate da lui (Ralph) stesso!! E per una strana coincidenza me le sono incredibilmente viste recapitare proprio il giorno del mio compleanno: proprio un bellissimo regalo!</p>
<p>La storia  descritta in questi primi tre numeri è assolutamente ispirata alle prime due puntate della serie TV (ritroviam le teste rasate, il compagno di Bill morto e resuscitato dagli alieni, l&#8217;astronave, il costrume, il primo volo&#8230;) raccontata in chiave moderna nel presente (tecnologia cellulare, moderni pc portatili, il nuovo presidente USA Obama&#8230;).  Alcune eccezionali battute di Maxwell, in slang americano, sono proprio nel suo stile!</p>
<p>Bisogna leggere i fumetti ovviamente con spirito critico, e non credendo di ritrovare la copia cartacea della serie TV. Tutto sommato, alla fine è una cosa bella e simpatica&#8230;</p>
<p> </p>
<p style="text-align: center;"> <img class="size-full wp-image-298 aligncenter" title="tgah_ship" src="http://www.maurodalfreddo.it/wp-content/uploads/2009/11/tgah_ship.jpg" alt="tgah_ship" width="300" height="239" /></p>
<p>Quindi possiamo dire che ci sono,  seppur tristi conferme dello stop del progetto, ma anche numerosi segnali che qualcosa si sta muovendo &#8230;</p>
<p>Bisogna crederci! Insomma&#8230; <em>Believe It Or Not</em> &#8230;</p>
<p> </p>
<p><strong>Alcuni riferimenti</strong></p>
<p><a href="http://www.moviehole.net/200918628-exclusive-olsen-was-greatest-american-hero">http://www.moviehole.net/200918628-exclusive-olsen-was-greatest-american-hero</a></p>
<p><a href="http://www.imdb.com/news/ni1136032/">http://www.imdb.com/news/ni1136032/</a></p>
<p><a href="http://www.comicbookmovie.com/fansites/rorschachsrants/news/?a=11366">http://www.comicbookmovie.com/fansites/rorschachsrants/news/?a=11366</a></p>
<p><a href="http://www.reelzchannel.com/movie-news/4916/nathan-fillion-wants-to-be-the-greatest-american-hero">http://www.reelzchannel.com/movie-news/4916/nathan-fillion-wants-to-be-the-greatest-american-hero</a></p>
<p><a href="http://en.wikipedia.org/wiki/The_Greatest_American_Hero">http://en.wikipedia.org/wiki/The_Greatest_American_Hero</a></p>
<p><a href="http://www.superheroeslives.com/originals/the_greatest_american_heroine_(1986).htm">http://www.superheroeslives.com/originals/the_greatest_american_heroine_(1986).htm</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.maurodalfreddo.it/archives/273/ralph-e-stato-scongelato/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web Application Stress Tool anche su XP</title>
		<link>http://www.maurodalfreddo.it/archives/249/web-application-stress-tool-anche-su-xp</link>
		<comments>http://www.maurodalfreddo.it/archives/249/web-application-stress-tool-anche-su-xp#comments</comments>
		<pubDate>Tue, 15 Sep 2009 09:34:11 +0000</pubDate>
		<dc:creator>Mauro Dalfreddo</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Hack]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://www.maurodalfreddo.it/?p=249</guid>
		<description><![CDATA[Hack: come attivare tutte le funzionalità di Microsoft Web Application Stress Tool su XP e Vista]]></description>
			<content:encoded><![CDATA[<p><em>Un hack : come attivare tutte le funzionalità di WAST su XP e Vista</em></p>
<p>Sviluppare ed implementare un sito o un&#8217;applicazione web è un processo creativo che può essere più o meno interessante e quindi più o meno divertente&#8230;</p>
<p>E quando finisce il divertimento cominciano i grattacapi! Sicuramente qualcuno nel management o il cliente che ha commissionato il progetto o forse noi stessi vorremmo conoscere quantitativamente le sue prestazioni, in termini di tempi di risposta in funzione del numero di utenti.</p>
<p>Infine potremo arrivare a determinare la capacità del sito, ovvero il numero massimo di richieste/sec aventi tempi di risposta decenti (ovvero prima il numero di utenti appena prima del degrado/collasso del sistema)</p>
<p><img class="aligncenter size-full wp-image-265" title="Load test" src="http://www.maurodalfreddo.it/wp-content/uploads/2009/09/grafico.jpg" alt="Load test" width="493" height="202" /></p>
<p>Quindi dopo aver sviluppato e pubblicato un sito o una web application conviene affrontare l&#8217;annoso problema dei test di carico e della simulazione realistica delle navigazioni degli utenti per:</p>
<ul>
<li>vedere  come si comporta il sistema</li>
<li> se sussitono colli di bottiglia, aree o sottosistemi dove è possibile ottimizzare qualcosa </li>
<li>dove è meglio iniziare ad effettuare il cosiddetto tuning.</li>
</ul>
<p>Allo scopo si possono trovare vari tools commerciali e opensource.<br />
E&#8217; possibile trovare una lista abbastanza esaustiva dei software all&#8217;url <a href="http://www.softwareqatest.com/qatweb1.html">http://www.softwareqatest.com/qatweb1.html</a>.</p>
<p>Nell&#8217;ultima esperienza personale, non avendo (mai) molto tempo a disposizione mi sono concentrato su alcuni software grafici e interfacciabili con i sistemi Windows Server:<br />
- l&#8217;ottimo ma assi costoso <a href="http://www.neotys.com" target="_blank">Neoload</a>, che permette di controllare e verificare graficamente  tutte le fasi del processo dal design alla fase di test e l&#8217;analisi dei risultati<br />
- gratuitamente in casa Microsoft si trovano WCAT (Web Capacity Analysis Tool), largamente programmabile ma solo tramite script,<br />
e WAST (<a href="http://www.iis.net/downloads/default.aspx?tabid=34&amp;g=6&amp;i=1298" target="_blank">Web Application Stress Tool &#8211; Homer </a>), il ben noto ma vetusto tool grafico.</p>
<p>WAST (o WAS) è uno strumento di simulazione e di carico sviluppato e rilasciato molti anni or sono da Microsoft, ma è un piccolo gioiellino, poichè permette di controllare e verificare graficamente tutte le fasi del processodi test:</p>
<ul>
<li>la registrazione visuale della navigazione effettuata con il browser</li>
<li>la creazione dei profili delle pagine di test</li>
<li>la definizione degli utenti</li>
<li>la distribuzione delle tipologie di test</li>
<li>la definizione del pool di macchine che partecipano al test di carico</li>
<li>la definizione dei contatori (performance counter) delle macchine oggetto di test</li>
<li>la gestione del test vero e proprio, ovvero lo stress del sito o dell&#8217;applicazione web</li>
<li>la collezione e l&#8217;elaborazione dei risultati, anche se in forma testuale.</li>
</ul>
<p>Purtroppo WAST è supportato ufficialmente solo su Microsoft Windows NT 4.0 SP 4+ e Microsoft Windows 2000, sistemi operativi che ormai non esistono (quasi) più negli ambiti di produzione.</p>
<p>L&#8217;installazione su Windows XP và praticamente sempre a buon fine, ed eseguendo WAST si possono sperimentare da subito le varie funzionalità tranne due:</p>
<ul>
<li>non funzionano performance counter</li>
<li>non funziona la comunicazione con i client del pool</li>
</ul>
<p>Su Windows Vista invece si ottiene da subito un errore (<a href=" http://weblogs.asp.net/steveschofield/archive/2007/03/10/iis7-post-32-web-application-stress-tool-on-vista.aspx" target="_blank">Steve Schofield Weblog &#8211; WAST on Vista </a>), ma basta caricare il file msvcp50.DLL in c:\windows\system32 (poiché non è compreso di default nel SO).</p>
<p>Vista l&#8217;indubbia utilità dell&#8217;applicazione, mi sono intestardito nel far funzionare WAST anche sui SO più recenti&#8230;e alla fine, dopo un po&#8217; di analisi e troubleshooting ci sono riuscito.</p>
<p><strong>Performance counters</strong></p>
<p>Per far funzionare la finestra di ricerca e di aggiunta dei performance counters delle macchine remote, nonchè il polling dei valori a runtime, basta copiare nella directory del programma il file <strong>pdh.dll</strong>, che si trova nella distribuzione di Windows 2000, e che è infatti la libreria che contiene le funzioni per i contatori.</p>
<p>Sicuramente WAS è stato compilato nel 2000 utilizzando quella versione di libreria (5.0.2174.1), mentre su XP c&#8217;e&#8217; quella nuova (5.1.2600.3536)</p>
<p style="text-align: center;"><a href="http://www.maurodalfreddo.it/wp-content/uploads/2009/09/wast_xp_perf_counters.jpg" target="_blank"><img class="aligncenter size-medium wp-image-258" title="Abilitare le funzionalità relative ai performance counter" src="http://www.maurodalfreddo.it/wp-content/uploads/2009/09/wast_xp_perf_counters-300x178.jpg" alt="Abilitare le funzionalità relative ai performance counter" width="300" height="178" /></a></p>
<p><strong>Clients</strong></p>
<p>Bisogna tenere presente che WAST è un tool client/server: l&#8217;interfaccia client (hclient.exe) colloquia localmente e/o remotamente (con tecnologia DCOM) con un windows service (webtool.exe); inoltre i dati sono resi persistenti su un database access.</p>
<p>Per far funzionare la comunicazione con i client definiti nel pool bisogna quindi  &#8220;giocare&#8221; con i pemessi DCOM (dcomcnfg.exe).</p>
<p>Si deve ricordare inoltre che, la comunicazione ed in generale i sistemi Microsoft prima del SP2 di Windows XP non erano securizzati di default, e quindi, per far funzionare il nostro WAST su XP, bisogna &#8220;rilassare&#8221; un pochino la sicurezza.</p>
<p style="text-align: center;"><a href="http://www.maurodalfreddo.it/wp-content/uploads/2009/09/wast_xp_clients.jpg" target="_blank"><img class="size-medium wp-image-257    aligncenter" title="Abilitare le funzionalità per il pool di client su WAST" src="http://www.maurodalfreddo.it/wp-content/uploads/2009/09/wast_xp_clients-300x207.jpg" alt="Abilitare le funzionalità per il pool di client su WAST" width="300" height="207" /></a></p>
<p><a href="http://www.maurodalfreddo.it/wp-content/uploads/2009/09/wast_xp_clients.jpg" target="_blank"></a></p>
<p style="text-align: left;"> Procedimento:</p>
<ol>
<li>Eseguire dcomcnfg.exe</li>
<li>Visualizzare le Proprietà di Servizi Componenti &#8211; Computer &#8211; Risorse Computer</li>
<li>Nel Tab Proprietà predefinite selezionare la casella Abilita servizi Internet COM in questo computer (che di default è deselezionato)</li>
<li>Nel Tab Protezione COM: Modificare i Limiti delle autorizzazioni di accesso abilitare per l&#8217;ACCESSO ANONIMO l&#8217;accesso remoto;<br />
Modificare i Limiti delle autorizzazioni di esecuzione e attivazione  abilitare per Everyone l&#8217;avvio remoto e l&#8217;attivazione remota</li>
<li>Entrare nel dettaglio dei componenti DCOM e aprire le Proprietà di &#8220;WebTool&#8221;: personalizzare eventualmente le ACL in modo tale che Everyone possa avviare ed attivare remotamente il componente</li>
</ol>
<p>E il gioco è fatto! Provare per credere&#8230;</p>
<p><strong>Risorse</strong></p>
<p> <a href="http://www.maurodalfreddo.it/wp-content/uploads/2009/09/WAST_XP.zip"><img style="border: 0px;" src="/img/zipico.jpg" border="0" alt="" height="32" /> DLL aggiuntive per WAST su XP</a></p>
<p><a href="http://www.maurodalfreddo.it/wp-content/uploads/2009/09/DCOM-Settings-for-WAST-on-XP.pdf"><img src="/img/pdfico.jpg" border="0" alt="" /> DCOM Settings for WAST on XP</a></p>
<p><a href="http://www.maurodalfreddo.it/wp-content/uploads/2009/09/lamincard_broli.jpg"></a></p>
<p><strong>Riferimenti</strong></p>
<p>- How To Install and Use the Web Application Stress (WAS) Tool</p>
<p><a href="http://support.microsoft.com/kb/313559/en-us">http://support.microsoft.com/kb/313559/en-us</a></p>
<p>- Introducing Microsoft Web Application Stress Tool (BY Jigesh Shah)</p>
<p><a href="http://www1bpt.bridgeport.edu/sed/projects/cs597/Fall_2002/jishah/web_application_stress.htm">http://www1bpt.bridgeport.edu/sed/projects/cs597/Fall_2002/jishah/web_application_stress.htm</a></p>
<p>- Load Testing Web Applications using Microsoft&#8217;s Web Application Stress Tool (By Rick Strahl)</p>
<p><a href="http://www.code-magazine.com/article.aspx?quickid=0001091&amp;page=1">http://www.code-magazine.com/article.aspx?quickid=0001091&amp;page=1</a></p>
<p>- Download Microsoft Web Application Stress Tool &#8211; Homer:</p>
<p><a href="http://www.iis.net/downloads/default.aspx?tabid=34&amp;g=6&amp;i=1298">http://www.iis.net/downloads/default.aspx?tabid=34&amp;g=6&amp;i=1298</a></p>
<p>- Steve Schofield Weblog &#8211; WAST on Vista</p>
<p><a href="http://weblogs.asp.net/steveschofield/archive/2007/03/10/iis7-post-32-web-application-stress-tool-on-vista.aspx">http://weblogs.asp.net/steveschofield/archive/2007/03/10/iis7-post-32-web-application-stress-tool-on-vista.aspx</a></p>
<p>- Recentemente c&#8217;e&#8217; stato qualche problema a reperire WAST sul sito Microsoft download, per cui allego il <a href="http://www.maurodalfreddo.it/wp-content/uploads/2009/09/web_stress_tool_setup.zip">setup</a>, almeno finchè rimarrano tali problemi.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.maurodalfreddo.it/archives/249/web-application-stress-tool-anche-su-xp/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Cesare Dalfreddo</title>
		<link>http://www.maurodalfreddo.it/archives/208/cesare-dalfreddo</link>
		<comments>http://www.maurodalfreddo.it/archives/208/cesare-dalfreddo#comments</comments>
		<pubDate>Mon, 14 Sep 2009 17:00:48 +0000</pubDate>
		<dc:creator>Mauro Dalfreddo</dc:creator>
				<category><![CDATA[Pensieri]]></category>

		<guid isPermaLink="false">http://www.maurodalfreddo.it/?p=208</guid>
		<description><![CDATA[Un pensiero per mio cugino Cesare Dalfreddo (1972-2009)]]></description>
			<content:encoded><![CDATA[<div class="mceTemp">
<p><img class="size-full wp-image-207" style="border: white 10px solid;" title="Cesare Dalfreddo" src="http://www.maurodalfreddo.it/wp-content/uploads/2009/09/00_cesare_dalfreddo.jpg" alt="Cesare Dalfreddo" width="300" height="456" align="left" /></p>
<p><em>Un&#8217;immagine spesso genera nella nostra mente una miriade di pensieri e fà affiorare i ricordi assopiti&#8230; qui un pensiero ed un ricordo per mio cugino Cesare, recentemente scomparso&#8230;</em></p>
<p>Camminando per i boschi e nelle brevi escursioni estive per i sentieri di montangna la mia mente ritorna sempre a questo ritratto, donatomi da tuo padre, presente anche nella tua ultima pubblicazione <em><a title="Amico Albero - ISBN 8888422501" href="http://www.libreriauniversitaria.it/amico-albero-dalfreddo-cesare-agora/libro/9788888422503" target="_blank">Amico Albero</a></em>&#8230;</p>
<p>Da questo scatto, effettuato a tua insaputa durante un&#8217;escursione, traspare la passione per la natura, le piante e gli animali e la passione che ci metti in tutto ciò che fai, sia nel tempo libero e nella corsa campestre, sia mentre lavori nei panni di <a href="http://www.mazarol.net/cms/index.php?option=com_content&amp;view=article&amp;id=22&amp;Itemid=30" target="_blank">guida naturalistica</a>, di insegnante o organizzatore&#8230;</p>
<p>Negli ultimi anni non ci siamo incontrati spesso a causa dei reciproci impegni quotidiani e della distanza; forse abbiamo avuto più occasioni in passato da addolescenti, ma sono assai vividi in me i ricodi delle occasioni importanti che ci permettevano di ritrovarci&#8230;</p>
<p>L&#8217;ultima volta che ci siamo incontrati mi hai descritto e mostrato fieramente come stavi allevando il tuo asinello e la tua capretta,  e di come avevi recentemente seguito e curato la mostra sulla <a href="http://www.mazarol.net/cms/index.php?option=com_content&amp;view=article&amp;id=16&amp;Itemid=25" target="_blank">produzione tradizionale della calce</a>; ed io sono rimasto stupito e ammirato della tua energia e della tua forza d&#8217;animo&#8230;</p>
<p>E&#8217; da poco più di tre mesi che ci hai lasciato&#8230;. ma Cesare, cugino caro, tu sei e sarai sempre vivo nella mia mente e nel mio cuore.</p>
<p> </p>
<p> 
<a href='http://www.maurodalfreddo.it/archives/208/cesare-dalfreddo/00_cesare_dalfreddo' title='Cesare Dalfreddo'><img width="98" height="150" src="http://www.maurodalfreddo.it/wp-content/uploads/2009/09/00_cesare_dalfreddo-98x150.jpg" class="attachment-thumbnail" alt="Durante un&#039;escursione" title="Cesare Dalfreddo" /></a>
<a href='http://www.maurodalfreddo.it/archives/208/cesare-dalfreddo/02_amici_alberi' title='Amici Alberi'><img width="106" height="150" src="http://www.maurodalfreddo.it/wp-content/uploads/2009/09/02_amici_alberi-106x150.jpg" class="attachment-thumbnail" alt="il libro pubblicato postumo" title="Amici Alberi" /></a>
<a href='http://www.maurodalfreddo.it/archives/208/cesare-dalfreddo/03_laurea' title='Mia laurea'><img width="104" height="150" src="http://www.maurodalfreddo.it/wp-content/uploads/2009/09/03_laurea-104x150.jpg" class="attachment-thumbnail" alt="Cesare alla mia laurea" title="Mia laurea" /></a>
<a href='http://www.maurodalfreddo.it/archives/208/cesare-dalfreddo/01_cesare' title='Cesare Dalfreddo'><img width="150" height="117" src="http://www.maurodalfreddo.it/wp-content/uploads/2009/09/01_cesare-150x117.jpg" class="attachment-thumbnail" alt="Al lavoro come guida alpina" title="Cesare Dalfreddo" /></a>
<a href='http://www.maurodalfreddo.it/archives/208/cesare-dalfreddo/articologazzettino' title='Articolo Gazzettino'><img width="150" height="146" src="http://www.maurodalfreddo.it/wp-content/uploads/2009/09/ArticoloGazzettino-150x146.jpg" class="attachment-thumbnail" alt="" title="Articolo Gazzettino" /></a>
<a href='http://www.maurodalfreddo.it/archives/208/cesare-dalfreddo/articoloamicodelpopolo' title='Articolo Amico del Popolo'><img width="150" height="81" src="http://www.maurodalfreddo.it/wp-content/uploads/2009/09/ArticoloAmicoDelPopolo-150x81.jpg" class="attachment-thumbnail" alt="" title="Articolo Amico del Popolo" /></a>
</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.maurodalfreddo.it/archives/208/cesare-dalfreddo/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Salsa al pepe verde</title>
		<link>http://www.maurodalfreddo.it/archives/193/salsa-al-pepe-verde</link>
		<comments>http://www.maurodalfreddo.it/archives/193/salsa-al-pepe-verde#comments</comments>
		<pubDate>Sat, 09 May 2009 15:52:40 +0000</pubDate>
		<dc:creator>Mauro Dalfreddo</dc:creator>
				<category><![CDATA[Ricette]]></category>

		<guid isPermaLink="false">http://www.maurodalfreddo.it/?p=193</guid>
		<description><![CDATA[Una salsa al pepe verde che ho recentemente utilizzato sulle carni.]]></description>
			<content:encoded><![CDATA[<p>Mi piace cucinare (e poi ovviamente mangiare) cibi preparati seguendo ricette veloci, semplici ma nel contempo saporite: mentre è alquanto soggettivo prediligere piatti gustosi o delicati, viceversa il tempo è per me un fattore essenziale, non potendo dedicarne molto a questo tipo di hobby e arte.</p>
<p><img class="size-medium wp-image-196  alignleft" align="left" style="padding:5px" title="filetto_pepe_verde" src="http://www.maurodalfreddo.it/wp-content/uploads/2009/05/filetto_pepe_verde-300x214.jpg" alt="filetto_pepe_verde" width="300" height="214" />Ho sperimentato ultimamente una salsa col pepe verde (una delle tante varianti che si possono facilmente trovare), ottima sulle carni e sui filetti di carne bovina. La preparazione avviene subito dopo la cottura della carne.</p>
<p>Bisogna pestare in modo grossolano un po&#8217; di pepe verde e farlo aderire alle fette di carne, che verranno cotte sulla padella con del burro sciolto.</p>
<p>La carne cotta (circa  3 minuti per lato) e salata, deve essere temporaneamente tenuta in caldo mentre viene preparata la salsa:<br />
nella stessa padella aggiungere del brandy e farlo fiammeggiare, fino a far evaporare tutto l&#8217;alcool; unire quindi altro pepe intero e/o schiacciato, un po&#8217;di panna da cucina e un cucchiaio di senape. Far addensare pochi secondi.</p>
<p>Rimettere i filetti  in padella e lasciar insaporire per qualche istante nella salsa. Servire quindi immediatamente.</p>
<p>Fatemi sapere, se la provate, cosa ne pensate e gli eventuali possibili miglioramenti e le variazioni sul tema!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.maurodalfreddo.it/archives/193/salsa-al-pepe-verde/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Double Hop ovvero Abilitare la delegation su SqlServer</title>
		<link>http://www.maurodalfreddo.it/archives/178/double-hop-ovvero-abilitare-la-delegation-su-sqlserver</link>
		<comments>http://www.maurodalfreddo.it/archives/178/double-hop-ovvero-abilitare-la-delegation-su-sqlserver#comments</comments>
		<pubDate>Thu, 19 Mar 2009 16:14:49 +0000</pubDate>
		<dc:creator>Mauro Dalfreddo</dc:creator>
				<category><![CDATA[Active Directory]]></category>
		<category><![CDATA[Kerberos]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Delegation]]></category>
		<category><![CDATA[Impersonation]]></category>
		<category><![CDATA[SPN]]></category>

		<guid isPermaLink="false">http://www.maurodalfreddo.it/?p=178</guid>
		<description><![CDATA[Come implementare un double hop con SQL Server, ovvero implementare la delegation kerberos]]></description>
			<content:encoded><![CDATA[<p style="TEXT-ALIGN: left">Dopo aver analizzato come applicare la delega in uno schema 3 tier IE-IIS/ASP.NET-SQL Server nel mio articolo precedente <a href="/archives/112/impersonate-delegate"><strong>Impersonate &amp; delegate</strong></a>, passiamo alla sua applicazione nel solo contesto SQL Server.</p>
<p style="TEXT-ALIGN: left">Applicare il paradigma della delega (delegation) a SQL Server significa permettere ad un client collegato ad un&#8217;istanza di SQL Server di connettersi implicitamente ad un&#8217;altra istanza di SQL Server inviandogli le credenziali kerberos dell&#8217;utente autenticato da Windows.  Questo paradigma, applicato a Server SQL, è chiamato <em>double hop</em>.</p>
<p><img class="alignnone size-full wp-image-187" title="kerb_09" src="http://www.maurodalfreddo.it/wp-content/uploads/2009/03/kerb_09.jpg" alt="kerb_09" width="501" height="363" /></p>
<p>Sotto delegation è proprio l&#8217;istanza di SQL Server alla quale l&#8217;utente Windows si è connesso (usando l&#8217;autenticazione integrata), che impersona quell&#8217;utente stesso nelle comunicazioni con altre istanze.  La delegation è richiesta soprattutto nelle query distribuite che utilizzano linked servers.</p>
<h2>Implementazione di un double hop</h2>
<p>Consideriamo il caso seguente: un utente si logga una workstation e che si connette (per esempio con SQL Management Studio) ad un server all&#8217;istanza di SQL Server  SQLSERVER1. L&#8217;utente vuole eseguire query distribuite anche verso un database sul linked server SQLSERVER2.</p>
<p><strong>Requisiti per il Client:</strong></p>
<ul>
<li>la login dell&#8217;utente deve essere di tipo Windows</li>
<li>tale login deve aver diritti di accesso su SQLSERVER1 e SQLSERVER2.</li>
<li>in Active Directory,  bisogna verificare che la proprietà &#8221;Account is sensitive and cannot be delegated&#8221; non deve essere selezionata.</li>
<li>il computer client deve utilizzare per connettersi al DB il protocollo TCP/IP o named pipes.</li>
</ul>
<p><strong>Requisiti per il primo serverSQLSERVER1</strong> (o in generale per i server intermedi):</p>
<ul>
<li>deve essere stato registrato l&#8217;SPN per il server.</li>
<li>l&#8217;account col quale viene eseguito SQL deve essere &#8220;trusted for delegation&#8221;.</li>
<li>il server deve utilizzare il protocollo TCP/IP o named pipes.</li>
<li>il secondo server, SQLSERVER2,  deve essere aggiunto come linked server. Può essere fatto anche eseguendo la stored procedure sp_addlinkedserver:</li>
</ul>
<pre>EXEC sp_addlinkedserver 'SQLSERVER2', N'SQL Server'</pre>
<ul>
<li>il linked server deve essere configurato per effettuare il self mapping sulle login interessate (cioè deve essere passato il contesto di sicurezza della login connessa). Si può usare la stored procedure sp_addlinkedsrvlogin:</li>
</ul>
<pre>EXEC sp_addlinkedsrvlogin 'SQLSERVER2', 'true'</pre>
<p>La finestra delle proprietà di sicurezza del linked server dovrà essere simile alla seguente figura:</p>
<p style="TEXT-ALIGN: center"><a href="http://www.maurodalfreddo.it/wp-content/uploads/2009/03/kerb_10.jpg" target="_blank"><img class="size-medium wp-image-184 aligncenter" title="kerb_10" src="http://www.maurodalfreddo.it/wp-content/uploads/2009/03/kerb_10-280x300.jpg" alt="kerb_10" width="280" height="300" /></a></p>
<p>Sotto riporto un utile script da me creato ed utilizzato nella creazione e nella verifica dei linked server utilizzati negli hop.</p>
<p> </p>
<p><strong>Requisiti per il secondo server SQLSERVER2:</strong></p>
<ul>
<li>Se viene utilizzato il protocollo TCP/IP, bisogna registrare un SPN  in AD.</li>
<li>il server deve utilizzare il protocollo TCP/IP o named pipes.</li>
</ul>
<p> </p>
<pre><span style="color: #008000;">DECLARE @sname as nvarchar(50)
SET @sname ='SERVER2' -- Il nome del linked server</span></pre>
<pre><span style="color: #008000;">
-- Se il linkedsrv esiste ià, viene droppato
IF  EXISTS (SELECT srv.name FROM sys.servers srv
WHERE srv.server_id != 0 AND srv.name = @sname)
EXEC master.dbo.sp_dropserver @server=@sname, @droplogins='droplogins'
IF  EXISTS (SELECT srv.name FROM sys.servers srv
WHERE srv.server_id != 0 AND srv.name = @sname)
EXEC master.dbo.sp_dropserver @server=@sname, @droplogins='droplogins'</span></pre>
<pre><span style="color: #008000;">
DECLARE @providerstr as varchar(255)
SET @providerstr= 'DRIVER={SQL Server};SERVER='+ @sname +
';Integrated Security=SSPI;'</span></pre>
<pre><span style="color: #008000;">
-- Creazione del Linked server
EXEC sp_addlinkedserver  
  @server=@sname,   
  @srvproduct='',    
  @provider='SQLNCLI',   
  @datasrc=@sname, 
  @provstr= @providerstr </span></pre>
<pre><span style="color: #008000;">
EXEC sp_addlinkedsrvlogin @sname, 'true'</span></pre>
<pre><span style="color: #008000;">
-- Verifica se viene utilizzato il self mapping
SELECT uses_self_credential as delegation , S.name
FROM sys.linked_logins as L, sys.servers as S
WHERE S.server_id=L.server_id and S.name=@sname</span></pre>
<pre><span style="color: #008000;">
-- Esecuzione di una query distribuita
-- (bisogna avere i diritti sul secondo server)
EXECUTE('select * from '+@sname+'.master.dbo.sysdatabases')</span></pre>
<pre><span style="color: #008000;">
-- La prossima query deve restituire:
-- net_transport=TCP e auth_scheme=KERBEROS
SELECT net_transport, auth_scheme
FROM sys.dm_exec_connections
WHERE session_id=@@spid</span></pre>
<pre><span style="color: #008000;">
-- La prossima query deve elencare il linked server creato
SELECT * FROM sys.servers where name=@sname
</span></pre>
<p> </p>
<h2>Contesti di applicazione simili</h2>
<p>Lo schema della delegation può facilmente essere implenmentato per gli altri servizi SQL come Analysis Services, Reporting Services ed Integration Services; bisogna solamente fare attenzione alla fase di registrazione dell&#8217;SPN e ai diritti da applicate agli user account ed ai computer account coinvolti.</p>
<p>Per esempio per quanto riguarda Analysis Services l&#8217;SPN che deve essere registrato è del tipo:</p>
<pre>Setspn.exe -A MSOLAPSvc.3/Fqdn:InstanceName OLAP_Service_Account</pre>
<p> </p>
<h2>Riferimenti</h2>
<p>MSDN &#8211; <a href="http://msdn.microsoft.com/en-us/library/ms175537.aspx" target="_blank">Security for Linked Servers</a> , <a href="http://msdn.microsoft.com/en-us/library/ms189580.aspx" target="_blank">Configuring Linked Servers for Delegation</a></p>
<p>Microsoft &#8211; <a href="http://support.microsoft.com/kb/917409/en-us" target="_blank">How to configure SQL Server 2005 Analysis Services to use Kerberos authentication</a></p>
<p>MS Technet &#8211; <a href="http://blogs.technet.com/askds/archive/2008/06/13/understanding-kerberos-double-hop.aspx" target="_self">Understanding Kerberos Double Hop</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.maurodalfreddo.it/archives/178/double-hop-ovvero-abilitare-la-delegation-su-sqlserver/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Impersonate &amp; delegate</title>
		<link>http://www.maurodalfreddo.it/archives/112/impersonate-delegate</link>
		<comments>http://www.maurodalfreddo.it/archives/112/impersonate-delegate#comments</comments>
		<pubDate>Fri, 13 Mar 2009 15:55:46 +0000</pubDate>
		<dc:creator>Mauro Dalfreddo</dc:creator>
				<category><![CDATA[Active Directory]]></category>
		<category><![CDATA[Kerberos]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Windows Autentication]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Delegation]]></category>
		<category><![CDATA[IIS]]></category>
		<category><![CDATA[Impersonation]]></category>
		<category><![CDATA[integrated authentication]]></category>
		<category><![CDATA[Internet Explorer]]></category>
		<category><![CDATA[NTLM]]></category>
		<category><![CDATA[security context]]></category>
		<category><![CDATA[SPN]]></category>
		<category><![CDATA[trusted connection]]></category>

		<guid isPermaLink="false">http://www.maurodalfreddo.it/?p=112</guid>
		<description><![CDATA[Implementare la delegation: come il security context di un utente può essere veicolato a partire dal client, per il middle tier fino al backend server con l'aiuto di Kerberos.]]></description>
			<content:encoded><![CDATA[<p>Finalmente trovo un po&#8217; di tempo per continuare la trattazione iniziata in un mio articolo precedente dei <a title="Motivi per veicolare il contesto utente fino al database" href="http://www.maurodalfreddo.it/archives/59"><strong>Motivi per veicolare il contesto utente fino al database</strong></a>, e a questo rimando dando per scontati alcuni argomenti.</p>
<p>Sono già stati evidenziati i benefici e le caratteristiche dell&#8217;utilizzo dell&#8217;autenticazione integrata e del contesto utente anche fino all&#8217;ultimo livello applicativo (tier). E&#8217; stata poi spiegata la configurazione da  utilizzare in un&#8217;archiettura a 3-tier (IE-IIS-SQL) tutta implementata in un unica macchina (single server).</p>
<p>Per capire come il security context di un utente possa essere veicolato esternamente ad un server da un servizio ad un altro,  bisogna comprendere i protocolli di autenticazione utilizzati.</p>
<p style="text-align: center;"><img class="size-full wp-image-131 aligncenter" title="kerb_00" src="http://www.maurodalfreddo.it/wp-content/uploads/2009/03/kerb_00.jpg" alt="kerb_00" width="325" height="87" /></p>
<p style="text-align: center;"><a href="http://www.maurodalfreddo.it/wp-content/uploads/2009/03/kerb_00.jpg"></a></p>
<p><strong></strong></p>
<h2>NTLM e Kerberos a confronto</h2>
<p>Il protocolli di autenticazione supportati da Windows sono NTLM (NT Lan Manager, fino dalla versione 4.0)  e Kerberos (da Win 2000 in poi).  Mentre NTLM si basa su un meccanismo di  challenge/response (ovvero lo scambio di un hash criptato tra client e server), Kerberos basa la sua architettura sull&#8217;esistenza di server autenticatori (KDC, Key distribuition center), che distribuiscono tikets (cifrati e firmati e quindi affidabili) ai client per utilizzare specifici servizi.</p>
<p>I pregi di Kerberos sono:</p>
<ul>
<li>lo standard aperto, basato sull&#8217;RFC 4120</li>
<li>la maggiore velocità, poiché, diversamente da NTLM, il servizio non deve verificare la validità dell&#8217;utente/client presso un DC, ma gli basta semplicemente il ticket stesso</li>
<li>la mutua autenticazione, poichè non solo il client si autentica al servizio (come NTLM),  ma il client stesso è certo dell&#8217;identità del servizio, poichè solo quello può leggere il ticket fornito</li>
<li>supporto per il logon tramite smart card</li>
<li>supporto per la delega dell&#8217;autenticazione (Authentication delegation o Authentication forwarding): grazie a questa caratteristica un servizio può accedere ad un risorsa remota per conto di un utente.</li>
</ul>
<p>Quet&#8217;ultimo punto sta a significare che un utente A può dare diritti ad un&#8217;entità intermedia B per autenticarsi ad un terzo server C, come se<br />
l&#8217;entità B fosse l&#8217;utente A stesso. Il server C baserà le sue decisioni autorizzative sull&#8217;identità di A invece che su quella di B.</p>
<p>E&#8217; possibile iterare questo schema per più livelli applicativi distribuiti (multi-tier applications) solamente utilizzando Kerberos e non NTLM, semplicemente perchè NTLM non supporta la delegation! Quindi NTLM funziona su un&#8217;architettura a single server solo perchè il security context dell&#8217;utente viene creato alla sua connessione al primo livello sul server (dopo l&#8217;autenticazione) ed è disponibile poi per i livelli applicativi sucessivi.</p>
<p>Nell&#8217;implementazione Microsoft di Kerberos, il servizio stesso è altamente integrato con Active Directory (AD) e tutti i dati e le credenziali sono memorizzati in essa</p>
<p><span id="more-112"></span></p>
<p> </p>
<h2>Negotiate</h2>
<p>Quando è attivata l&#8217;autenticazione Kerberos, tra Internet Explorer (MSIE) e Internet Information Server (IIS) vengono scambiati alcuni pacchetti per negoziare il protocollo più sicuro (RFC 4559): viene utilizzato l&#8217;algoritmo HTTP/SPNEGO che tenta dapprima di utilizzare Kerberos (Negotiate) e in caso negativo (fallback) poi i protocolli meno sicuri come NTLM, Digest e BASIC.</p>
<p>Per capire bene il meccanismo rimando all&#8217;interesante articolo <a href="http://www.adopenstatic.com/cs/blogs/ken/archive/2006/08/02/Two-easy-_2800_easier_3F002900_-ways-to-determine-Kerberos-from-NTLM-in-a-HTTP-capture.aspx" target="_blank">Two easy ways to determine kerberos from NTLM in a HTTP capture</a> di Ken Schaefer.</p>
<p> </p>
<h2>Service Principal Names (SPN)</h2>
<p>Un <em>service principal name</em> (SPN) è il nome col quale un servizio si registra in Kerberos e anche col quale un client identifica univocamente un&#8217;istanza di un servizio. Quando un client vuole connettersi ad un servizio, ne localizza un&#8217;istanza, ne ricava un SPN, si connette al servizio e presenta l&#8217;SPN del servizio per autenticarsi.</p>
<p>Un SPN è definito nel formato <em>serviceclass/host:port/servicename</em> . Se nome e porta non sono standard devono essere specificate. Ad esempio:</p>
<p>Se il servizio si chiama  MyService ed è eseguito sul computer DCA  e usa le porte TCP o UDP  8088 ed è localizzato in AD con il nome MyS nella UO denominata CS,  nel dominio cpandl.com, allora l&#8217;SPN sarà</p>
<pre>MyService/DCA.cpandl.com:8088/CN=MyS,OU=CS,DC=cpandl,DC=com</pre>
<p>Se il server WS2003A sta erogando un servizio di desktop remoto (RDP) sulla porta standard (TCP 3389). Allora i 2 SNP associati in AD saranno semplicemente:</p>
<pre>TERMSRV/WS2003A</pre>
<pre>TERMSRV/WS2003A.cpandl.com</pre>
<p>Per registrare un SPN è possibile utilizzare l&#8217;utility <a href="http://technet.microsoft.com/en-us/library/cc773257.aspx" target="_blank">setspn.exe</a> disponibile in Windows Server 2003, Windows Server 2008 o su XP/Vista con i Windows Server 2003 Support Tools.</p>
<p>Ad esempio per aggiungere un SPN per il servizio web-IIS di Machine (il cui pool gira con l&#8217;account di dominio &#8220;domain\user&#8221;) usare:</p>
<pre> Setspn.exe -A HTTP/Machine domain\user</pre>
<pre> Setspn.exe -A HTTP/Machine.domain.com domain\user </pre>
<p>Notare che deve essere registrato due volte sia per il nome NetBios cheper il FQDN. Nel caso in cui il servizio giri con il Local System Account/Network Service usare invece:</p>
<pre> Setspn.exe -A HTTP/Machine Machine</pre>
<pre> Setspn.exe -A HTTP/Machine.domain.com Machine </pre>
<p>L&#8217;utility setspn può essere utilizzata per conoscere quali SPN siano registrati in AD:</p>
<pre>setspn -l Machine</pre>
<pre>setspn -l domain\user</pre>
<p>Rimando comunque a  <a href="http://technet.microsoft.com/en-us/library/cc755413.aspx" target="_blank">Technet</a> per ulteriori esempi, opzioni ed utilizzi di setspn.</p>
<p> </p>
<h2>Abilitare la delegation</h2>
<p>Per abilitare la delegation tra i livelli applicativi è necessario abilitarla:</p>
<ul>
<li>per l&#8217;utente che usufruisce del servizio (non deve essere <em>sensitive</em>)</li>
<li>sull&#8217;utente con cui viene eseguito il servizio</li>
<li>per il conmputer account del server</li>
</ul>
<p>Bisogna verificare che gli user accounts non siano disabilitati per la delegation:</p>
<p style="TEXT-ALIGN: center"><a href="http://www.maurodalfreddo.it/wp-content/uploads/2009/03/kerb_02.jpg"></a><img class="size-full wp-image-129 aligncenter" title="kerb_02" src="http://www.maurodalfreddo.it/wp-content/uploads/2009/03/kerb_02.jpg" alt="kerb_02" width="404" height="484" /></p>
<p style="text-align: left;">Poi  bisogna abilitare il computer account e l&#8217;user account del servizio (dopo che è stato registrato l&#8217;SPN compare il Tab sul profilo).</p>
<p style="TEXT-ALIGN: center"><img class="size-full wp-image-128 aligncenter" title="kerb_01" src="http://www.maurodalfreddo.it/wp-content/uploads/2009/03/kerb_01.jpg" alt="kerb_01" width="404" height="484" /></p>
<p>La delegation può essere abilitata per tutti i servizi o per alcuni specifici; nella figura sopra all&#8217; utente-servizio IIS è stata abilitata la delega limitatamente per le connessioni al servizio SQL Server.</p>
<p>Bisogna inoltre verificare che siano impostati i giusti rights agli utenti interessati (ovvero a quelli con cui vengono eseguiti i servizi):</p>
<ul>
<li><em>Act as part of the operating system</em> per poter impersonare l&#8217;utente</li>
<li><em>Impersonate a client after authentication</em> per ogni account che dovrà delegare le credenziali (ovvero su tutti i middle tier intermedi), come l&#8217;account IIS</li>
</ul>
<p>Tali right possono essere impostati nelle local security policy dei singoli server o in qualche GPO di AD a seconda delle policy implementate e del contesto.</p>
<p> </p>
<h2> Un comune scenario: IE &#8211; IIS (ASP.NET) &#8211; SQL</h2>
<p>La seguente figura riassume tutte le attività che devono essere fatte o verificate per abilitare la delegation in questo tipico scenario.</p>
<p><img class="alignnone size-full wp-image-135" title="kerb_03" src="http://www.maurodalfreddo.it/wp-content/uploads/2009/03/kerb_03.jpg" alt="kerb_03" width="531" height="461" /></p>
<p>A) A livello di dominio:</p>
<ul>
<li>Gli user account non devono essere sentive (Tab Account)</li>
<li>Registrare gli SPN per i servizi IIS e SQL, specificatamente agli account con cui vengono eseguiti, usando comandi simili a:</li>
</ul>
<pre>Setspn.exe -A HTTP/MachineIIS domain\userIIS</pre>
<pre>Setspn.exe -A HTTP/MachineIIS.domain.com  domain\userIIS</pre>
<pre>Setspn.exe -A MSSQLSvc/MachineSQL:1433 domain\userSQL</pre>
<pre>Setspn.exe -A MSSQLSvc/MachineSQL.domain.com:1433 domain\userSQL</pre>
<ul>
<li>L&#8217;account IIS e quello del pool Asp.net deve essere Trusted for delegation (Tab Delegation)</li>
</ul>
<p> B) Sui client Internet Explorer</p>
<ul>
<li>Enable Window Authentication</li>
<li>In Strumenti-Opzioni Internet-Protezione verificare che il server IIS (o il dominio legato al virtualhost) sia censito nell&#8217;Intranet Zone</li>
</ul>
<p>C) Web Server; nella console di IIS sul Web Server</p>
<ul>
<li>impostare a livello di Site e Virtual directory unicamente l&#8217;opzione di Autenticazione integrata. Per evitare problematiche di instabilità o di malfunzionamenti impredicibili, bisogna assicurarsi che tutte le applicazioni web (virtual directory) che si appoggiano al Pool ASP.NET (per il quale è stato registrato l&#8217;SPN) abbiano abilitata solo questa impostazione.</li>
<li> Nel web.config della web application impostare: </li>
</ul>
<pre>&lt;authentication mode="Windows"/&gt;
&lt;identity impersonate="true"/&gt;</pre>
<ul>
<li>Nel web.config della web application impostare la connection string opportunamente in modo similare:</li>
</ul>
<pre>connectionString="Server=MachineSQL;Database=MYDB;Integrated Security=True"</pre>
<p> D) Database; con SQL Server Management studio</p>
<ul>
<li>Devono essere dati i diritti opportuni agli utenti  sul database </li>
</ul>
<p> </p>
<h2>Utility e debugging</h2>
<p>Una preziosa utility che permette di visualizzare i ticket kerberos attualmente presenti sul client è <a href="http://www.microsoft.com/downloads/details.aspx?familyid=4E3A58BE-29F6-49F6-85BE-E866AF8E7A88&amp;displaylang=en" target="_self">kerbtray</a> disponibile sul sito Microsoft. da citare anche l&#8217;utility testuale <a href="http://www.microsoft.com/downloads/details.aspx?familyid=1581E6E7-7E64-4A2D-8ABA-73E909D2A7DC&amp;displaylang=en" target="_blank">klist</a> che oltre a listare permette anche di cancellare i ticket presenti.</p>
<p><img class="alignnone size-full wp-image-142" title="kerb_04" src="http://www.maurodalfreddo.it/wp-content/uploads/2009/03/kerb_04.jpg" alt="kerb_04" width="390" height="459" /></p>
<p>Per abilitare invece i logging del client kerberos nel system log e per poterli visualizzare con Event Viewer bisogna valorizzare la seguente chiave di registro:</p>
<pre>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters</pre>
<pre>Registry Value: LogLevel
Value Type: REG_DWORD
Value Data: 0x1</pre>
<p>Una volta risolti i problemi conviene eliminare tale chiave di registro, poichè il logging  influenza le performance.</p>
<p> </p>
<h2>Riferimenti</h2>
<p>IETF &#8211; <a href="http://www.ietf.org/rfc/rfc4120.txt" target="_blank">The Kerberos Network Authentication Service (V5)</a></p>
<p>IETF &#8211; <a href="http://www.ietf.org/rfc/rfc4559.txt" target="_blank">SPNEGO-based Kerberos and NTLM HTTP Authentication in Microsoft Windows</a></p>
<p>Microsoft Download - <a href="http://download.microsoft.com/download/1/e/e/1ee86ce4-8234-4aa1-94f4-a37039837729/Troubleshooting_Kerberos_Delegation.DOC" target="_blank">Troubleshooting Kerberos Delegation in Windows 2000 and Windows Server 2003</a></p>
<p>Microsoft &#8211; <a href="http://support.microsoft.com/kb/929650/en-us" target="_blank">How to use SPNs when you configure Web applications that are hosted on IIS 6.0</a></p>
<p>MSDN &#8211; <a href="http://msdn.microsoft.com/en-us/library/ms998351.aspx" target="_blank">How To: Use Impersonation and Delegation in ASP.NET 2.0</a></p>
<p>MSDN &#8211; <a href="http://msdn.microsoft.com/en-us/library/ms998355.aspx" target="_blank">How To: Use Protocol Transition and Constrained Delegation in ASP.NET 2.0</a></p>
<p>MS Technet &#8211; <a href="http://technet.microsoft.com/en-us/library/cc773257.aspx" target="_blank">Setspn Overview</a></p>
<p>Ken Shaefer &#8211; <a href="http://www.adopenstatic.com/cs/blogs/ken/archive/2006/08/02/Two-easy-_2800_easier_3F002900_-ways-to-determine-Kerberos-from-NTLM-in-a-HTTP-capture.aspx" target="_blank">Two easy (easier?) ways to determine Kerberos from NTLM in a HTTP capture</a></p>
<p> Microsoft &#8211; <a href="http://support.microsoft.com/kb/215383/en-us" target="_blank">How to configure IIS to support both the Kerberos protocol and the NTLM protocol for network authentication</a></p>
<p>Microsoft &#8211; <a href="http://support.microsoft.com/kb/907272/en-us" target="_blank">Kerberos authentication and troubleshooting delegation issues</a></p>
<p>MS Technet &#8211; <a href="http://technet.microsoft.com/en-us/library/cc786325.aspx" target="_blank">Troubleshooting Kerberos Problems</a></p>
<p>Microsoft Download &#8211; <a href="http://www.microsoft.com/downloads/details.aspx?familyid=4E3A58BE-29F6-49F6-85BE-E866AF8E7A88&amp;displaylang=en" target="_blank">Windows 2000 Resource Kit Tool: Kerbtray.exe </a></p>
<p><a href="http://www.microsoft.com/DownLoads/details.aspx?FamilyID=99b0f94f-e28a-4726-bffe-2f64ae2f59a2&amp;displaylang=en"></a></p>
<p><a href="http://technet.microsoft.com/en-us/library/cc779070.aspx"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.maurodalfreddo.it/archives/112/impersonate-delegate/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
