Obter zona de segurança atual / ativo de um aplicativo .NET?
-
04-07-2019 - |
Pergunta
Eu tenho um aplicativo que se comporta estranhamente, e apenas para verificar, eu gostaria de ver qual zona de segurança que está atualmente em execução.
Eu encontrei o enum System.Security.SecurityZone, mas não consigo encontrar nada que irá retornar qual destes eu estou correndo abaixo.
Alguém tem alguma dica?
Basicamente eu quero saber se a minha aplicação está em execução em MyComputer, Intranet, Internet, não confiável, confiável, etc.
Editar: Aqui está o menor test-app que eu escrevi para encontrar este código, graças 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;
}
}
}
}
}
Solução
Você precisa olhar para as provas CAS para a montagem atual;
this.GetType (). Assembly.Evidence
Assembly.Evidence é uma propriedade Evidence objeto . A partir desta você pode enumerar os evidências e olhar para o zona que aparece como um
Outras dicas
Em NET 3.5 você pode simplificar o código com LINQ:
Zone z = a.Evidence.OfType<Zone>().First();
De .NET 4.0 você tem um método GetHostEvidence
conveniente:
Zone z = Assembly.GetExecutingAssembly().Evidence.GetHostEvidence<Zone>();
Note que a partir de .NET classes de 4.0 evidências derivam da classe base EvidenceBase
.
HTH, György
Você também pode usar
Evidence e = Thread.CurrentThread.GetType().Assembly.Evidence;
em vez de
this.GetType().Assembly.Evidence