Не удается скопировать файл с соответствующими разрешениями с помощью FileIOPermission

Этот фрагмент работает хорошо, если я пытаюсь писать в пользовательском каталоге, но как только я пытаюсь писать в 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;
}

person teebot    schedule 01.10.2008    source источник
comment
При повторной генерации исключения просто используйте throw; - бросить с; уничтожит трассировку стека.   -  person Mark Brackett    schedule 02.10.2008


Ответы (4)


Если вы работаете под Vista, то система просто перенаправляет записи в папку с программными файлами, это делается для того, чтобы старые программы, сохраняющие свою конфигурацию в программной директории, продолжали работать, когда пользователь не является администратором (или включен UAC).

Все, что вам нужно сделать, это добавить в вашу программу манифест, указывающий требуемый уровень доступа, после чего система предположит, что ваша программа поддерживает Vista, и отключит все эти исправления совместимости.

Вы можете увидеть пример файла манифеста в моем блоге по адресу:

http://www.nbdtech.com/blog/archive/2008/06/16/The-Application-Manifest-Needed-for-XP-and-Vista-Style-File.aspx

(основное внимание в статье уделяется получению правильной версии общих элементов управления, но также присутствуют декларации безопасности Vista)

person Nir    schedule 01.10.2008

Не пишите в папку Program Files.

Это большое нет-нет, и это особенно вызовет проблемы, когда наступит день, когда ваш код будет работать в Vista или на машине в компании, где пользователи получают только стандартную безопасность, а не права администратора. Вместо этого используйте папку Application Data.

person Joel Coehoorn    schedule 01.10.2008

Вы работаете на Висте? Если да, то вы можете столкнуться с виртуализацией файловой системы. Это функция 32-битных версий Vista, которая позволяет обычному пользователю записывать в защищенные части файловой системы. Это прокладка, введенная для уменьшения боли функций LUA в Vista.

Краткая версия заключается в том, что операционная система создаст виртуальную файловую систему для определенных защищенных корней (например, программных файлов). Когда не-администратор попытается написать в него, вместо оригинала будет создана отредактированная копия. Когда ваша учетная запись пользователя попытается просмотреть файл, она увидит редактирование. Другие учетные записи пользователей увидят только оригинал.

Более длинная версия: http://thelazyadmin.com/blogs/thelazyadmin/archive/2007/04/26/file-system-virtualization.aspx

person JaredPar    schedule 01.10.2008

Защита доступа для кода предоставляет или запрещает доступ к вашему коду. Его нельзя использовать для переопределения разрешений, предоставленных или запрещенных текущему пользователю.

person Joe    schedule 01.10.2008