2008-10-07 5 views
3

J'ai une application écrite en C# se trouvant sur un partage réseau. Quand je l'exécute à partir d'un lecteur local, tout fonctionne bien. Lorsque je le lance à partir du partage distant, appelleSecurityException levée lorsque l'application démarre à partir du dossier distant

try 
{ 
    System.Reflection.Assembly.GetExecutingAssembly(); 
    System.IO.Directory.GetCurrentDirectory(); 
} 

lancer une exception SecurityException 'Request failed'.

Quelle en est la cause, quelle est la différence entre une application démarrée localement et celle démarrée à partir d'un emplacement distant?

Répondre

5

Ceci est dû à CAS; code démarré à partir de la machine locale a beaucoup plus de confiance que le code dans l'intranet, qui à son tour a plus de confiance que le code de l'Internet. IIRC, avec le dernier SP (3.5SP1?) Si est mappé le partage (c'est-à-dire si F :) il est approuvé; sinon vous devrez soit:

a: appliquer un caspol changement à tous les clients (yeuck)

b: utiliser ClickOnce pour déployer l'application, et exécutez le .Application au lieu

(youpi!) Le fait est que ClickOnce vous permet de signer l'application et d'énoncer votre politique de sécurité (même si vous exigez une confiance totale). Etant donné que votre application est en cours de démarrage sur un lecteur partagé, différentes stratégies de sécurité d'exécution s'appliquent.

+0

Merci! L'application ne devrait être utilisée que d'un ou deux clients sur le réseau, donc je pense que je vais utiliser l'approche caspol. Je ne sais pas si je devrais considérer est un bug, ou une fonctionnalité ... – Treb

+0

Microsoft considère comme une fonctionnalité. Le reste d'entre nous le considérons comme un PITA. –

+0

@MarcGravell - cela semble similaire à ma question ici: http://stackoverflow.com/questions/8308312/assembly-loaded-using-assembly-loadfrom-on-remote-machine-causes-securityexcep.Cela vous dérangerait-il de le regarder et de répondre là-bas si c'est le même problème, et puisque ClickOnce n'est pas une option dans mon cas, s'il y a des moyens par programme pour faire confiance au partage réseau? Merci! –

2

Cela implique d'apprendre comment la sécurité .NET Code Access fonctionne.

http://msdn.microsoft.com/en-us/library/aa302422.aspx

Une solution rapide et sale consiste à aller à la configuration .NET Framework, dépliez RunTime la politique de sécurité, se dérouler la machine, puis Groupes de code, puis LocalIntranet Zone, faites un clic droit dessus, choisissez Propriétés, puis le changement Autorisation définie sur FullTrust.

Cela permettra aux applications dans la zone intranet (y compris l'application qui s'exécute depuis le réseau partagé) de s'exécuter en toute confiance.

Ce n'est certainement pas la manière recommandée de faire. Le mieux serait d'apprendre comment .NET Code Access Security fonctionne et d'appliquer une politique de sécurité spécifique en fonction des besoins de votre application. Par exemple, vous pouvez donner un nom fort à votre application en la signant, en définissant un nouveau groupe de code avec la clé publique et en appliquant une autorisation de confiance complète sur ce groupe de codes. Vous pouvez ensuite signer toute application "approuvée" avec cette même clé publique. La même stratégie de sécurité d'accès au code s'applique donc.

1

Ils ont changé cela dans une certaine mesure dans .Net Framework 3.5 SP1. Voir .NET 3.5 SP1 Runs Managed Applications From Network Shares

+0

Merci pour le pourboire! Maintenant, tout ce que je dois faire est de convaincre notre administrateur système de passer à SP1. (Eh bien, peut-être convertir l'application en code Delphi non managé serait plus rapide ... * soupir *) – Treb

Questions connexes