Получить текущую/активную зону безопасности приложения .NET?

StackOverflow https://stackoverflow.com/questions/239463

Вопрос

У меня есть приложение, которое ведет себя странно, и просто для проверки я хотел бы посмотреть, в какой зоне безопасности оно сейчас работает.

Я нашел перечисление 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top