Получить текущую/активную зону безопасности приложения .NET?
-
04-07-2019 - |
Вопрос
У меня есть приложение, которое ведет себя странно, и просто для проверки я хотел бы посмотреть, в какой зоне безопасности оно сейчас работает.
Я нашел перечисление System.Security.SecurityZone, но не могу найти ничего, что бы возвращало, под каким из них я работаю.
Есть ли у кого-нибудь советы?
По сути, я хочу узнать, работает ли мое приложение в «Моем компьютере», «Интранете», «Интернете», «Ненадежном», «Доверенном» и т. д.
Редактировать: Вот небольшое тестовое приложение, которое я написал, чтобы найти этот код, благодаря @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;
}
}
}
}
}
Решение
Вам необходимо просмотреть свидетельства CAS для текущей сборки;
this.GetType().Assembly.Evidence
Сборка.Доказательства является собственностью Доказательство объект.Из этого вы можете перечислить доказательства и найдите зону, которая отображается как элемент <System.Security.Policy.Zone>.
Другие советы
В .NET 3.5 вы можете упростить код с помощью LINQ:
Zone z = a.Evidence.OfType<Zone>().First();
Начиная с .NET 4.0 у вас есть удобный GetHostEvidence
метод:
Zone z = Assembly.GetExecutingAssembly().Evidence.GetHostEvidence<Zone>();
Обратите внимание, что классы свидетельств .NET 4.0 происходят от EvidenceBase
базовый класс.
ХТХ, Дьёрдь
Вы также можете использовать
Evidence e = Thread.CurrentThread.GetType().Assembly.Evidence;
вместо
this.GetType().Assembly.Evidence