Почему этот пример Code Access Security не работает?
Я знаю, что CAS имеет ограниченную ценность, но я все равно хочу узнать об этом.
Я не понимаю, какое поведение я вижу: CAS по умолчанию не работает вообще в моей обычной среде.
Возьмите этот пример класса:
using System;
using System.Security;
using System.Security.Permissions;
namespace CASNotWorkingExample
{
class Program
{
static void Main(string[] args)
{
FileIOPermission perm = new FileIOPermission(PermissionState.Unrestricted);
if (SecurityManager.IsGranted(perm))
Console.WriteLine("granted");
else
Console.WriteLine("denied");
Console.ReadKey();
}
}
}
Я строю это и ставлю exe, CASNotWorkingExample.exe
на другом компьютере (IP-адрес 192.168.1.101) в общей папке "ненадежный". Затем я запускаю его из командной строки без прав администратора, используя \\192.168.1.101\untrusted\CASNotWorkingExample.exe
, ожидая его возвращения "отказано". Это не; он возвращает "предоставлено".
Windows знает, что имеет дело с удаленным EXE сомнительной безопасности. Когда я запускаю ту же команду из диалогового окна "Пуск" меню "Пуск", я получаю обычное предупреждение системы безопасности "Не удалось проверить издателя. Вы уверены, что и т. Д. И т. Д.". Так что это не то, чтобы ошибочно думать, что исполняемый файл работает на локальной машине и неправильно назначает зону.
Более того, когда я смотрю на тот же самый exe-файл с помощью инструмента настройки.NET 2.0 (щелкните правой кнопкой мыши "Политика безопасности времени выполнения, выберите" Оценить сборку..."), я вижу, что.NET только назначает разрешения Internet_Zone для сборки, Эти разрешения НЕ включают FileIOPermission (изолированное хранилище является его собственным разрешением).
http://img5.imageshack.us/img5/2256/casperms.jpg
Данные, которые могут быть полезны для кого-то другого, но до сих пор не были для меня:
- Я столкнулся с этим, работая над книгой MS Press для экзамена MCTS 70-536. Глава 11 посвящена CAS; Урок 1 / Пример 1 терпит неудачу для меня, в значительной степени, как описано выше. То, что вы видите здесь, является урезанным вариантом этого.
- Я проверил, что такой EXE-файл действительно может записывать на диск, т.е. проверка IsGranted, вероятно, правильная.
- Две машины работают под управлением Vista SP1 и WinXP. Поведение одинаково независимо от того, какой клиент, а какой файловый сервер, так что это не Vista.
- Поведение идентично при работе от имени обычного непривилегированного пользователя и от имени администратора.
- Не работает в домене AD.
- То же имя пользователя и пароль на клиенте и файловом сервере, поэтому я могу получить доступ к файлу без необходимости использования
net use
предоставить полномочия.
Я уверен, что это будет один из тех "arrrgh" моментов... Чего мне не хватает?
2 ответа
Способ изменения заключается в том, что при запуске управляемого exe появляется новое свидетельство. Когда exe-файл запускается из Win32 CreateProcess API, непосредственно управляемому exe предоставляется полное доверие.
Конечно, инструмент конфигурации.net не запускает exe, а просто проверяет его. Это означает, что свидетельство отличается и влияет на назначенную ему группу кодов. Это, в свою очередь, влияет на разрешения.
Довольно запутанно.
Более подробную информацию можно найти здесь:
Я не гуру CAS, но я подозреваю, что это может быть связано с изменением в.NET 3.5 SP1, которое позволяет коду с общего сетевого ресурса работать как Full Trust.
Изменить: Брэд Абрамс утверждает, что перекомпиляция / цель не нужна, чтобы воспользоваться этим. Я бы предположил, что он работает так же в обратном направлении - при таргетинге 2.0 вы не получите прежнего поведения, если на вашей машине установлен 3.5 SP1.
Существующее приложение не нужно перекомпилировать или изменять каким-либо образом, чтобы воспользоваться этим. Ваши текущие приложения 2.0 будут просто работать, вам не нужно нацеливать что-то новое в 3.5..
Я предполагаю, что новая установка (VM) только с 2.0 FX может быть в состоянии устранить это как причину.