Si tratta di uno degli ottimi meccanismi di protezione di .NET Framework; tuttavia non si dovrebbe verificare una SecurityException in un assembly Partially Trusted (come quelli eseguiti da un drive di rete) a meno che esso non si colleghi ad assembly senza strong name o con strong name ma senza l'attributo "AllowPartiallyTrustedCallers". Questa eccezione può anche verificarsi con un assembly Partially Trusted che direttamente o indirettamente effettua chiamate a codice unmanaged. Verifica tra gli assembly a cui fai riferimento se ne compare uno o più che non rispetta questi requisiti.
In ogni caso ecco un consiglio per risolvere radicalmente il tuo problema senza compromettere la sicurezza CAS:
Primo passo: dare uno strong name ai tuoi assembly:
  • con l'utility sn (inclusa nel .NET Framework SDK) crea una nuova coppia di chiavi per firmare i tuoi assembly; nello specifico apri il prompt dei comandi nella directory in cui è contenuto sn.exe e digita sn -k nomefile.snk, dove nomefile è il nome del file che conterrà la tua nuova coppia di chiavi strong name;
  • copia il tuo file snk nella tua directory di sviluppo (di solito è qualcosa come Documenti\Visual Studio Projects) e non darlo in giro;
  • aggiungi al file assemblyinfo.vb di ogni tuo progetto di cui devi esegure il deploy su tutta la rete l'attributo <Assembly: AssemblyKeyFile("percorsocompleto\nomefile.snk")> (dove ovviamente percorsocompleto è il percorso completo della cartella in cui è contenuto il tuo file snk e nomefile.snk è il suo nome);
  • ricompila i vari progetti.

A questo punto tutti i tuoi assembly saranno dotati di uno strong name e relativa chiave pubblica.
Secondo passo: dire a .NET Framework di fidarsi del tuo Strong Name
  • Metti in rete o su un dischetto un tuo assembly con strong name;
  • su una delle tue macchine apri il tool .NET Configuration (è in Strumenti di Amministrazione);
  • nell'albero di cartelle posto nella parte sinistra della finestra spostati in Risorse del Computer\Criteri di protezione\Enterprise\Gruppi di Codice\All_code;
  • fai click di destro su All_code e seleziona "Nuovo...";
  • come nome inserisci qualcosa tipo "Assembly interni con strong name" o quello che vuoi; come descrizione metti "Dà agli assembly creati con lo strong name dell'amministratore tutti i privilegi";
  • come condizione metti "Nome sicuro", e sotto fai click su "Importa..."; con la finestra "Importa nome sicuro dall'assembly" apri l'eseguibile di un tuo progetto con strong name che avevi messo su un dischetto o in rete;
  • assicurati che nel campo "Chiave pubblica" ci siano una serie di cifre, e che le caselle Nome e Versione NON abbiano la spunta;
  • fai click su "Avanti";
  • assicurati che sia selezionato "Utilizza set di autorizzazioni esistente" e che nell'elenco a discesa sia selezionato "FullTrust";
  • fai click su "Avanti" e quindi su "Fine".

Passo tre: distribuire i nuovi settaggi su tutta la rete
  • Una volta creato il criterio di cui al passo precedente, nel .NET Configuration fai click di destro su "Criteri di protezione runtime" e seleziona "Crea package di distribuzione...";
  • assicurati che sia selezionata la casella "Enterprise" e facendo click sul pulsante "Sfoglia..." scegli il posto dove salvare il file msi che verrà creato;
  • fai click su "Avanti" e quindi su "Fine";
  • copia il file msi così creato su una cartella condivisa sul server;
  • loggato da amministratore lancia il pacchetto msi su tutti i PC su cui vorrai eseguire le tue applicazioni .NET.

Fine! A questo punto tutti i PC su cui avrai eseguito il pacchetto MSI si fideranno ciecamente di tutti gli assembly .NET firmati con il tuo strong name.
@mod: questa mi parrebbe una buona pillola...