2008-10-27 30 views
6

J'ai une application qui se comporte bizarrement, et juste pour vérifier, j'aimerais voir dans quelle zone de sécurité il s'exécute actuellement.Récupère la zone de sécurité active/actuelle d'une application .NET?

J'ai trouvé l'énumération System.Security.SecurityZone, mais je n'arrive pas à trouver quoi que ce soit qui retournera lequel de ceux-ci je cours.

Quelqu'un a-t-il des conseils?

Fondamentalement, je veux savoir si ma demande est en cours d'exécution dans MyComputer, Intranet, Internet, non fiable, de confiance, etc.


Edit: Voici le test app mineur je l'ai écrit pour trouver ce code, grâce à @blowdart.

using System; 
using System.Reflection; 

namespace zone_check 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine(".NET version: " + Environment.Version); 
      foreach (Object ev in Assembly.GetExecutingAssembly().Evidence) 
      { 
       if (ev is System.Security.Policy.Zone) 
       { 
        System.Security.Policy.Zone zone = (System.Security.Policy.Zone)ev; 
        Console.WriteLine("Security zone: " + zone.SecurityZone); 
        break; 
       } 
      } 
     } 
    } 
} 

Répondre

6

Vous devez consulter la preuve CAS pour l'assemblage actuel;

this.GetType(). Assembly.Evidence

Assembly.Evidence est une propriété objet Evidence. À partir de cela, vous pouvez enumerate the evidence et rechercher la zone qui apparaît sous la forme d'un élément <System.Security.Policy.Zone>.

+0

Niceness, merci, je vais coller le code final ici pour référence ultérieure. –

+0

De rien. Bien sûr, dans la vie réelle, vous n'auriez pas à faire cela, vous feriez des demandes CAS et agir en conséquence :) – blowdart

-2

Vous pouvez également utiliser

Evidence e = Thread.CurrentThread.GetType().Assembly.Evidence; 

au lieu de

this.GetType().Assembly.Evidence 
+1

'Thread.CurrentThread.GetType()' retourne la même instance 'Type' que' typeof (Thread) ' , donc vous récupérez des preuves pour l'assemblage de la classe 'Thread' (' mscorlib'), pas l'assemblage du développeur. – BACON

3

Dans .NET 3.5 vous pouvez simplifier le code avec LINQ:

Zone z = a.Evidence.OfType<Zone>().First(); 

De .NET 4.0 vous avez un pratique GetHostEvidence méthode:

Zone z = Assembly.GetExecutingAssembly().Evidence.GetHostEvidence<Zone>(); 

Notez qu'à partir de .NET 4.0, les classes de preuves dérivent de la classe de base EvidenceBase.

HTH, György