2008-10-27 11 views
6

Tengo una aplicación que se comporta de manera extraña, y solo para verificar, me gustaría ver en qué zona de seguridad se está ejecutando actualmente.¿Obtiene la zona de seguridad actual/activa de una aplicación .NET?

He encontrado el System.Security.SecurityZone enum, pero parece que no puedo encontrar nada que me indique con cuál de estos me estoy ejecutando.

¿Alguien tiene alguna sugerencia?

Básicamente quiero saber si mi aplicación se ejecuta en Mi PC, Intranet, Internet, no es de confianza, de confianza, etc.


Editar: Aquí está la prueba de aplicación menor que escribí para encontrar este código, gracias a @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; 
       } 
      } 
     } 
    } 
} 

Respuesta

6

Debe mirar la evidencia de CAS para el ensamblaje actual;

this.GetType(). Assembly.Evidence

Assembly.Evidence es un Evidence objeto propiedad. Desde aquí puede enumerate the evidence y buscar la zona que aparece como elemento <System.Security.Policy.Zone>.

+0

Niceness, gracias, voy a pegar el código final aquí para referencia futura. –

+0

De nada. Por supuesto, en la vida real no tendrías que hacer esto, estarías haciendo demandas de CAS y actuando en consecuencia :) – blowdart

-2

También puede utilizar

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

en lugar de

this.GetType().Assembly.Evidence 
+1

'Thread.CurrentThread.GetType()' devuelve la misma instancia 'Type' que' typeof (Thread) ' , por lo que está recuperando pruebas para el ensamblado de la clase 'Thread' (' mscorlib'), no para el ensamblado del desarrollador. – BACON

3

En .NET 3.5 se puede simplificar el código con LINQ:

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

De .NET 4.0 tiene una conveniente método GetHostEvidence:

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

Tenga en cuenta que las clases de evidencia de .NET 4.0 derivan de la clase base EvidenceBase.

HTH, György

Cuestiones relacionadas