Не удается скопировать файл с соответствующими разрешениями с помощью FileIOPermission
-
03-07-2019 - |
Вопрос
Этот фрагмент работает хорошо, если я пытаюсь выполнить запись в каталоге пользователя, но как только я пытаюсь выполнить запись в Program Files, он просто выполняется беззвучно, и файл не был скопирован (без исключения).Если я попытаюсь скопировать файл в C: \ или в C:\Windows, я поймаю исключение UnauthorizedAccessException.
Знаете ли вы другой способ получить разрешения на запись в этот каталог или заставить его работать по-другому?
Любая помощь очень ценится!Спасибо
using(FileStream fs=File.Open(source, FileMode.Open)){ }
try
{
FileIOPermission fp = new FileIOPermission(FileIOPermissionAccess.Write,
AccessControlActions.Change, "C:\\Program Files\\MyPath");
fp.Demand(); //<-- no exception but file is not copied
File.Copy("C:\\Users\\teebot\\Documents\\File.xml","C:\\Program Files\\MyPath\\File.xml",true);
}
catch(SecurityExceptions)
{
throw(s);
}
catch(UnauthorizedAccessException unauthroizedException)
{
throw unauthroizedException;
}
Решение
Если вы работаете под управлением Vista, то система просто перенаправляет записи в папку program files, это делается для того, чтобы старые программы, сохраняющие свою конфигурацию в каталоге Program, продолжали работать, когда пользователь не является администратором (или включен UAC).
Все, что вам нужно сделать, это добавить в вашу программу манифест, в котором указывается требуемый уровень доступа, затем система предположит, что ваша программа поддерживает Vista, и отключит все эти исправления совместимости.
Вы можете увидеть пример файла манифеста в моем блоге по адресу:
(основное внимание в этом сообщении уделяется получению правильной версии общих элементов управления, но объявления безопасности Vista также присутствуют)
Другие советы
Не записывайте в папку Program Files.
Это большой запрет, и он особенно вызовет проблемы, когда наступит день, когда ваш код будет запущен в Vista или на компьютере в компании, где пользователи получают только стандартную защиту, а не права администратора.Вместо этого используйте папку данных приложения.
Вы работаете под управлением Vista?Если это так, то, возможно, вы столкнулись с виртуализацией файловой системы.Это функция 32-разрядных версий Vista, которая позволяет обычному пользователю выполнять запись в защищенные части файловой системы.Это прокладка, введенная для уменьшения проблем с функциями LUA Vista.
Короткая версия заключается в том, что операционная система создаст виртуальную файловую систему для определенных защищенных корневых файлов (таких как программные файлы).Когда пользователь, не являющийся администратором, попытается выполнить запись в него, вместо оригинала будет создана отредактированная копия.Когда ваша учетная запись пользователя попытается просмотреть файл, она увидит правку. Другие учетные записи пользователей увидят только оригинал.
Более Длинная версия: http://thelazyadmin.com/blogs/thelazyadmin/archive/2007/04/26/file-system-virtualization.aspx
Code access security предоставляет или отклоняет разрешения для вашего код.Его нельзя использовать для переопределения разрешений, которые предоставлены / отклонены текущему пользователю.